2013年發(fā)布至今, Docker 一直廣受矚目,被認為可能會改變軟件行業(yè)。
但是,許多人并不清楚 Docker 到底是什么,要解決什么問題,好處又在哪里?今天就來詳細解釋,幫助大家理解它,還帶有簡單易懂的實例,教你如何將它用于日常開發(fā)并用其部署微服務(wù)。
一. Docker簡介
Docker是一個開源的容器引擎,它有助于更快地交付應(yīng)用。 Docker可將應(yīng)用程序和基礎(chǔ)設(shè)施層隔離,并且能將基礎(chǔ)設(shè)施當作程序一樣進行管理。使用 Docker可更快地打包、測試以及部署應(yīng)用程序,并可以縮短從編寫到部署運行代碼的周期。
Docker的優(yōu)點如下:
1. 簡化程序
Docker 讓開發(fā)者可以打包他們的應(yīng)用以及依賴包到一個可移植的容器中,然后發(fā)布到任何流行的 Linux 機器上,便可以實現(xiàn)虛擬化。Docker改變了虛擬化的方式,使開發(fā)者可以直接將自己的成果放入Docker中進行管理。方便快捷已經(jīng)是 Docker的最大優(yōu)勢,過去需要用數(shù)天乃至數(shù)周的 任務(wù),在Docker容器的處理下,只需要數(shù)秒就能完成。
2. 避免選擇恐懼癥
如果你有選擇恐懼癥,還是資深患者。Docker 幫你 打包你的糾結(jié)!比如 Docker 鏡像;Docker 鏡像中包含了運行環(huán)境和配置,所以 Docker 可以簡化部署多種應(yīng)用實例工作。比如 Web 應(yīng)用、后臺應(yīng)用、數(shù)據(jù)庫應(yīng)用、大數(shù)據(jù)應(yīng)用比如 Hadoop 集群、消息隊列等等都可以打包成一個鏡像部署。
3. 節(jié)省開支
一方面,云計算時代到來,使開發(fā)者不必為了追求效果而配置高額的硬件,Docker 改變了高性能必然高價格的思維定勢。Docker 與云的結(jié)合,讓云空間得到更充分的利用。不僅解決了硬件管理的問題,也改變了虛擬化的方式。
二. Docker架構(gòu)
Docker daemon( Docker守護進程)
Docker daemon是一個運行在宿主機( DOCKER-HOST)的后臺進程??赏ㄟ^ Docker客戶端與之通信。
Client( Docker客戶端)
Docker客戶端是 Docker的用戶界面,它可以接受用戶命令和配置標識,并與 Docker daemon通信。圖中, docker build等都是 Docker的相關(guān)命令。
Images( Docker鏡像)
Docker鏡像是一個只讀模板,它包含創(chuàng)建 Docker容器的說明。它和系統(tǒng)安裝光盤有點像,使用系統(tǒng)安裝光盤可以安裝系統(tǒng),同理,使用Docker鏡像可以運行 Docker鏡像中的程序。
Container(容器)
容器是鏡像的可運行實例。鏡像和容器的關(guān)系有點類似于面向?qū)ο笾校惡蛯ο蟮年P(guān)系。可通過 Docker API或者 CLI命令來啟停、移動、刪除容器。
Registry
Docker Registry是一個集中存儲與分發(fā)鏡像的服務(wù)。構(gòu)建完 Docker鏡像后,就可在當前宿主機上運行。但如果想要在其他機器上運行這個鏡像,就需要手動復(fù)制。此時可借助 Docker Registry來避免鏡像的手動復(fù)制。
一個 Docker Registry可包含多個 Docker倉庫,每個倉庫可包含多個鏡像標簽,每個標簽對應(yīng)一個 Docker鏡像。這跟 Maven的倉庫有點類似,如果把 Docker Registry比作 Maven倉庫的話,那么 Docker倉庫就可理解為某jar包的路徑,而鏡像標簽則可理解為jar包的版本號。
三. Docker安裝
Docker 是一個開源的商業(yè)產(chǎn)品,有兩個版本:社區(qū)版(Community Edition,縮寫為 CE)和企業(yè)版(Enterprise Edition,縮寫為 EE)。企業(yè)版包含了一些收費服務(wù),個人開發(fā)者一般用不到。下面的介紹都針對社區(qū)版。
Docker CE 的安裝請參考官方文檔。以下列出不同操作系統(tǒng)的安裝方法
- Mac
- indows
- Ubuntu
- Debian
- CentOS
- Fedora
- 其他 Linux 發(fā)行版
我們這里以CentOS為例:
1、Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。
通過 uname -r 命令查看你當前的內(nèi)核版本
2、使用 root 權(quán)限登錄 Centos。確保 yum 包更新到最新。
3、卸載舊版本(如果安裝過舊版本的話)
# yum remove docker docker-common docker-selinux docker-engine
4、安裝需要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅(qū)動依賴的
# yum install -y yum-utils device-mapper-persistent-data lvm2
5、設(shè)置yum源
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
6、可以查看所有倉庫中所有docker版本,并選擇特定版本安裝
# yum list docker-ce --showduplicates | sort -r
7、安裝docker
# sudo yum install -y docker-ce #由于repo中默認只開啟stable倉庫,故這里安裝的是最新穩(wěn)定版18.03.1
8、啟動并加入開機啟動
# systemctl start docker
# systemctl enable docker
9、驗證安裝是否成功(有client和service兩部分表示docker安裝啟動都成功了)
10、卸載docker
# yum -y remove docker-engine
四. Docker常用命令
(一) .鏡像相關(guān)命令
1、搜索鏡像
可使用 docker search命令搜索存放在 Docker Hub(這是docker官方提供的存放所有docker鏡像軟件的地方,類似maven的中央倉庫)中的鏡像。執(zhí)行該命令后, Docker就會在Docker Hub中搜索含有 java這個關(guān)鍵詞的鏡像倉庫。
以上列表包含五列,含義如下:
- NAME:鏡像倉庫名稱。
- DESCRIPTION:鏡像倉庫描述。
- STARS:鏡像倉庫收藏數(shù),表示該鏡像倉庫的受歡迎程度,類似于 GitHub的 stars0
- OFFICAL:表示是否為官方倉庫,該列標記為[0K]的鏡像均由各軟件的官方項目組創(chuàng)建和維護。
- AUTOMATED:表示是否是自動構(gòu)建的鏡像倉庫。
注意:使用docker查找或下載鏡像可能會超時,所以我們需要為docker配置國內(nèi)的鏡像加速器
我們可以借助阿里云的鏡像加速器,登錄阿里云(https://cr.console.aliyun.com/#/accelerator )
可以看到鏡像加速地址如下圖:
查看有沒有 daemon.json。這是docker默認的配置文件。
如果沒有新建,如果有,則修改。
# vim daemon.json
{
"registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]
}
保存退出并重啟docker服務(wù)
2、下載鏡像
使用命令docker pull命令即可從 Docker Registry上下載鏡像,執(zhí)行該命令后,Docker會從 Docker Hub中的 java倉庫下載最新版本的 Java鏡像。如果要下載指定版本則在java后面加冒號指定版本,例如:docker pull java:8
3、列出鏡像
使用 docker images命令即可列出已下載的鏡像
以上列表含義如下
- REPOSITORY:鏡像所屬倉庫名稱。
- TAG:鏡像標簽。默認是 latest,表示最新。
- IMAGE ID:鏡像 ID,表示鏡像唯一標識。
- CREATED:鏡像創(chuàng)建時間。
- SIZE: 鏡像大小。
4、刪除本地鏡像
使用 docker rmi命令即可刪除指定鏡像
(二) .容器相關(guān)命令
1、新建并啟動容器
使用以下docker run <鏡像名>命令即可新建并啟動一個容器,該命令是最常用的命令,它有很多選項,下面將列舉一些常用的選項。
# docker run -d -p 91:80 nginx
這樣就能啟動一個 Nginx容器。在本例中,為 docker run添加了兩個參數(shù),含義如下:
- -d 后臺運行
- -p 宿主機端口:容器端口 #開放容器端口到宿主機端口
訪問http://Docker宿主機 IP:91/,將會看到nginx的主界面如下:
需要注意的是,使用 docker run命令創(chuàng)建容器時,會先檢查本地是否存在指定鏡像。如果本地不存在該名稱的鏡像, Docker就會自動從 Docker Hub下載鏡像并啟動一個 Docker容器。
該命令還有一個網(wǎng)絡(luò)配置參數(shù),如下所示
- --net選項:指定網(wǎng)絡(luò)模式,該選項有以下可選參數(shù):
- --net=bridge:默認選項,表示連接到默認的網(wǎng)橋。
- --net=host:容器使用宿主機的網(wǎng)絡(luò)。
- --net=container:NAME-or-ID:告訴 Docker讓新建的容器使用已有容器的網(wǎng)絡(luò)配置。
- --net=none:不配置該容器的網(wǎng)絡(luò),用戶可自定義網(wǎng)絡(luò)配置。
2、列出容器
用 docker ps命令即可列出運行中的容器
如需列出所有容器(包括已停止的容器),可使用-a參數(shù)。該列表包含了7列,含義如下
- CONTAINER_ID:表示容器 ID。
- IMAGE:表示鏡像名稱。
- COMMAND:表示啟動容器時運行的命令。
- CREATED:表示容器的創(chuàng)建時間。
- STATUS:表示容器運行的狀態(tài)。UP表示運行中, Exited表示已停止。
- PORTS:表示容器對外的端口號。
- NAMES:表示容器名稱。該名稱默認由 Docker自動生成,也可使用 docker run命令的--name選項自行指定。
3、停止容器
使用 docker stop <容器id>命令,即可停止容器
# docker stop f0b1c8ab3633
其中f0b1c8ab3633是容器 ID,當然也可使用 docker stop容器名稱來停止指定容器
4、強制停止容器
可使用 docker kill <容器id>命令發(fā)送 SIGKILL信號來強制停止容器
# docker kill f0b1c8ab3633
5、啟動已停止的容器
使用docker run命令,即可新建并啟動一個容器。對于已停止的容器,可使用 docker start <容器id>命令來啟動
# docker start f0b1c8ab3633
6、查看容器所有信息
使用命令docker inspect <容器id>
# docker inspect f0b1c8ab3633
7、查看容器日志
使用命令docker container logs <容器id>
# docker container logs f0b1c8ab3633
8、查看容器里的進程
使用命令docker top <容器id>
# docker top f0b1c8ab3633
9、進入容器
使用docker container exec -it <容器id> /bin/bash命令用于進入一個正在運行的docker容器。如果docker run命令運行容器的時候,沒有使用-it參數(shù),就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執(zhí)行命令了
# docker container exec -it f0b1c8ab3633 /bin/bash
10、刪除容器
使用 docker rm命令即可刪除指定容器
該命令只能刪除已停止的容器,如需刪除正在運行的容器,可使用-f參數(shù)
(三) .構(gòu)建自己的docker鏡像
使用Dockerfile構(gòu)建自己的Docker鏡像
Dockerfile是一個文本文件,其中包含了若干條指令,指令描述了構(gòu)建鏡像的細節(jié)
先來編寫一個最簡單的Dockerfile,以前文下載的Nginx鏡像為例,來編寫一個Dockerfile修改該Nginx鏡像的首頁
1、新建文件夾/app,在app目錄下新建一個名為Dockerfile的文件,在里面增加如下內(nèi)容:
FROM nginx #從本地的鏡像倉庫里拉取ngxin的docker鏡像
RUN echo 'This is QingFeng Nginx!!!' > /usr/share/nginx/html/index.html #修改ngxin的docker鏡像的首頁內(nèi)容
該Dockerfile非常簡單,其中的 FORM、 RUN都是 Dockerfile的指令。 FROM指令用于指定基礎(chǔ)鏡像, RUN指令用于執(zhí)行命令。
2、在Dockerfile所在路徑執(zhí)行以下命令構(gòu)建我們自己的ngxin鏡像,構(gòu)建完可用docker images命令查看是否已生成鏡像ngxin:tuling:
# docker build -t nginx:qingfeng .
其中,-t指定鏡像名字,命令最后的點(.)表示Dockerfile文件所在路徑
3、執(zhí)行以下命令,即可使用該鏡像啟動一個 Docker容器
# docker run -d -p 92:80 nginx:qingfeng
4、訪問http://Docker宿主機IP:92/,可看到下圖所示界面,
Dockerfile的文件編寫還有如下常用指令
注意:RUN命令在 image 文件的構(gòu)建階段執(zhí)行,執(zhí)行結(jié)果都會打包進入 image 文件;CMD命令則是在容器啟動后執(zhí)行。另外,一個 Dockerfile 可以包含多個RUN命令,但是只能有一個CMD命令。
注意:指定了CMD命令以后,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令。
(四) .使用Dockerfile構(gòu)建微服務(wù)鏡像
以spring boot項目ms-eureka-server(源碼在最后)為例,該項目就是一個spring cloud eureka的微服務(wù)項目,該項目可通過spring boot的maven插件打包成可執(zhí)行的jar包運行,如下圖所示
將該項目的可執(zhí)行jar包構(gòu)建成docker鏡像:
1、將jar包上傳linux服務(wù)器/app/eureka目錄,在jar包所在目錄創(chuàng)建名為Dockerfile的文件
2、在Dockerfile中添加以下內(nèi)容
# 基于哪個鏡像
# 復(fù)制文件到容器
ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar
# 聲明需要暴露的端口
EXPOSE 8761 # 微服務(wù)項目的啟動端口
# 配置容器啟動后執(zhí)行的命令
ENTRYPOINT ["java","-jar","/app.jar"]
3、使用docker build命令構(gòu)建鏡像
# docker build -t microservice-eureka-server:0.0.1 .
# 格式: docker build -t 鏡像名稱:標簽 Dockerfile的相對位置
在這里,使用-t選項指定了鏡像的標簽。執(zhí)行該命令后,終端將會輸出如下的內(nèi)容
4、啟動鏡像,加-d可在后臺啟動
# docker run -p 8761:8761 microservice-eureka-server:0.0.1
5、訪問http://Docker宿主機IP:8761/,可正常顯示微服務(wù)Eureka Server的首頁
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。