Docker多容器編排Compose實(shí)戰(zhàn)案例
概念簡述
核心定義
Docker Compose 是一個(gè)用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。它允許您使用一個(gè)單獨(dú)的配置文件(通常是 .yml 格式)來配置應(yīng)用程序的所有服務(wù)、網(wǎng)絡(luò)和卷,然后通過一條簡單的命令就能創(chuàng)建和啟動(dòng)所有服務(wù)。
可以把它想象成一個(gè)自動(dòng)化腳本或編排工具,專門用于在單臺(tái)主機(jī)上部署由多個(gè)容器組成的應(yīng)用。
為什么要使用 Docker Compose?解決什么問題?
在理解 Compose 之前,先想想如果不用它,會(huì)多麻煩:
假設(shè)應(yīng)用由以下服務(wù)組成:Web 應(yīng)用、Redis 緩存服務(wù)、MySQL 數(shù)據(jù)庫服務(wù),如果沒有 Docker Compose,你需要手動(dòng)完成以下步驟:
- 創(chuàng)建一個(gè) Docker 網(wǎng)絡(luò)讓容器可以通信。
- 單獨(dú)啟動(dòng) MySQL 容器,并指定網(wǎng)絡(luò)、卷、環(huán)境變量等。
- 單獨(dú)啟動(dòng) Redis 容器,并指定網(wǎng)絡(luò)、環(huán)境變量等。
- 構(gòu)建你的 Web 應(yīng)用的鏡像。
- 啟動(dòng) Web 應(yīng)用容器,并鏈接到之前創(chuàng)建的網(wǎng)絡(luò),設(shè)置環(huán)境變量指向 Redis 和 PostgreSQL 的容器名。
你需要記住并輸入一大堆 docker run 命令,這個(gè)過程非常繁瑣且容易出錯(cuò)。
Docker Compose 解決了這個(gè)問題:
- 簡化流程:用一個(gè)文件(
docker-compose.yml)描述整個(gè)應(yīng)用棧的架構(gòu)。 - 一鍵操作:通過一條命令(
docker compose up)就能同時(shí)創(chuàng)建、啟動(dòng)所有服務(wù),并處理好它們之間的依賴關(guān)系。 - 配置即代碼:將你的應(yīng)用基礎(chǔ)設(shè)施(服務(wù)、網(wǎng)絡(luò)、存儲(chǔ))用配置文件管理起來,可以納入版本控制系統(tǒng),方便協(xié)作和追溯。
核心概念與工作流程
- 定義
docker-compose.yml文件:- 這是 Docker Compose 的核心。你在這個(gè) YAML 文件中定義你的應(yīng)用所需的服務(wù)、網(wǎng)絡(luò)和卷。
- 服務(wù):對應(yīng)一個(gè)容器。你可以指定使用哪個(gè)鏡像、暴露哪些端口、掛載哪些卷、設(shè)置哪些環(huán)境變量、依賴哪些其他服務(wù)等。
- 網(wǎng)絡(luò):定義容器之間通信的網(wǎng)絡(luò)。
- 卷:定義持久化數(shù)據(jù)存儲(chǔ)的位置。
- 執(zhí)行
docker compose up命令:- 在包含
docker-compose.yml文件的目錄下運(yùn)行此命令。Compose 會(huì): - 自動(dòng)構(gòu)建或拉取所需的鏡像。
- 按依賴順序創(chuàng)建并啟動(dòng)所有定義的服務(wù)。
- 將所有服務(wù)的日志輸出聚合到一個(gè)流中,方便查看。
- 在包含
- 執(zhí)行
docker compose down命令:- 當(dāng)你想要停止并清理整個(gè)應(yīng)用時(shí),運(yùn)行此命令。它會(huì)停止所有容器,并刪除創(chuàng)建的容器和網(wǎng)絡(luò)(默認(rèn)情況下不刪除卷)。
總結(jié):Docker Compose 的優(yōu)點(diǎn)
- 隔離環(huán)境:整個(gè)應(yīng)用棧與主機(jī)環(huán)境完全隔離。
- 極簡配置:一個(gè)命令替代了大量復(fù)雜的
docker run命令。 - 快速部署:極大地簡化了多容器應(yīng)用的部署和測試流程,是開發(fā)、測試和 CI/CD 環(huán)境的理想選擇。
- 服務(wù)發(fā)現(xiàn):自動(dòng)在服務(wù)之間創(chuàng)建網(wǎng)絡(luò),并通過服務(wù)名進(jìn)行DNS解析,使容器間通信變得非常簡單。
注意:Docker Compose 通常用于開發(fā)、測試和單機(jī)部署。對于生產(chǎn)環(huán)境中跨多臺(tái)主機(jī)的集群管理和編排,更強(qiáng)大的工具如 Kubernetes 或 Docker Swarm 更為合適。不過,Compose 文件可以作為學(xué)習(xí)這些更復(fù)雜工具的基礎(chǔ)。
配置文件格式
version:指定Docker Compose文件的版本格式,不同版本支持的功能和語法有所不同,高版本兼容低版本services: 服務(wù),可以存在多個(gè)
servicename: 服務(wù)名字,它也是內(nèi)部bridge網(wǎng)絡(luò)可以使用的DNS name,如果不是集群模式相當(dāng)于docker run的時(shí)候指定的一個(gè)名稱,集群(Swarm)模式是多個(gè)容器的邏輯抽象
image: 鏡像的名字(必選)
command: 如果設(shè)置,則會(huì)覆蓋默認(rèn)鏡像里的CMD命令
environment: 等價(jià)于docker container run里的–env選項(xiàng),設(shè)置環(huán)境變量
volumes: 等價(jià)于docker container run里的-v選項(xiàng),綁定數(shù)據(jù)卷
networks: 等價(jià)于docker container run里的–network選項(xiàng),指定網(wǎng)絡(luò)
ports: 等價(jià)于docker container run里的-p選項(xiàng),指定端口映射
expose: 可選,指定容器暴露的端口
build: 構(gòu)建目錄
depends_on: 服務(wù)依賴配置
env_file: 環(huán)境變量文件
servicename2:
image:
command:
networks:
ports:
servicename3:
#…volumes: # 可選,等價(jià)于 docker volume createnetworks: # 可選,等價(jià)于 docker network create
參數(shù)詳解
準(zhǔn)備這樣一個(gè)目錄結(jié)構(gòu):
mycompose/
├── prj1
│ └── docker-compose.yml
├── prj2
│ └── docker-compose.yml
└── prj3
└── docker-compose.yml
......image
功能:指定容器鏡像
示例:
- 創(chuàng)建prj1目錄:
mkdir prj1
- 在prj1中創(chuàng)建文件docker-compose.yml
cd prj1touch docker-compose.yml
- 編輯docker-compose文件
vim docker-compose.ymlservices: web: image: nginx:1.24.0
- 啟動(dòng)配置
docker compose up
- 清除容器
docker compose down

