十分鐘學會用docker部署微服務

2013年發佈至今, Docker 一直廣受矚目,被認爲可能會改變軟件行業。html

可是,許多人並不清楚 Docker 究竟是什麼,要解決什麼問題,好處又在哪裏?今天就來詳細解釋,幫助你們理解它,還帶有簡單易懂的實例,教你如何將它用於平常開發並用其部署微服務。java

Docker簡介

Docker是一個開源的容器引擎,它有助於更快地交付應用。 Docker可將應用程序和基礎設施層隔離,而且能將基礎設施看成程序同樣進行管理。使用 Docker可更快地打包、測試以及部署應用程序,並能夠縮短從編寫到部署運行代碼的週期。linux

Docker的優勢以下:nginx

一、簡化程序spring

Docker 讓開發者能夠打包他們的應用以及依賴包到一個可移植的容器中,而後發佈到任何流行的 Linux 機器上,即可以實現虛擬化。Docker改變了虛擬化的方式,使開發者能夠直接將本身的成果放入Docker中進行管理。方便快捷已是 Docker的最大優點,過去須要用數天乃至數週的 任務,在Docker容器的處理下,只須要數秒就能完成。docker

二、避免選擇恐懼症數據庫

若是你有選擇恐懼症,仍是資深患者。Docker 幫你 打包你的糾結!好比 Docker 鏡像;Docker 鏡像中包含了運行環境和配置,因此 Docker 能夠簡化部署多種應用實例工做。好比 Web 應用、後臺應用、數據庫應用、大數據應用好比 Hadoop 集羣、消息隊列等等均可以打包成一個鏡像部署。json

三、節省開支ubuntu

一方面,雲計算時代到來,使開發者沒必要爲了追求效果而配置高額的硬件,Docker 改變了高性能必然高價格的思惟定勢。Docker 與雲的結合,讓雲空間獲得更充分的利用。不只解決了硬件管理的問題,也改變了虛擬化的方式。vim

Docker架構

  • Docker daemon( Docker守護進程)

Docker daemon是一個運行在宿主機( DOCKER-HOST)的後臺進程。可經過 Docker客戶端與之通訊。

  • Client( Docker客戶端)

Docker客戶端是 Docker的用戶界面,它能夠接受用戶命令和配置標識,並與 Docker daemon通訊。圖中, docker build等都是 Docker的相關命令。

  • Images( Docker鏡像)

Docker鏡像是一個只讀模板,它包含建立 Docker容器的說明。它和系統安裝光盤有點像,使用系統安裝光盤能夠安裝系統,同理,使用Docker鏡像能夠運行 Docker鏡像中的程序。

  • Container(容器)

容器是鏡像的可運行實例。鏡像和容器的關係有點相似於面向對象中,類和對象的關係。可經過 Docker API或者 CLI命令來啓停、移動、刪除容器。

  • Registry

Docker Registry是一個集中存儲與分發鏡像的服務。構建完 Docker鏡像後,就可在當前宿主機上運行。但若是想要在其餘機器上運行這個鏡像,就須要手動複製。此時可藉助 Docker Registry來避免鏡像的手動複製。

一個 Docker Registry可包含多個 Docker倉庫,每一個倉庫可包含多個鏡像標籤,每一個標籤對應一個 Docker鏡像。這跟 Maven的倉庫有點相似,若是把 Docker Registry比做 Maven倉庫的話,那麼 Docker倉庫就可理解爲某jar包的路徑,而鏡像標籤則可理解爲jar包的版本號。

Docker安裝

Docker 是一個開源的商業產品,有兩個版本:社區版(Community Edition,縮寫爲 CE)和企業版(Enterprise Edition,縮寫爲 EE)。企業版包含了一些收費服務,我的開發者通常用不到。下面的介紹都針對社區版。

Docker CE 的安裝請參考官方文檔。如下列出不一樣操做系統的安裝方法,直接點擊進入查看

咱們這裏以CentOS爲例:

一、Docker 要求 CentOS 系統的內核版本高於 3.10 ,查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。

經過 uname -r 命令查看你當前的內核版本

# uname -r

二、使用 root 權限登陸 Centos。確保 yum 包更新到最新。

# yum -y update

三、卸載舊版本(若是安裝過舊版本的話)

# yum remove docker docker-common docker-selinux docker-engine

四、安裝須要的軟件包, yum-util 提供yum-config-manager功能,另外兩個是devicemapper驅動依賴的

# yum install -y yum-utils device-mapper-persistent-data lvm2

五、設置yum源

# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

六、能夠查看全部倉庫中全部docker版本,並選擇特定版本安裝

# yum list docker-ce --showduplicates | sort -r

七、安裝docker

