1. 程式人生 > >Docker Compose整合式應用組合及service編排

Docker Compose整合式應用組合及service編排

Compose簡介

Compose專案是Docker官方的開源專案,負責實現對Docker容器叢集的快速編排。其程式碼目前在 https://github.com/docker/compose 開源。
Compose定位是定義和執行多個Docker容器的應用,其前身是開源專案Fig。

使用一個Dockerfile模板檔案,可以很方便的定義一個單獨的應用容器,然而在日常工作中,經常會碰到需要多個容器相互配合來完成某項任務。例如要實現一個Web專案,除了Web伺服器本身,通常還需要後端的資料庫服務容器,甚至負載均衡容器等。

Compose恰好滿足了這樣的需求。它可以通過一個單獨的docker-compose.yml模板檔案來定義一組相關聯的應用容器專案(project)。

Compose中有兩個重要的概念:

  • 服務(service):一個應用的容器,實際上可以包含若干個執行相同映象的容器例項
  • 專案(project):由一組關聯的應用容器組成一個完整的業務單元

Compose的預設管理物件是專案,通過子命令對專案中的一組容器進行便捷的生命週期管理。
Compose專案由Python編寫,實際上呼叫了Docker服務提供的API來對容器進行管理

Compose的安裝與解除安裝

Compose可以通過Python的包管理工具pip進行安裝,也可以直接下載編譯好的二進位制檔案使用,甚至能夠直接在Docker容器中執行。
Docker for Mac,Docker for Windows自帶docker-compose二進位制檔案,安裝Docker之後可以直接使用,Linux系統需要單獨的二進位制檔案或pip進行安裝。

檢視compose的安裝版本:

docker-compose --versino

Linux下的二進位制安裝:

curl -L https://github.com/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

pip安裝:

sudo pip install -U docker-compose

Compose使用示例

應用場景:一般Web網站都會依賴第三方的提供的服務,如DB,cache,以compose編排執行dubbo-admin為例

  1. 獲取原始碼
    從github上獲取dubbo-admin的master分支原始碼
    git clone -b master https://github.com/apache/incubator-dubbo-ops.git
    
    修改admin中的application配置,把zookeeper地址改為zookeeper://zookeeper:2181
    在專案根目錄下使用maven進行打包
mvn clean package -Dmaven.test.skip=true
  1. 構建映象
    在dubbo-admin目錄下編寫Dockerfile檔案,寫入以下內容:

    FROM openjdk:8-jdk-alpine
    VOLUME /tmp
    ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
    ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"]
    

    使用以下命令構建映象

    docker build -t dubbo-admin:1.0 .
    

  2. 編寫docker-compose.yml檔案
    在專案根目錄下編寫docker-compose.yml檔案寫入以下內容

    version: '3.4'
    services:
    zk_server:
     image: zookeeper:3.4
     ports:
       - 2181:2181
    dubbo-admin:
     image: dubbo-admin:1.0
     links:
       - zk_server:zookeeper
     depends_on:
       - zk_server
     ports:
       - 7001:7001
    
  3. 執行compose專案
    在docker-compose.yml檔案所在目錄執行:

    docker-compose up
    

    在瀏覽器中訪問http://ip:7001 登入驗證,預設使用者名稱密碼:root/root,guest/guest

Compose命令說明

執行docker-compose [COMMAND] —help 或者docker-compose help [COMMAND]可以產看命令的使用幫助。
docker-compose命令的基本使用格式是:

docker-compose [-f=<arg>...][options][COMMAND][ARG...]

選項說明:
-f, —file 指定模板檔案,預設為docker-compose.yml,可以多次指定
-p, —project-name 指定專案命稱,預設使用所在目錄名稱作為專案名
—x-networking 使用Docker的可插拔網路後端特性
—x-networking-driver 指定網路後端的驅動,預設為bridge
—verbose 輸出更多除錯資訊
-v, —version 列印版本並退出