接下來就不再詳細(xì)展示每個(gè)步驟,重點(diǎn)講解第3步文件的配置。
command
功能:覆蓋容器啟動(dòng)的默認(rèn)指令
格式:
command: ["bundle", "exec", "thin", "-p", "3000"] //或 command: bundle exec thin -p 3000
示例:
serveices:
web:
image: nginx:1.24.0
command: bundle exec thin -p 3000這些內(nèi)容都寫在配置文件docker-compose.yml里面

entrypoint
功能:覆蓋容器默認(rèn)的 entrypoint。
格式:
entrypoint: /code/entrypoint.sh
也可以是列表格式:
entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
示例:
services:
web:
image: nginx:1.24.0
entrypoint:
- tail
- -f
- /etc/os-releaseenvironment
environment
功能:
添加環(huán)境變量。您可以使用數(shù)組或字典、任何布爾值,布爾值需要用引號引起來,以確保 YML 解析器不會(huì)將其轉(zhuǎn)換為 True 或 False。
格式:
# map 格式 environment: RACK_ENV: development SHOW: "true" USER_INPUT:
# 數(shù)組格式 environment: - RACK_ENV=development - SHOW=true - USER_INPUT=
示例:
services:
web:
image: nginx:1.24.0
environment:
TEST: 1
networks
功能:配置容器網(wǎng)絡(luò)
示例:
services:
web:
image: nginx:1.24.0
networks:
- web1
- web2
networks:
web1:
web2:
volume
功能:配置容器的存儲(chǔ)卷
#短語法
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
#完整語法
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示例:
services:
web:
image: nginx:1.24.0
volumes:
- /home/qsy/gitDocker/data/myvolumes:/usr/share/nginx/html/ports
功能:配置容器的端口映射
#完整語法
ports:
- target: 80
host_ip: 127.0.0.1
published: 8080
protocol: tcp
mode: host
- target: 80
host_ip: 127.0.0.1
#短語法
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"示例:
services:
web:
image: nginx:1.24.0
ports:
- 7070:80expose
功能:暴露端口,但不映射到宿主機(jī),只被連接的服務(wù)訪問。僅可以指定內(nèi)部端口為參數(shù).
格式/示例:
expose: - "3000" - "8000"
depends_on
功能:設(shè)置依賴關(guān)系
docker compose up:以依賴性順序啟動(dòng)服務(wù)。在以下示例中,先啟動(dòng)db和redis,才會(huì)啟動(dòng)web。docker compose up SERVICE:自動(dòng)包含SERVICE的依賴項(xiàng)。在以下示例中,docker compose up web還將創(chuàng)建并啟動(dòng)db和redis。docker compose stop:按依賴關(guān)系順序停止服務(wù)。在以下示例中,web在db和redis之前停止。
version: "3.7"
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgresenv_file
從文件添加環(huán)境變量??梢允菃蝹€(gè)值或列表的多個(gè)值。
env_file: xxx.env
也可以是列表格式:
env_file: - ./.env - ./apps/web.env - /opt/secrets.env
docker compose指令
docker compose 指令與容器操作相似,只不過把容器改成了服務(wù)
命令格式:docker-compose 命令的基本的使用格式為
docker compose [OPTIONS] COMMAND [ARGS...]
命令清單:
- docker compose build - 構(gòu)建服務(wù)
- docker compose config - 以規(guī)范格式顯示服務(wù)配置
- docker compose cp - 在本地系統(tǒng)和服務(wù)容器之間拷貝文件
- docker compose create - 創(chuàng)建服務(wù)的容器
- docker compose down - 停止所有容器并刪除容器
- docker compose events - 從服務(wù)器獲取實(shí)時(shí)事件
- docker compose exec - 在容器中執(zhí)行命令
- docker compose images - 列出所有容器使用的鏡像
- docker compose kill - 強(qiáng)制停止服務(wù)的容器
- docker compose logs - 顯示容器日志
- docker compose ls - 顯示所有項(xiàng)目
- docker compose pause - 暫停服務(wù)
- docker compose port - 列出所有的端口映射
- docker compose ps - 列出項(xiàng)目中目前的所有容器
- docker compose pull - 拉取服務(wù)鏡像
- docker compose push - 推送服務(wù)鏡像
- docker compose restart - 重啟服務(wù)
- docker compose rm - 刪除已停止的服務(wù)容器
- docker compose run - 在指定服務(wù)容器上執(zhí)行命令
- docker compose start - 啟動(dòng)當(dāng)前停止的容器
- docker compose stop - 停止當(dāng)前運(yùn)行的容器
- docker compose top - 顯示運(yùn)行的進(jìn)程
- docker compose unpause - 恢復(fù)服務(wù)
- docker compose up - 構(gòu)建、創(chuàng)建、啟動(dòng)和鏈接服務(wù)相關(guān)的容器(支持 --no-recreate 參數(shù)避免重新創(chuàng)建,-d 后臺(tái)運(yùn)行)
- docker compose version - 查看版本信息
用法和功能與容器的相關(guān)指令類似,只是docker compose的操作對象是服務(wù)而已。
參考文章:Docker容器核心指令
關(guān)鍵命令選項(xiàng)
up
功能:
該命令的作用十分強(qiáng)大,它會(huì)嘗試自動(dòng)完成包括構(gòu)建鏡像、(重新)創(chuàng)建服務(wù)、啟動(dòng)服務(wù)并關(guān)聯(lián)服務(wù)相關(guān)容器的一系列操作,可以直接通過該命令來啟動(dòng)一個(gè)項(xiàng)目。
語法:
docker compose up [options] [service...]
選項(xiàng)說明:
-d在后臺(tái)運(yùn)行服務(wù)器,推薦在生產(chǎn)環(huán)境下使用該選項(xiàng)--force-recreate強(qiáng)制重新創(chuàng)建容器,不能與--no-recreate同時(shí)使用--no-recreate如果容器已經(jīng)存在了,則不重新創(chuàng)建,不能與--force-recreate同時(shí)使用
down
功能:停止所有容器,并刪除容器和網(wǎng)絡(luò)。
語法:
docker compose down [options] [SERVICE...]
選項(xiàng)說明:
-v, --volumes:刪除容器同時(shí)刪除目錄映射。
run
功能:該命令可以在指定服務(wù)器上執(zhí)行相關(guān)的命令
語法:
# 例如:啟動(dòng)一個(gè) ubuntu 服務(wù)容器,并執(zhí)行 ping docker.com 命令 # docker compose run ubuntu ping docker.com docker compose run [options] SERVICE [COMMAND] [ARGS...]
與docker run的區(qū)別,該指令是用服務(wù)啟動(dòng)容器,而不是鏡像
選項(xiàng)說明:
-d后臺(tái)運(yùn)行容器--name NAME為容器指定一個(gè)名字--entrypoint CMD覆蓋默認(rèn)的容器啟動(dòng)指令-e KEY=VAL設(shè)置環(huán)境變量值,可多次使用選項(xiàng)來設(shè)置多個(gè)環(huán)境變量-u, --user=""指定運(yùn)行容器的用戶名或者 uid--rm運(yùn)行命令后自動(dòng)刪除容器-p, --publish=[]映射容器端口到本地主機(jī)
示例:

綜合案例
docker-compose.yml配置

啟動(dòng),會(huì)先啟動(dòng)依賴的服務(wù)。

清理,與啟動(dòng)相反,先清理主要的服務(wù),然后清理依賴的服務(wù)。

到此這篇關(guān)于Docker多容器編排:Compose 實(shí)戰(zhàn)教程的文章就介紹到這了,更多相關(guān)Docker多容器Compose 實(shí)戰(zhàn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Docker 簡單部署 ElasticSearch的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker 簡單部署 ElasticSearch的實(shí)現(xiàn)方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-09-09
如何讓docker中的mysql啟動(dòng)時(shí)自動(dòng)執(zhí)行sql語句
這篇文章主要介紹了讓docker中的mysql啟動(dòng)時(shí)自動(dòng)執(zhí)行sql的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
docker python如何實(shí)現(xiàn)打包的方法
這篇文章主要介紹了docker 打包python實(shí)現(xiàn)方法的相關(guān)資料,這里說明如今實(shí)現(xiàn),需要的朋友可以參考下2016-12-12
Docker容器使用jenkins部署web項(xiàng)目(總結(jié))
這篇文章主要介紹了Docker容器使用jenkins部署web項(xiàng)目(總結(jié)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
docker容器狀態(tài)轉(zhuǎn)換管理命令實(shí)例詳解
Docker容器只是一個(gè)運(yùn)行于宿主操作系統(tǒng)host?OS上的應(yīng)用進(jìn)程,所以你需要一個(gè)鏡像來運(yùn)行它,Docker鏡像以進(jìn)程的方式運(yùn)行時(shí)就叫做Docker容器,這篇文章主要給大家介紹了關(guān)于docker容器狀態(tài)轉(zhuǎn)換管理命令的相關(guān)資料,需要的朋友可以參考下2022-05-05