# sudo yum install -y docker-ce     #因爲repo中默認只開啓stable倉庫,故這裏安裝的是最新穩定版18.03.1

八、啓動並加入開機啓動

# systemctl start docker

# systemctl enable docker

九、驗證安裝是否成功(有client和service兩部分表示docker安裝啓動都成功了)

# docker version

十、卸載docker

# yum -y remove docker-engine

Docker經常使用命令

鏡像相關命令

一、搜索鏡像

可以使用 docker search命令搜索存放在 Docker Hub(這是docker官方提供的存放全部docker鏡像軟件的地方,相似maven的中央倉庫)中的鏡像。執行該命令後, Docker就會在Docker Hub中搜索含有 java這個關鍵詞的鏡像倉庫。

# docker search java

以上列表包含五列,含義以下:

- NAME:鏡像倉庫名稱。

- DESCRIPTION:鏡像倉庫描述。

- STARS:鏡像倉庫收藏數,表示該鏡像倉庫的受歡迎程度,相似於 GitHub的 stars0

- OFFICAL:表示是否爲官方倉庫,該列標記爲[0K]的鏡像均由各軟件的官方項目組建立和維護。

- AUTOMATED:表示是不是自動構建的鏡像倉庫。

注意:使用docker查找或下載鏡像可能會超時,因此咱們須要爲docker配置國內的鏡像加速器

