Docker Compose 可以實現 Docker 容器叢集的編排,可以通過 docker-compose.yml
檔案,定義我們的服務及其需要的依賴,輕鬆地執行在測試、生產等環境
文件
Compose file version 3 reference
安裝 Compose
Compose 依賴 Docker Engine,所有要保證環境安裝了 Docker,可參考官方教程,主要分為兩步:
# 1. 下載 Compose 只執行檔案到 usr/local/bin/ 目錄
# 下載失敗可以參考下一小結提供地址安裝
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 2. 對 Compose 可執行檔案新增執行許可權
sudo chmod +x /usr/local/bin/docker-compose
# 輸入下面命令檢視幫助,測試安裝是否成功
docker-compose -h
Compose 開源在 Docker 官方的 GitHub 倉庫:docker/compose,所有的 Compose 都會發布在倉庫的 Releases 裡,步驟1就是使用 curl 命令從 Releases 裡下載可執行檔案,uname -s
和uname -m
可以讀取系統的核心名稱和硬體架構,用來匹配需要的 Compose 版本, curl
的 -L 引數會讓 HTTP 請求跟隨重定向(預設不跟隨),-o (小寫o) 會將伺服器響應儲存成檔案,直接下載到:usr/local/bin/ 下,檔名為:docker-compose,因為這個路徑已經在環境變數中了,所以完成步驟2,新增可執行許可權後,就可以在任意位置使用了
直接從 GitHub 下載比較慢可以通過以下地址下載:
# https://vuepress.mirror.docker-practice.com/compose/install/
sudo curl -L https://download.fastgit.org/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
入門
Compose 的模版指令與 Docker 的 run 命令相關引數很相似,忘記了 docker 命令可以參考之前的一篇部落格:Docker 實踐及命令梳理
Compose 中有兩個重要的概念:
-
服務 (service):一個應用的容器,實際上可以包括若干執行相同映象的容器例項
-
專案 (project):由一組關聯的應用容器組成的一個完整業務單元,在
docker-compose.yml
檔案中定義
docker-compose.yml
格式如下,注意:YAML 檔案必須要鍵值之間的 :
後面必須有一個空格,縮排表示層級,要注意縮排
有使用到的 volumes 和 networks 必須宣告
# 指定版本
version: "3"
# 服務的集合
services:
# 其中一個服務,服務名為:webapp
webapp:
# 指定該服務使用的映象
image: examples/web
# 埠對映
ports:
- "80:80"
# 資料卷
volumes:
- "/data"
簡單上手
在一個 Compose 中啟動 Tomcat, MySQL, redis,建立 docker-compose.yml
version: "3.0"
services:
tomcat:
container_name: mytomcat # --name
image: tomcat:8.0-jre8
ports:
- "8080:8080"
volumes:
- "tomcatwebapps:/usr/local/tomcat/webapps"
networks:
- some_network
# tomcat 服務依賴於 mysql 和 redis
depends_on:
- mysql
- redis
mysql:
container_name: mysql
image: mysql:5.7.32
ports:
- "3306:3306"
volumes:
- "mysqldata:/var/lib/mysql"
- "mysqlconf:/etc/mysql"
environment:
- MYSQL_ROOT_PASSWORD=1234
networks:
some_network:
redis:
container_name: redis
image: redis:5.0.10
ports:
- "6379:6379"
volumes:
- "redisdata:/data"
command: "redis-server --appendonly yes"
networks:
some_network:
# 使用到的 volumes 和 networks 必須宣告
volumes:
tomcatwebapps:
mysqldata:
mysqlconf:
redisdata:
networks:
# 宣告名稱為 “some_network” 的網路
some_network:
在 docker-compose.yml
所在路徑執行 docker-compose up
啟動 Compose 專案,它會下載使用到的映象並在前臺執行列印日誌,可以使用 Ctrl + C 終止
如果需要後臺執行執行 docker-compose up -d
,這時候使用 docker ps
可以看到 Compose 已經根據 yaml 建立了相關的容器,使用 docker-compose down
停止 Compse 並移除自動建立的網橋
使用 docker network ls
檢視網路或者 docker volume ls
檢視資料卷,Compose 定義的網路或資料卷名稱格式為:docker-compose.yml所在資料夾的名稱加上下劃線再加上 yaml 中定義名稱,如果在 "dockerfile" 資料夾下建立 yaml 檔案並啟動,那麼網路名稱為:dockerfile_some_network
tomcat 服務使用了 depends_on
,表示它依賴於 redis 和 mysql 服務,Compose 將優先啟動它的依賴再啟動它
命令梳理
Docker Compose 的命令與 Dokcer 類似,可以使用 --help 引數,就可以查詢到到對應命令的使用方法
docker-compose --help
預設啟動的模版檔名為 docker-compose.yml,可以使用 -f 指定自定義的模版檔案
可以通過 config 命令,檢查模版檔案語法是否正確
docker-compse 也包含很多子命令:
啟動停止相關:up, down, restart, stop, pasue, unpause
資源相關:ps, top, kill, run
進入容器:exec
檢視日誌:logs
很多子命令都可以在後面跟上某個具體的 service 名稱,定向地操作,下面不一一舉例,
可以使用docker-compose help
再跟上子命令名稱,查詢其用法
# 後臺啟動 yaml 定義的所有容器
docker-compose up -d
# 僅啟動 mysql 這個service,會啟動其依賴的 service
docker-compose up mysql 指定啟動的server名稱,
# 停止容器並移除自動建立的網橋
docker-compose down
# 重啟所有 service 後面可以指定上某個具體的 service
docker-compose restart
# 暫停 和 恢復
docker-compose pause
docker-compose unpause
# 進入 redis 這個 service 使用 exit 退出
docker-compose exec redis bash
# 列出當前 yaml 中定義的容器的資訊
docker-compose ps
# 刪除當前 yaml 中定義的容器,需要先 stop,後面可以指定上某個具體的 service
docker-compose rm
# 檢視各個 service 容器內執行的程式情況
docker-compose top
# 檢視日誌預設檢視 yaml 所有的,可以跟上具體 service
# -f 可以保持跟蹤,新的日誌會馬上顯示在螢幕上
docker-compose logs