命令說明
build 格式為docker-compose build [option] [SERVIVE]
構建專案中的服務容器
可隨時在專案目錄下執行docker-compose build來重新構建服務
選項包括:
—force-rm 刪除構建過程中的臨時容器
—no-cache 構建映象過程中不使用cache
—pull 始終嘗試通過pull來獲取更新版本的映象
version 列印版本資訊,格式位:docker-compose version
config 驗證compose yml檔案的格式是否正確,若正確則顯示配置,若格式錯誤顯示錯誤原因
exec 進入指定的容器
images 累出compose yml檔案中包含的映象
logs 檢視服務容器的輸出,預設情況下,會將不同服務的輸出使用不同的顏色來區分,可以通過—no-color來關閉顏色
down 停止up命令所啟動的容器,並移除網路
help 獲得一個命令的幫助
kill 通過傳送SIGKILL訊號來強制停止伺服器容器
pause 暫停一個服務容器
port 列印某個容器埠所對映的公共埠
ps 列出專案中目前所有的容器
push 推送服務依賴的映象到Docker倉庫
pull 拉取服務依賴的映象
restart 容器專案中的服務
rm 刪除所有停止狀態的服務容器,推薦先執行docker-compose stop命令來停止容器
run 在指定服務上執行一個命令, 如:docker-compose run ubuntu ping docker.com
scale 設定指定服務執行的容器數bi,如:docker-compose scale web=3 db=2將啟動3容器執行web服務,2個容器執行db服務
start 啟動已存在的服務容器
stop 停止已存在的服務容器
top 檢視各個服務容器內執行的程序
unpause 恢復處於暫停中的服務
up 該命令會嘗試自動完成包括構建映象,建立服務,啟動服務,並關聯服務相關容器的一系列操作,連結的未被啟動的服務都將被自動啟動。
選項說明:
-d 在後臺執行服務容器
—no-color 不使用顏色來區分不同的服務的控制檯輸出
—no-deps 不啟動服務所連線的容器
—force-recreate 強制重新建立容器,不能與—no-recrate同時使用
—no-recreate 如果容器已經存在了,則不重新建立,不能與—force-recreate同時使用
—no-build 不自動構建缺失的服務映象
-t,—timeout 停止容器時的超時時間,預設為10秒

Compose模板檔案

模板檔案是Compose的核心,其涉及的指令關鍵字也比較多,大部分指令跟docker run相關的引數含義類似。預設的模板檔名稱為docker-compose.yml,格式為YAML格式。
每個服務都必須通過image指令指定映象或build指令(需要Dockerfile)等來自動構建映象。如果使用build指令,在Dockerfile中設定的選項(如:CMD,ENV 等)將會自動被獲取,無需在docker-compose.yml檔案中再次設定。

常用指令介紹

build
指定Dockerfile所在資料夾的路徑(可以是絕對路徑,也可以是相對於docker-compose.yml檔案的路徑),Compose將會利用它自動構建映象,然後使用這個映象。
使用context指令指定Dockerfile檔案所在資料夾的路徑
使用dockerfile指令指定Dockerfile的檔名
使用args令指定構建映象時的變數

version: '3'
services:
  webapp:
    build:
      context:./dir
      dockerfile:Dockerfile
      args:
        buildno:1

command
覆蓋容器啟動後預設執行的命令

command:echo "hello word"

container_name
指定容器名稱,預設會使用 專案名稱服務名稱序號 這樣的格式

devices
指定裝置對映關係

devices:
  - "/dev/ttyUSB1:/dev/ttyUSB0"

depends_on
解決容器的依賴,啟動先後的問題

dns
自定義DNS伺服器,可以是一個值,也可以是一個列表

environment
設定環境變數,可以使用陣列或字典兩種格式,指給定名稱的變數會自動獲取Compose主機上對應變數的值,可以用來防止洩露不必要的資料。

expose
暴露埠,但不對映到宿主機,只被連線的服務訪問,僅可以指定內部埠為引數。

extra_hosts
類似Docker中的—add-host引數,指定額外的host名稱對映資訊

extra_hosts:
  - "googledns:8.8.8.8"

會在啟動啟動後的服務容器中 /etc/hosts 檔案中新增“8.8.8.8 googledns”

healthcheck
通過命令檢查容器是否健康執行

image
指定映象名稱或映象ID,如果映象在本地不存在會嘗試拉取這個映象。

labels
為容器新增Docker元資料資訊,如可以新增輔助說明資訊

network_mode
設定網路模式,使用和docker run 的—network引數一樣的值

networks
配置容器連線的網路

ports
暴露埠資訊,使用 宿主埠:容器埠 的格式,只指定容器埠的時候,宿主埠會隨機對映。

volumes
資料卷掛載的路徑設定,可以設定宿主機路徑,同時支援相對路徑

ulimits
指定容器的ulimits限制值,如指定最大程序數為66635,指定檔案控制代碼數位20000(軟限制,應用可以隨時修改,不能超過硬限制)和40000(系統硬限制,只能root使用者提高)

ulimits:
  nproc:65535
  nofile:
    soft:20000
    hard:40000

entrypoint
指定服務容器啟動後執行的檔案入口

user
指定容器中執行應用的使用者名稱

working_dir
指定容器中的工作目錄

讀取變數

Compose模板檔案支援動態讀取主機的系統環境變數和當前目錄下的 .env 檔案中的變數。
如,Compose檔案將從執行它的環境中讀取${MONGO_VERSION}的值,並寫入執行命令

version:'3'
services:
  db:
    image:"mongo:${MONGO_VERSION}"

如果執行MONGO_VERSION=3.4,docker-compose up則會啟動一個mongo:3.4映象的容器
若當前目錄下存在 .env 檔案,則優先從該檔案中讀取變數的值