咱們能夠藉助阿里雲的鏡像加速器,登陸阿里雲(https://cr.console.aliyun.com/#/accelerator)

能夠看到鏡像加速地址以下圖:

# cd /etc/docker

查看有沒有 daemon.json。這是docker默認的配置文件。

若是沒有新建,若是有,則修改。

# vim daemon.json

{

"registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]

}

保存退出並重啓docker服務

# service docker restart

二、下載鏡像

使用命令docker pull命令便可從 Docker Registry上下載鏡像,執行該命令後,Docker會從 Docker Hub中的 java倉庫下載最新版本的 Java鏡像。若是要下載指定版本則在java後面加冒號指定版本,例如:docker pull java:8

# docker pull java:8

三、列出鏡像

使用 docker images命令便可列出已下載的鏡像

# docker images

以上列表含義以下

- REPOSITORY:鏡像所屬倉庫名稱。

- TAG:鏡像標籤。默認是 latest,表示最新。

- IMAGE ID:鏡像 ID,表示鏡像惟一標識。

- CREATED:鏡像建立時間。

- SIZE: 鏡像大小。

四、刪除本地鏡像

使用 docker rmi命令便可刪除指定鏡像

# docker rmi java

容器相關命令

一、新建並啓動容器

使用如下docker run <鏡像名>命令便可新建並啓動一個容器,該命令是最經常使用的命令,它有不少選項,下面將列舉一些經常使用的選項。

# docker run -d -p 91:80 nginx

這樣就能啓動一個 Nginx容器。在本例中,爲 docker run添加了兩個參數,含義以下:

-d 後臺運行

-p 宿主機端口:容器端口     #開放容器端口到宿主機端口

訪問 http://Docker宿主機 IP:91/,將會看到nginx的主界面以下:

須要注意的是,使用 docker run命令建立容器時,會先檢查本地是否存在指定鏡像。若是本地不存在該名稱的鏡像, Docker就會自動從 Docker Hub下載鏡像並啓動一個 Docker容器。

該命令還有一個網絡配置參數,以下所示

--net選項:指定網絡模式,該選項有如下可選參數:

--net=bridge:默認選項,表示鏈接到默認的網橋。

--net=host:容器使用宿主機的網絡。

--net=container:NAME-or-ID:告訴 Docker讓新建的容器使用已有容器的網絡配置。

--net=none:不配置該容器的網絡,用戶可自定義網絡配置。

二、列出容器

用 docker ps命令便可列出運行中的容器

# docker ps

如需列出全部容器(包括已中止的容器),可以使用-a參數。該列表包含了7列,含義以下

- CONTAINER_ID:表示容器 ID。

- IMAGE:表示鏡像名稱。

- COMMAND:表示啓動容器時運行的命令。

- CREATED:表示容器的建立時間。

- STATUS:表示容器運行的狀態。UP表示運行中, Exited表示已中止。

- PORTS:表示容器對外的端口號。

- NAMES:表示容器名稱。該名稱默認由 Docker自動生成,也可以使用 docker run命令的--name選項自行指定。

三、中止容器

使用 docker stop <容器id>命令,便可中止容器

# docker stop f0b1c8ab3633

其中f0b1c8ab3633是容器 ID,固然也可以使用 docker stop容器名稱來中止指定容器

四、強制中止容器

可以使用 docker kill <容器id>命令發送 SIGKILL信號來強制中止容器

# docker kill f0b1c8ab3633

五、啓動已中止的容器

使用docker run命令,便可新建並啓動一個容器。對於已中止的容器,可以使用 docker start <容器id>命令來啓動

# docker start f0b1c8ab3633

六、查看容器全部信息

使用命令docker inspect <容器id>

# docker inspect f0b1c8ab3633

七、查看容器日誌

使用命令docker container logs <容器id>

# docker container logs f0b1c8ab3633

八、查看容器裏的進程

使用命令docker top <容器id>

# docker top f0b1c8ab3633

九、進入容器

使用docker container exec -it <容器id> /bin/bash命令用於進入一個正在運行的docker容器。若是docker run命令運行容器的時候,沒有使用-it參數,就要用這個命令進入容器。一旦進入了容器,就能夠在容器的 Shell 執行命令了

# docker container exec -it f0b1c8ab3633 /bin/bash

九、刪除容器

使用 docker rm命令便可刪除指定容器

# docker rm f0b1c8ab3633

該命令只能刪除已中止的容器,如需刪除正在運行的容器,可以使用-f參數

構建本身的docker鏡像

使用Dockerfile構建本身的Docker鏡像

Dockerfile是一個文本文件,其中包含了若干條指令,指令描述了構建鏡像的細節

先來編寫一個最簡單的Dockerfile,之前文下載的Nginx鏡像爲例,來編寫一個Dockerfile修改該Nginx鏡像的首頁

一、新建文件夾/app,在app目錄下新建一個名爲Dockerfile的文件,在裏面增長以下內容:

FROM nginx    #從本地的鏡像倉庫里拉取ngxin的docker鏡像

RUN echo 'This is QingFeng Nginx!!!' > /usr/share/nginx/html/index.html    #修改ngxin的docker鏡像的首頁內容

該Dockerfile很是簡單,其中的 FORM、 RUN都是 Dockerfile的指令。 FROM指令用於指定基礎鏡像, RUN指令用於執行命令。

二、在Dockerfile所在路徑執行如下命令構建咱們本身的ngxin鏡像,構建完可用docker images命令查看是否已生成鏡像ngxin:tuling:

# docker build -t nginx:qingfeng .

其中,-t指定鏡像名字,命令最後的點(.)表示Dockerfile文件所在路徑

三、執行如下命令,便可使用該鏡像啓動一個 Docker容器

# docker run -d -p 92:80 nginx:qingfeng

四、訪問 http://Docker宿主機IP:92/,可看到下圖所示界面,

Dockerfile的文件編寫還有以下經常使用指令

注意:RUN命令在 image 文件的構建階段執行,執行結果都會打包進入 image 文件;CMD命令則是在容器啓動後執行。另外,一個 Dockerfile 能夠包含多個RUN命令,可是隻能有一個CMD命令。

注意,指定了CMD命令之後,docker container run命令就不能附加命令了(好比前面的/bin/bash),不然它會覆蓋CMD命令。

使用Dockerfile構建微服務鏡像

以spring boot項目ms-eureka-server(源碼在最後)爲例,該項目就是一個spring cloud eureka的微服務項目,該項目可經過spring boot的maven插件打包成可執行的jar包運行,以下圖所示

將該項目的可執行jar包構建成docker鏡像:

一、將jar包上傳linux服務器/app/eureka目錄,在jar包所在目錄建立名爲Dockerfile的文件

二、在Dockerfile中添加如下內容

# 基於哪一個鏡像

From java:8

# 複製文件到容器

ADD microservice-eureka-server-0.0.1-SNAPSHOT.jar /app.jar

# 聲明須要暴露的端口

EXPOSE 8761    # 微服務項目的啓動端口

# 配置容器啓動後執行的命令

ENTRYPOINT ["java","-jar","/app.jar"]

三、使用docker build命令構建鏡像

# docker build -t microservice-eureka-server:0.0.1 .

# 格式: docker build -t 鏡像名稱:標籤 Dockerfile的相對位置

在這裏,使用-t選項指定了鏡像的標籤。執行該命令後,終端將會輸出以下的內容

四、啓動鏡像,加-d可在後臺啓動

# docker run -p 8761:8761 microservice-eureka-server:0.0.1

五、訪問http://Docker宿主機IP:8761/,可正常顯示微服務Eureka Server的首頁

 

至此,咱們就算用docker完成了微服務項目的部署,固然docker還有不少有意思的東西,好比docker compose編排微服務,kubernetes容器編排等等,想要深刻學習的同窗能夠掃下方二維碼關注微信公號"輕風吟",源碼回覆'docker微服務'獲取

相關文章
相關標籤/搜索