Docker Compose 可以實現 Docker 容器叢集的編排,可以通過 docker-compose.yml 檔案,定義我們的服務及其需要的依賴,輕鬆地執行在測試、生產等環境

文件

Product manuals

Compose file version 3 reference

Docker 從入門到實踐 【中文】

安裝 Compose

Compose 依賴 Docker Engine,所有要保證環境安裝了 Docker,可參考官方教程,主要分為兩步:

  1. # 1. 下載 Compose 只執行檔案到 usr/local/bin/ 目錄
  2. # 下載失敗可以參考下一小結提供地址安裝
  3. 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
  4. # 2. 對 Compose 可執行檔案新增執行許可權
  5. sudo chmod +x /usr/local/bin/docker-compose
  6. # 輸入下面命令檢視幫助,測試安裝是否成功
  7. docker-compose -h

Compose 開源在 Docker 官方的 GitHub 倉庫:docker/compose,所有的 Compose 都會發布在倉庫的 Releases 裡,步驟1就是使用 curl 命令從 Releases 裡下載可執行檔案,uname -suname -m 可以讀取系統的核心名稱和硬體架構,用來匹配需要的 Compose 版本, curl 的 -L 引數會讓 HTTP 請求跟隨重定向(預設不跟隨),-o (小寫o) 會將伺服器響應儲存成檔案,直接下載到:usr/local/bin/ 下,檔名為:docker-compose,因為這個路徑已經在環境變數中了,所以完成步驟2,新增可執行許可權後,就可以在任意位置使用了

直接從 GitHub 下載比較慢可以通過以下地址下載:

  1. # https://vuepress.mirror.docker-practice.com/compose/install/
  2. 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
  3. 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 必須宣告

  1. # 指定版本
  2. version: "3"
  3. # 服務的集合
  4. services:
  5. # 其中一個服務,服務名為:webapp
  6. webapp:
  7. # 指定該服務使用的映象
  8. image: examples/web
  9. # 埠對映
  10. ports:
  11. - "80:80"
  12. # 資料卷
  13. volumes:
  14. - "/data"

簡單上手

在一個 Compose 中啟動 Tomcat, MySQL, redis,建立 docker-compose.yml

  1. version: "3.0"
  2. services:
  3. tomcat:
  4. container_name: mytomcat # --name
  5. image: tomcat:8.0-jre8
  6. ports:
  7. - "8080:8080"
  8. volumes:
  9. - "tomcatwebapps:/usr/local/tomcat/webapps"
  10. networks:
  11. - some_network
  12. # tomcat 服務依賴於 mysql 和 redis
  13. depends_on:
  14. - mysql
  15. - redis
  16. mysql:
  17. container_name: mysql
  18. image: mysql:5.7.32
  19. ports:
  20. - "3306:3306"
  21. volumes:
  22. - "mysqldata:/var/lib/mysql"
  23. - "mysqlconf:/etc/mysql"
  24. environment:
  25. - MYSQL_ROOT_PASSWORD=1234
  26. networks:
  27. some_network:
  28. redis:
  29. container_name: redis
  30. image: redis:5.0.10
  31. ports:
  32. - "6379:6379"
  33. volumes:
  34. - "redisdata:/data"
  35. command: "redis-server --appendonly yes"
  36. networks:
  37. some_network:
  38. # 使用到的 volumes 和 networks 必須宣告
  39. volumes:
  40. tomcatwebapps:
  41. mysqldata:
  42. mysqlconf:
  43. redisdata:
  44. networks:
  45. # 宣告名稱為 “some_network” 的網路
  46. 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 引數,就可以查詢到到對應命令的使用方法

  1. 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 再跟上子命令名稱,查詢其用法

  1. # 後臺啟動 yaml 定義的所有容器
  2. docker-compose up -d
  3. # 僅啟動 mysql 這個service,會啟動其依賴的 service
  4. docker-compose up mysql 指定啟動的server名稱,
  5. # 停止容器並移除自動建立的網橋
  6. docker-compose down
  7. # 重啟所有 service 後面可以指定上某個具體的 service
  8. docker-compose restart
  9. # 暫停 和 恢復
  10. docker-compose pause
  11. docker-compose unpause
  12. # 進入 redis 這個 service 使用 exit 退出
  13. docker-compose exec redis bash
  14. # 列出當前 yaml 中定義的容器的資訊
  15. docker-compose ps
  16. # 刪除當前 yaml 中定義的容器,需要先 stop,後面可以指定上某個具體的 service
  17. docker-compose rm
  18. # 檢視各個 service 容器內執行的程序情況
  19. docker-compose top
  20. # 檢視日誌預設檢視 yaml 所有的,可以跟上具體 service
  21. # -f 可以保持跟蹤,新的日誌會馬上顯示在螢幕上
  22. docker-compose logs

參考資料

curl 的用法指南

【程式設計不良人】Docker容器技術&Docker-Compose實戰