目錄
什么是 Docker Compose
Docker Compose 的功能
Docker Compose 使用場景
Docker Compose 文件(docker-compose.yml)
Docker Compose 命令清單
常見命令說明
操作案例
總結
什么是 Docker Compose
docker-compose 是 Docker 官方的開源項目,使用 python 編寫,實現上調用了 Docker 服務的 API 進行容器管理及編排,其官方定義為定義和運行多個 Docker 容器的應用。
docker-compose 中有兩個非常重要的概念 :
服務 ( service ) :一個應用的容器,實際上可以包括若干運行相同鏡像的容器實例。
項目 ( project ) :由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義 , 整個 docker-compose.yml 定義一個項目。 Compose 的默認管理對象是項目,通過子命令對項目中的一組容器進行便捷地生命周期管理。 通過 compose 可以方便的管理多個服務。

為什么要 Docker Compose
Docker 是一個輕量化的應用程序, Docker 官方推薦每個 Docker 容器中只運行一個進程 。
如果一個應用需要涉及到 MySQL 、 nginx 等環境, 那么我們需要分別為應用、數據庫和 nginx 創建單獨的 docker 容器,然后分別啟動容器。
想象一下,當我們構建好 Docker 之后,每次啟動應用,都至少需要 docker run三次, 或者寫一些腳本來實現, 這樣會比較繁瑣。
另外,這些 docker 容器都是分散獨立的,也不方便鏡像管理。那既然這些 docker容器 都是為了同一個應用服務,我們就應該把它們放到一起,這就引出了 docker-compose 來解決這類型的問題。
Docker Compose 的安裝
安裝 docker 的時候,我們默認已經安裝了 docker-compose,安裝的組件包名稱為 docker-compose-plugin ,此處不再贅述
Shell
# 檢查安裝是否成功
root@139-159-150-152:/data/myworkdir/compose# docker compose
version
Docker Compose version v2.16.0
Docker Compose 的功能
1. 使用步驟
Compose 使用的步驟:
使用 docker-compose.yml 定義構成應用程序的服務,這樣它們可以在隔離環境中一起運行。
最后,執行 docker compose up 命令來啟動并運行整個應用程序。
2. 核心功能
Compose 具有管理應用程序整個生命周期的命令:
啟動,停止和重建服務
查看正在運行的服務的狀態
流式傳輸運行服務的日志輸出
在服務上運行一次性命令
Docker Compose 使用場景
單主機部署
快速搭建一個單節點開發或者測試環境,方便使用。
不同環境隔離
通過指定 project 來運行不同的環境,實現隔離的目的。
Docker Compose 文件(docker-compose.yml)
文件基本結構及常見指令
YAML
version: "3.8" # 定義版本, 表示當前使用的 docker-compose 語法的版本
services: # 服務,可以存在多個
servicename: # 服務名字,它也是內部 bridge 網絡可以使用的 DNS name, 如果不是集群模式相當于 docker run 的時候指定的一個名稱
# 集群( Swarm )模式是多個容器的邏輯抽象
image: # 必選,鏡像的名字
command: # 可選,如果設置,則會覆蓋默認鏡像里的 CMD 命令
environment: # 可選,等價于 docker container run 里的 --env 選項設置環境變量
volumes: # 可選,等價于 docker container run 里的 -v 選項 綁定數據卷
networks: # 可選,等價于 docker container run 里的 --network 選項指定網絡
ports: # 可選,等價于 docker container run 里的 -p 選項指定端口映射
expose: # 可選,指定容器暴露的端口
build: # 構建目錄
depends_on: # 服務依賴配置
env_file: # 環境變量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#...
volumes: # 可選,等價于 docker volume create
networks: # 可選,等價于 docker network create
image
指定容器運行的鏡像。以下格式都可以:
image: redis
image: redis:5
image:
redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398
bc4b991aac7
image: library/redis
image: docker.io/library/redis
image: my_private.registry:5000/redis
command
覆蓋容器啟動的默認命令。
Shell
command: ["bundle", "exec", "thin", "-p", "3000"]
command: bundle exec thin -p 3000
entrypoint
覆蓋容器默認的 entrypoint 。
Shell
entrypoint: /code/entrypoint.sh
也可以是以下格式:
Shell
entrypoint:
- php
- -d
- zend_extension=/usr/local/lib/php/extensions/no-debug-non
zts-20100525/xdebug.so
- -d
- memory_limit=-1
- vendor/bin/phpunit
environment
添加環境變量。您可以使用數組或字典、任何布爾值,布爾值需要用引號引起來,以確保 YML 解析器不會將其轉換為 True 或 False 。
Shell
#map 語法
environment:
RACK_ENV: development
SHOW: "true"
USER_INPUT:
# 數組語法
environment:
- RACK_ENV=development
- SHOW=true
- USER_INPUT
networks
指定容器運行的網絡:
配置容器網絡
Shell
services:
frontend:
image: awesome/webapp
networks:
- front-tier
- back-tier
monitoring:
image: awesome/monitoring
networks:
- admin
backend:
image: awesome/backend
networks:
back-tier:
aliases:
- database
admin:
aliases:
- mysql
networks:
front-tier:
back-tier:
admin:
配置網絡驅動和子網信息
Shell
services:
frontend:
image: awesome/webapp
networks:
front-tier:
ipv4_address: 172.16.238.10
networks:
front-tier:
ipam:
driver: default
config:
- subnet: "172.16.238.0/24"
volumes
將主機的數據卷或者文件掛載到容器里。
Shell
# 短語法
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
# 完整語法
services:
backend:
image: awesome/backend
volumes:
- type: volume
# 命名卷
source: db-data
target: /data
volume:
nocopy: true
# 綁定卷
- type: bind
source: /var/run/postgres/postgres.sock
target: /var/run/postgres/postgres.sock
volumes:
db-data:
ports
指定端口映射。以下格式都可以:
Shell
# 完整語法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
published: 8000-9000
protocol: tcp
mode: host
# 短語法
ports:
- "3000"
- "3000-3005"
- "8000:8000"
- "9090-9091:8080-8081"
- "49100:22"
- "127.0.0.1:8001:8001"
- "127.0.0.1:5000-5010:5000-5010"
- "6060:6060/udp"
expose
暴露端口,但不映射到宿主機,只被連接的服務訪問。
僅可以指定內部端口為參數:
Shell
expose:
- "3000"
- "8000"
build
指定為構建鏡像上下文路徑:
例如 webapp 服務,指定為從上下文路徑 ./dir/Dockerfile 所構建的鏡像:
Shell
version: "3.7"
services:
webapp:
build: ./dir
或者,作為具有在上下文指定的路徑的對象,以及可選的 Dockerfile 和 args :
version: "3.7"
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
labels:
- "com.example.description=Accounting webapp"
- "com.example.department=Finance"
- "com.example.label-with-empty-value"
?
context :上下文路徑。
?
dockerfile :指定構建鏡像的 Dockerfile 文件名。
?
args :添加構建參數,這是只能在構建過程中訪問的環境變量。
?
labels :設置構建鏡像的標簽。
depends_on
設置依賴關系。
?
docker compose up :以依賴性順序啟動服務。在以下示例中,先啟動 db 和
redis ,才會啟動 web 。
?
docker compose up SERVICE :自動包含 SERVICE 的依賴項。在以下示例中,
docker compose up web 還將創建并啟動 db 和 redis 。
?
docker compose stop :按依賴關系順序停止服務。在以下示例中, web 在 db 和
redis 之前停止。
Shell
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
可以指定條件, healthy 需要配置 healthcheck 來完成
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
redis:
image: redis
db:
image: postgres
health check 樣例
Shell
version: "3.8"
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: "bit@123"
volumes:
- /data/maxhou/mysqldata/varlib/:/var/lib/mysql
healthcheck :
test: mysql --user=root --password='bit@123' -e "SELECT 1;"
interval: 10s
timeout: 5s
retries: 10
env_file
從文件添加環境變量。可以是單個值或列表的多個值。
Shell
env_file: .env
Docker Compose 命令清單
Docker Compose 有很多命令,但是常用的就幾個,這里列出一些,有需要額外學習的可以去docker官網學習
docker compose build | 構建服務 |
docker compose config | 規范的格式來顯示服務配置 |
docker compose cp | 在本地系統和服務容器直接拷貝文件 |
docker compose create | 創建服務的容器 |
docker compose down | 停止所有容器,并刪除容器 |
docker compose exec | 在容器中執行命令 |
docker compose images | 列出所有容器使用的鏡像 |
docker compose kill | 強制停止服務的容器 |
docker compose ls | 顯示所有項目 |
docker compose pause | docker compose pause |
命令格式
對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或者容器。如果沒有特別的說明,命令對象將是項目,這意味著項目中所有的服務都會受到命令影響。
docker-compose 命令的基本的使用格式為
docker compose [OPTIONS] COMMAND [ARGS...]
常見選項說明
-f, --file 指定使用的 Compose 模板文件,默認為 docker-compose.yml,可以多次指定
-p, --project-name 指定項目名稱,默認將使用所在目錄名稱作為項目名
常見命令說明
up
該命令的作用十分強大,它會嘗試自動完成包括構建鏡像、(重新)創建服務、啟動服務并關聯服務相關容器的一系列操作,可以直接通過該命令來啟動一個項目。
Shell
docker compose up [options] [SERVICE...]
-d 在后臺運行服務容器, 推薦在生產環境下使用該選項
--force-recreate 強制重新創建容器,不能與 --no-recreate 同時使用
--no-recreate 如果容器已經存在了,則不重新創建,不能與 --force-recreate 同時使用
down
停止所有容器,并刪除容器和網絡
docker compose down [options] [SERVICE...]
-v, --volumes 刪除容器同時刪除目錄映射
run
該命令可以在指定服務容器上執行相關的命令
Shell
# 例如 : 啟動一個 ubuntu 服務容器,并執行 ping docker.com 命令
# docker compose run ubuntu ping docker.com
docker compose run [options] SERVICE [COMMAND] [ARGS...]
-d 后臺運行容器
--name NAME 為容器指定一個名字
--entrypoint CMD 覆蓋默認的容器啟動指令
-e KEY=VAL 設置環境變量值,可多次使用選項來設置多個環境變
-u, --user="" 指定運行容器的用戶名或者 ui
--rm 運行命令后自動刪除容器
-p, --publish=[] 映射容器端口到本地主機
操作案例
1. 創建 compose 目錄
mkdir -p /data/myworkdir/compose/base
cd /data/myworkdir/compose/base
2. 進入 base 目錄 , 創建 docker-compose.yml 文件
cd /data/myworkdir/compose/base/
vi docker-compose.yml
3. 輸入一下內容
version: 3.8
services:web:image: nginx:1.24.0environment:TEST: 1ports:- 8979:80networks:
- mytestnetvolumes:- ./mynginxhome:/usr/share/nginx/htmldepends_on:mysql:condition: service_healthy redis:condition: service_healthymysql:image: mysql:5.7environment:MYSQL_ROOT_PASSWORD: "bit@123"networks:- mytestnetvolumes:- /data/maxhou/mysqldata/varlib/:/var/lib/mysqlhealthcheck:test: mysql --user=root --password='bit@123' -e "SELECT 1;"interval: 10stimeout: 5sretries: 10redis:image: redis:7networks:- mytestnethealthcheck:test: redis-cli pinginterval: 10stimeout: 5sretries: 10
networks:mytestnet:
4. 輸入 docker config 會做檢查????????
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
config
version must be a string
5. 我們修改錯誤信息,將版本轉為字符串,再次檢查,檢查通過
6. 創建首頁目錄,編輯首頁內容
Shell
root@139-159-150-152:/data/myworkdir/compose/base# mkdir - p ./mynginxhome
root@139-159-150-152:/data/myworkdir/compose/base# cd ./mynginxhome/
root@139-159-150-152:/data/myworkdir/compose/base/mynginxhome#
echo "Hello bit" > index.html
7. 啟動服務????????
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
up -d
8. 停止服務
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
stop
10. 啟動服務
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
start
11. 刪除服務
SQL
root@139-159-150-152:/data/myworkdir/compose/base# docker compose
down
總結
當docker某個項目牽扯多個微服務容器時,可以使用compose技術,實現對服務的容器定制化設置、網絡的搭建和連接,以及容器的啟動停止