在前面的介紹中我們都是以單個容器為例來進行示範。但在實際的生産環境中,一個應用往往會有多個元件,并分别運作在不同的容器。在這種多容器的場景下,使用Docker用戶端進行管理會存在較大的不便利性。
基于這類場景,Docker官方提供了一個多容器的管理工具 Docker Compose。它是一個Python開發的工具,可對具有多個容器的應用進行操作,進而實作快速高效的管理。
本文将對Docker Compose相關的使用方法進行講解介紹。
一. 部署安裝
Compose作為一個獨立的工具,本身并沒有與Docker用戶端進行內建 ,需要單獨安裝。(注:在安裝之前,主機上必須先安裝好Docker引擎)
Compose的部署安裝有RPM包、二進制、腳本安裝等幾種方式,本文将示範RPM包與二進制的安裝操作。
1. RPM包安裝
- 安裝
$ yum install -y docker-compose-plugin
- 驗證程式是否正常
$ docker compose version
Docker Compose version v2.6.0
2. 二進制檔案安裝
- 下載下傳二進制檔案
$ mkdir -p /usr/local/lib/docker/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose
- 添加執行權限
$ sudo chomd +x /usr/local/lib/docker/cli-plugins/docker-compose
- 驗證程式是否正常
$ docker compose version
Docker Compose version v2.6.0
二. 模闆檔案
Docker Compose使用基于yml格式的模闆檔案來定義應用,預設的模闆檔案名稱為docker-compose.yml。
我們先來了解一下模闆的格式 ,如下是一個模闆示例,它定義了兩個應用服務。
version: "3.9"
services:
myapp:
build: ./myapp
ports:
- "80:80"
container_name: myapp
depends_on:
- database
networks:
- mynet
database:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 123456
ports:
- "3306:3306"
container_name: db
volumes:
- "mydata:/var/lib/mysql"
networks:
- mynet
networks:
mynet:
driver: bridge
volumes:
mydata:
下面我們根據模闆的各個功能參數來進行拆分講解:
version
定義了Compose檔案使用的API版本(并非Compose産品自身版本),一般建議使用最新的版本,此處使用3.9。
services
用于定義不同的應用服務,此處定義了兩個服務:web和database。Docker Compose會将每個服務部署在各自的容器中。
build
指定Dockerfile所在檔案夾的路徑(可支援絕對路徑或相對路徑),Compose 會使用它來建構鏡像,該鏡像會被用于啟動該服務的容器。
ports
指定Docker容器的端口映射到主機,該功能與docker run 啟動容器的 -p 選項一樣,格式為“主機端口:容器端口”。如果隻指定了容器端口,那麼主機端口将使用随機端口。
container_name
用于指定容器名稱,如果不指定的話,則預設會使用“目錄名+服務名+序号”這樣的格式來表示。
depends_on
指定服務間的依賴關系。如本例所示,由于myapp依賴于database服務,是以Docker Compose會先啟動database服務對應的容器,然後再進行myapp的啟動。
networks
一級的networks參數用于指定建立服務所使用的網絡,此處指定名稱為mynet,Compose會在該名稱前面再加上目錄名稱作為建立的網絡名稱,格式為“目錄名_mynet”。網絡驅動使用bridge,表明這是一個bridge網絡。
services 項中的服務使用networks用于指定加入的網絡,此處都使用mynet網絡。
image
指定服務使用的鏡像。本示例中的database服務使用mysql:5.7的鏡像,Compose會自動下載下傳該鏡像用于啟動容器。
environment
設定環境變量,該變量會在容器啟動時自動加載。如果隻指定了變量名稱,則會自動擷取Compose主機上對應變量的值,這種方式可用來防止重要資料的洩漏。
示例:
environment:
api_key:
volumes
指定容器挂載的資料卷,可以使用目錄挂載或volumes挂載。
示例:目錄挂載
volumes:
- "/data/mysql:/var/lib/mysql"
示例:volumes挂載
volumes:
- mydata:/var/lib/mysql
volumes:
mydata:
除了以上這些常用的參數外,Docker Compose還有不少其他的參數可以使用,限于篇幅原因在此不做過多介紹,有興趣的讀者可自己檢視相關資料。
三. 管理應用
Docker Compose在新的版本中,使用的指令格式與其他docker 指令類似,為“ docker compose + 選項 + [參數]”。原有的“docker-compose 指令不再使用。
1. 檢視幫助
執行"docker compose --help" 可檢視指令的詳細介紹
$ docker compose --help
......
Commands:
build Build or rebuild services
convert Converts the compose file to platform's canonical format
cp Copy files/folders between a service container and the local filesystem
create Creates containers for a service.
down Stop and remove containers, networks
events Receive real time events from containers.
exec Execute a command in a running container.
images List images used by the created containers
kill Force stop service containers.
logs View output from containers
......
2. 建構鏡像
使用docker compose build 指令可用于建構項目中鏡像,我們可以使用此指令先提前準備好相關的鏡像。否則 ,相關鏡像将在啟動服務時進行建構。
$ docker compose build
[+] Building 3.3s (2/3)
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 92B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7-alpine
......
建構完成後,我們可以看到鏡像已經生成,鏡像名稱格式為“目錄名+服務名”。
$ docker compose images
Container Repository Tag Image Id Size
myapp test_myapp latest fda100c4b2ae 51.6MB
3. 服務建立并啟動
使用docker compose up 指令可啟動docker-compose.yml 模闆檔案中定義的服務,通常會在指令後面加上 -d ,用于背景啟動。該指令會建構所需的鏡像、建立網絡和存儲卷、然後進行容器的啟動等操作。
由于前面已提前建構好myapp的鏡像,故這裡隻需要拉取database的鏡像,并建立相關的容器資源即可。
$ docker compose up -d
[+] Running 12/12
⠿ database Pulled 98.0s
⠿ 72a69066d2fe Pull complete 35.4s
⠿ 93619dbc5b36 Pull complete 35.5s
⠿ 99da31dd6142 Pull complete 35.7s
⠿ 626033c43d70 Pull complete 35.9s
⠿ 37d5d7efb64e Pull complete 35.9s
⠿ ac563158d721 Pull complete 36.8s
⠿ d2ba16033dad Pull complete 36.9s
⠿ 0ceb82207cd7 Pull complete 36.9s
⠿ 37f2405cae96 Pull complete 80.7s
⠿ e2482e017e53 Pull complete 80.7s
⠿ 70deed891d42 Pull complete 80.8s
[+] Running 4/4
⠿ Network test_mynet Created 0.2s
⠿ Volume "test_mydata" Created 0.0s
⠿ Container db Started 0.5s
⠿ Container myapp Started
檢視容器狀态,可看到服務容器已正常啟動。
docker compose ps
NAME COMMAND SERVICE STATUS PORTS
db "docker-entrypoint.s…" database running 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp
myapp "python /opt/myapp/m…" myapp running 0.0.0.0:80->80/tcp, :::80->80/tcp
4. 停止/啟動服務
使用docker compose stop/start 指令可對服務相關的容器進行停止/啟動。
停止服務
$ docker compose stop
[+] Running 2/2
⠿ Container myapp Stopped 10.2s
⠿ Container db Stopped
啟動服務
$ docker compose start
[+] Running 2/2
⠿ Container db Started 0.4s
⠿ Container myapp Started
5. 服務下線
$ docker compose down
[+] Running 3/3
⠿ Container myapp Removed 10.2s
⠿ Container db Removed 1.9s
⠿ Network test_mynet Removed