Docker Compose使用手冊(cè)之場(chǎng)景、文件與命令詳解
一、什么是 Docker Compose
Docker Compose 是 Docker 官方的開源項(xiàng)目,使用 Python 編寫,調(diào)用 Docker 服務(wù)的 API 來管理和編排容器。官方定義為:定義和運(yùn)行多個(gè) Docker 容器的應(yīng)用。
在 Docker Compose 中,有兩個(gè)重要概念:
- 服務(wù)(Service):一個(gè)應(yīng)用的容器,通常包括多個(gè)運(yùn)行相同鏡像的容器實(shí)例。
- 項(xiàng)目(Project):由一組相關(guān)的應(yīng)用容器組成的完整業(yè)務(wù)單元,在
docker-compose.yml文件中定義。整個(gè)docker-compose.yml文件定義了一個(gè)項(xiàng)目。
Compose 的默認(rèn)管理對(duì)象是 項(xiàng)目,通過子命令對(duì)項(xiàng)目中的一組容器進(jìn)行簡(jiǎn)化的生命周期管理。
通過 compose 可以方便的管理多個(gè)服務(wù)。

二、為什么需要 Docker Compose
Docker 是一個(gè)輕量化的應(yīng)用程序,官方推薦每個(gè) Docker 容器只運(yùn)行一個(gè)進(jìn)程。
- 如果一個(gè)應(yīng)用需要 MySQL、Nginx 等環(huán)境,那么我們需要為應(yīng)用、數(shù)據(jù)庫(kù)和 Nginx 分別創(chuàng)建獨(dú)立的 Docker 容器,并逐一啟動(dòng)它們。
- 設(shè)想一下,構(gòu)建好 Docker 后,每次啟動(dòng)應(yīng)用都需要執(zhí)行至少三次
docker run,或者編寫腳本來實(shí)現(xiàn),這會(huì)顯得非常繁瑣。 - 此外,這些容器是分散獨(dú)立的,不方便管理和維護(hù)鏡像。既然這些容器都是為了同一個(gè)應(yīng)用提供服務(wù),那么將它們放在一起管理顯得更為合理。這時(shí),Docker Compose 就能幫助解決這類問題。
三、Docker Compose 使用步驟 / 核心功能
步驟
- 安裝 Docker 和 Docker Compose:確保已經(jīng)安裝了 Docker 和 Docker Compose。
- 創(chuàng)建
docker-compose.yml文件:在項(xiàng)目根目錄下創(chuàng)建一個(gè)docker-compose.yml文件,定義服務(wù)、網(wǎng)絡(luò)和卷等配置。 - 定義服務(wù):在
docker-compose.yml中定義每個(gè)服務(wù)(容器),包括鏡像、環(huán)境變量、端口映射等。 - 啟動(dòng)服務(wù):使用命令
docker-compose up啟動(dòng)所有服務(wù),-d參數(shù)可以讓容器在后臺(tái)運(yùn)行。 - 停止服務(wù):使用命令
docker-compose down停止并刪除所有容器。 - 查看日志:使用
docker-compose logs查看容器的日志輸出。
核心功能
- 多容器管理:可以輕松定義和管理多個(gè)服務(wù)(容器)。
- 一鍵啟動(dòng)與停止:通過命令啟動(dòng)或停止所有容器,簡(jiǎn)化操作。
- 服務(wù)依賴:自動(dòng)處理服務(wù)之間的啟動(dòng)順序。
- 配置管理:通過環(huán)境變量和
.env文件管理配置。 - 數(shù)據(jù)持久化:支持使用卷(Volumes)持久化數(shù)據(jù)。
- 擴(kuò)展服務(wù):可以輕松擴(kuò)展服務(wù)實(shí)例數(shù)量,處理負(fù)載。
四、Docker Compose 的使用場(chǎng)景
開發(fā)環(huán)境:在開發(fā)過程中,Docker Compose 可以用來快速搭建多容器的開發(fā)環(huán)境,例如將數(shù)據(jù)庫(kù)、緩存服務(wù)器、Web 應(yīng)用等服務(wù)組合在一起,開發(fā)者可以通過一條命令啟動(dòng)或停止整個(gè)環(huán)境。
測(cè)試環(huán)境:用于構(gòu)建和管理臨時(shí)的測(cè)試環(huán)境,確保不同服務(wù)之間的協(xié)作和集成測(cè)試在統(tǒng)一的環(huán)境中進(jìn)行。可以確保每次測(cè)試時(shí)環(huán)境的一致性。
本地開發(fā)與調(diào)試:在本地開發(fā)中,Docker Compose 允許開發(fā)者同時(shí)運(yùn)行多個(gè)依賴服務(wù)(如數(shù)據(jù)庫(kù)、消息隊(duì)列等),無需手動(dòng)啟動(dòng)每個(gè)容器,便于開發(fā)和調(diào)試。
微服務(wù)架構(gòu):在微服務(wù)架構(gòu)中,Docker Compose 可以用來管理多個(gè)微服務(wù)及其依賴服務(wù)(如數(shù)據(jù)庫(kù)、API 網(wǎng)關(guān)等),通過 Compose 配置文件統(tǒng)一管理和部署。
多環(huán)境部署:Docker Compose 支持為不同的環(huán)境(如開發(fā)、測(cè)試、生產(chǎn))配置不同的服務(wù)和設(shè)置,幫助實(shí)現(xiàn)環(huán)境間的一致性和遷移。
CI/CD 流水線:在持續(xù)集成/持續(xù)部署(CI/CD)過程中,Docker Compose 可用于自動(dòng)化構(gòu)建、測(cè)試和部署多容器應(yīng)用,簡(jiǎn)化流程,保證環(huán)境一致性。
本地模擬生產(chǎn)環(huán)境:在本地機(jī)器上使用 Docker Compose 模擬生產(chǎn)環(huán)境中的復(fù)雜服務(wù)拓?fù)?,幫助開發(fā)者在開發(fā)階段提前發(fā)現(xiàn)潛在問題。
五、Docker Compose 文件(docker-compose.yml)
文件語法版本
目前,官方支持三大版本:Version 1、Version 2 和 Version 3,其中 Version 1 已被廢棄。當(dāng)前最新版本為 3.8,要求 Docker Engine 版本至少為 19.03.0。本課程將基于 3.8 版本的 Compose 文件語法進(jìn)行講解,其他版本的詳細(xì)內(nèi)容可以參考官方文檔。
文件基本結(jié)構(gòu)及常見指令
YAML 示例:
version: "3.8" # 定義當(dāng)前使用的 Docker Compose 語法版本
services: # 服務(wù)定義,支持多個(gè)服務(wù)
servicename: # 服務(wù)名稱,內(nèi)部 bridge 網(wǎng)絡(luò)中使用的 DNS 名稱。非集群模式下相當(dāng)于 Docker run 命令中的名稱。
image: # 必選項(xiàng),指定容器鏡像
command: # 可選項(xiàng),覆蓋鏡像的默認(rèn)啟動(dòng)命令
environment: # 可選項(xiàng),等同于 docker run 中的 --env 參數(shù),用于設(shè)置環(huán)境變量
volumes: # 可選項(xiàng),等同于 docker run 中的 -v 參數(shù),用于數(shù)據(jù)卷掛載
networks: # 可選項(xiàng),等同于 docker run 中的 --network 參數(shù),指定容器網(wǎng)絡(luò)
ports: # 可選項(xiàng),等同于 docker run 中的 -p 參數(shù),指定端口映射
expose: # 可選項(xiàng),指定容器暴露的端口
build: # 可選項(xiàng),指定構(gòu)建鏡像的路徑
depends_on: # 可選項(xiàng),定義服務(wù)間的依賴關(guān)系
env_file: # 可選項(xiàng),定義外部環(huán)境變量文件常見字段格式語法
image: 指定容器運(yùn)行的鏡像。支持多種格式:
image: redis image: redis:5 image: redis@sha256:0ed5d5928d4737458944eb604cc8509e245c3e19d02ad83935398bc4b991aac7 image: library/redis image: my_private.registry:5000/redis
command: 覆蓋容器啟動(dòng)時(shí)的默認(rèn)命令:
command: ["bundle", "exec", "thin", "-p", "3000"] command: bundle exec thin -p 3000
entrypoint: 覆蓋容器的默認(rèn) entrypoint:
entrypoint: /code/entrypoint.sh entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-nonzts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
environment: 設(shè)置環(huán)境變量,可以使用數(shù)組或字典格式:
environment: RACK_ENV: development SHOW: "true"
或者數(shù)組格式:
environment: - RACK_ENV=development - SHOW=true
networks: 配置容器使用的網(wǎng)絡(luò):
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
volumes: 將主機(jī)的數(shù)據(jù)卷或文件掛載到容器中:
services:
db:
image: postgres:latest
volumes:
- "/localhost/postgres.sock:/var/run/postgres/postgres.sock"
- "/localhost/data:/var/lib/postgresql/data"
ports: 配置端口映射:
ports:
- target: 80
published: 8080
host_ip: 127.0.0.1
protocol: tcp
mode: host
expose: 暴露容器內(nèi)部端口,但不進(jìn)行端口映射:
expose: - "3000" - "8000"
build: 指定構(gòu)建鏡像的上下文路徑:
version: "3.7"
services:
webapp:
build: ./dir
depends_on: 設(shè)置服務(wù)依賴關(guān)系,確保服務(wù)按順序啟動(dòng):
services:
web:
build: .
depends_on:
- db
- redis
redis:
image: redis
db:
image: postgres
可以根據(jù)服務(wù)健康狀態(tài)設(shè)置條件:
services:
web:
build: .
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
env_file: 從文件中加載環(huán)境變量,可以是多個(gè)文件:
env_file: - .env - ./common.env - ./apps/web.env - /opt/secrets.env
示例:使用healthcheck配置容器健康檢查
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
六、Dockers Compose 命令清單
常見 Docker Compose 命令 與 官方文檔
啟動(dòng)和管理服務(wù)
docker-compose up:構(gòu)建、(重新)創(chuàng)建、啟動(dòng)和附加到容器。docker-compose down:停止并移除容器、網(wǎng)絡(luò)和卷。docker-compose start:?jiǎn)?dòng)已創(chuàng)建的容器。docker-compose stop:停止容器。docker-compose restart:重新啟動(dòng)服務(wù)容器。
構(gòu)建和鏡像管理
docker-compose build:構(gòu)建或重新構(gòu)建服務(wù)的鏡像。docker-compose push:將構(gòu)建的鏡像推送到 Docker 注冊(cè)表。
容器狀態(tài)和日志
docker-compose ps:列出服務(wù)的容器狀態(tài)。docker-compose logs:查看容器的輸出日志。docker-compose exec:在運(yùn)行中的容器內(nèi)執(zhí)行命令。docker-compose run:?jiǎn)?dòng)一個(gè)新容器并運(yùn)行一次命令。
容器的其他操作
docker-compose exec:在運(yùn)行中的容器中執(zhí)行命令。docker-compose run:運(yùn)行一個(gè)一次性的容器實(shí)例。docker-compose config:驗(yàn)證并查看 Compose 文件的配置。docker-compose top:列出正在運(yùn)行的容器的進(jìn)程信息。
資源管理
docker-compose scale:設(shè)置服務(wù)的容器數(shù)量(只適用于 Version 2 格式)。
官方文檔
Docker Compose 的官方文檔包含完整的命令清單、配置項(xiàng)說明以及示例,可以通過以下鏈接訪問:
Docker Compose 命令文檔:https://docs.docker.com/compose/reference/
該頁面提供了所有 docker-compose 命令的詳細(xì)說明,包括常用命令、選項(xiàng)和用法示例。
命令格式
對(duì)于 Docker Compose,大多數(shù)命令可以作用于整個(gè)項(xiàng)目,也可以針對(duì)項(xiàng)目中的特定服務(wù)或容器。如果沒有特別說明,命令默認(rèn)會(huì)影響整個(gè)項(xiàng)目,即項(xiàng)目中的所有服務(wù)。
docker compose 命令的基本格式為:
docker compose [OPTIONS] COMMAND [ARGS...]
常見選項(xiàng)說明:
-f, --file:指定 Compose 模板文件,默認(rèn)為docker-compose.yml,可使用多個(gè)文件。-p, --project-name:指定項(xiàng)目名稱,默認(rèn)使用當(dāng)前目錄名稱作為項(xiàng)目名。
常見選項(xiàng) / 命令
常見選項(xiàng)
-f --file指定使用的Compose模板文件,默認(rèn)為docker-compose.yml,可以多次指定-p, --project-name指定項(xiàng)目名稱,默認(rèn)使用“所在目錄的名稱”作為項(xiàng)目名
常見命令
Docker Compose 常見命令及選項(xiàng)說明
1. up
該命令會(huì)自動(dòng)完成包括構(gòu)建鏡像、(重新)創(chuàng)建服務(wù)、啟動(dòng)服務(wù)并關(guān)聯(lián)相關(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:如果容器已存在,則不重新創(chuàng)建,不能與--force-recreate同時(shí)使用。
2. down
停止所有容器,并刪除容器和網(wǎng)絡(luò)。
基本命令格式:
docker compose down [OPTIONS] [SERVICE...]
常見選項(xiàng):
-v, --volumes:刪除容器的同時(shí)刪除與容器關(guān)聯(lián)的卷(目錄映射)。
3. run
在指定服務(wù)容器上執(zhí)行相關(guān)命令。此命令用于啟動(dòng)服務(wù)容器并在其中執(zhí)行命令。
基本命令格式:
docker compose run [OPTIONS] SERVICE [COMMAND] [ARGS...]
常見選項(xiàng):
-d:后臺(tái)運(yùn)行容器。--name NAME:為容器指定一個(gè)名稱。--entrypoint CMD:覆蓋容器的默認(rèn)啟動(dòng)命令。-e KEY=VAL:設(shè)置環(huán)境變量,支持多次使用來設(shè)置多個(gè)環(huán)境變量。-u,--user="":指定運(yùn)行容器的用戶名或 UID。--rm:運(yùn)行命令后自動(dòng)刪除容器。-p,--publish=[]:映射容器端口到本地主機(jī)。
示例:
# 啟動(dòng) ubuntu 服務(wù)容器,并執(zhí)行 ping docker.com 命令 docker compose run ubuntu ping docker.com
下面是一個(gè)基本的 Docker Compose 操作案例,假設(shè)你的操作環(huán)境是 Ubuntu。
操作案例
下面演示如何創(chuàng)建一個(gè)包含 Nginx 和 MySQL 的多容器應(yīng)用,并通過 docker-compose.yml 文件管理它們。我們可以根據(jù)需要擴(kuò)展服務(wù)、配置網(wǎng)絡(luò)和卷等。
1. 安裝 Docker 和 Docker Compose
首先確保你的 Ubuntu 系統(tǒng)已經(jīng)安裝了 Docker 和 Docker Compose。你可以使用以下命令進(jìn)行安裝。
更新你的包列表并安裝依賴:
sudo apt update sudo apt install apt-transport-https ca-certificates curl software-properties-common
安裝 Docker:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh
安裝 Docker Compose:
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 sudo chmod +x /usr/local/bin/docker-compose
驗(yàn)證安裝:
docker --version docker-compose --version
創(chuàng)建 Docker Compose 項(xiàng)目文件
假設(shè)我們要?jiǎng)?chuàng)建一個(gè)簡(jiǎn)單的項(xiàng)目,包含一個(gè) Nginx 服務(wù)和一個(gè) MySQL 數(shù)據(jù)庫(kù)服務(wù)。
創(chuàng)建一個(gè)新目錄:
mkdir myproject cd myproject
創(chuàng)建 docker-compose.yml 文件:
使用編輯器創(chuàng)建 docker-compose.yml 文件,該文件描述了我們的服務(wù)和配置。
version: '3'
services:
web:
image: nginx:latest
container_name: nginx-container
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- mynetwork
db:
image: mysql:5.7
container_name: mysql-container
environment:
MYSQL_ROOT_PASSWORD: examplepassword
MYSQL_DATABASE: exampledb
volumes:
- mysql-data:/var/lib/mysql
networks:
- mynetwork
networks:
mynetwork:
volumes:
mysql-data:解釋:
web 服務(wù):使用 Nginx 鏡像,映射本地的 8080 端口到容器的 80 端口。
db 服務(wù):使用 MySQL 5.7 鏡像,設(shè)置了數(shù)據(jù)庫(kù)根密碼 examplepassword 和數(shù)據(jù)庫(kù)名 exampledb。
我們創(chuàng)建了一個(gè)網(wǎng)絡(luò) mynetwork 來讓容器間通信,并為 MySQL 創(chuàng)建了一個(gè)數(shù)據(jù)卷 mysql-data 來持久化數(shù)據(jù)庫(kù)數(shù)據(jù)。
創(chuàng)建 HTML 文件(可選):
如果你希望在瀏覽器中訪問你的 Nginx 服務(wù)并顯示內(nèi)容,可以創(chuàng)建一個(gè)簡(jiǎn)單的 HTML 文件:
mkdir html echo "<h1>Hello from Docker Compose!</h1>" > html/index.html
3. 啟動(dòng)服務(wù)
在項(xiàng)目目錄中,使用 docker compose up 命令來啟動(dòng)所有定義的服務(wù)。
docker compose up
如果你希望在后臺(tái)運(yùn)行容器,可以加上 -d 參數(shù):
docker compose up -d
這個(gè)命令會(huì):
- 下載
nginx和mysql鏡像(如果尚未下載)。 - 創(chuàng)建并啟動(dòng)容器。
- 自動(dòng)創(chuàng)建網(wǎng)絡(luò)
mynetwork和卷mysql-data。
你可以用 docker ps 查看正在運(yùn)行的容器:
docker ps
4. 訪問 Nginx 服務(wù)
如果一切正常,你可以在瀏覽器中訪問 Nginx 服務(wù),打開 http://localhost:8080,你應(yīng)該能夠看到 “Hello from Docker Compose!” 的 HTML 內(nèi)容。
5.查看容器日志
如果你想查看容器的日志,使用 docker compose logs 命令:
docker compose logs web
這將顯示 Nginx 容器的日志。如果你想查看 MySQL 容器的日志,可以使用:
docker compose logs db
6.停止并刪除服務(wù)
要停止并刪除所有運(yùn)行中的服務(wù)和容器,可以使用 docker compose down 命令:
docker compose down
如果你希望同時(shí)刪除卷(例如 MySQL 的數(shù)據(jù)卷),可以使用 -v 選項(xiàng):
docker compose down -v
七、常見問題
up、run 和 start 之間的區(qū)別
docker-compose up:用于啟動(dòng)或重新啟動(dòng)通過docker-compose.yml文件定義的所有服務(wù)。在默認(rèn)模式下,會(huì)顯示所有容器的日志。在“分離模式”(-d)下,容器會(huì)在后臺(tái)啟動(dòng),Compose 命令會(huì)退出,但容器繼續(xù)運(yùn)行。docker-compose run:用于運(yùn)行“一次性”或“臨時(shí)”任務(wù),只會(huì)啟動(dòng)指定服務(wù)及其依賴的服務(wù)。常用于執(zhí)行測(cè)試或管理任務(wù),如從數(shù)據(jù)卷容器中刪除或添加數(shù)據(jù)。run命令類似于docker run -ti,啟動(dòng)容器并進(jìn)入交互式終端,執(zhí)行完后根據(jù)進(jìn)程的退出狀態(tài)返回退出代碼。docker-compose start:用于重新啟動(dòng)已存在但停止的容器。不會(huì)創(chuàng)建新容器,只會(huì)啟動(dòng)已存在的、被停止的服務(wù)容器。
如何在同一主機(jī)上運(yùn)行 Compose 文件的多個(gè)副本
Compose 使用項(xiàng)目名稱為項(xiàng)目中的所有容器和資源創(chuàng)建唯一標(biāo)識(shí)符。要運(yùn)行項(xiàng)目的多個(gè)副本,可以通過以下方式設(shè)置自定義項(xiàng)目名稱:
這樣可以在同一主機(jī)上啟動(dòng)多個(gè)獨(dú)立的 Compose 項(xiàng)目實(shí)例。
- 使用
-p命令行選項(xiàng)來指定項(xiàng)目名稱。 - 使用
COMPOSE_PROJECT_NAME環(huán)境變量來設(shè)置項(xiàng)目名稱。
可以控制服務(wù)啟動(dòng)順序嗎?
可以通過在 docker-compose.yml 文件中使用 depends_on 來指定服務(wù)的啟動(dòng)順序??梢越Y(jié)合 healthcheck 功能來確保服務(wù)在健康檢查成功后再啟動(dòng),從而實(shí)現(xiàn)更精確的啟動(dòng)控制。
到此這篇關(guān)于Docker Compose使用手冊(cè)之場(chǎng)景、文件與命令詳解的文章就介紹到這了,更多相關(guān)Docker Compose使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于docker部署skywalking實(shí)現(xiàn)全鏈路監(jiān)控功能
這篇文章主要介紹了基于docker部署skywalking實(shí)現(xiàn)全鏈路監(jiān)控,skywalking提供了在很多不同的場(chǎng)景下用于觀察和監(jiān)控分布式系統(tǒng)的方式,文中給大家介紹如何快速部署skywalking全鏈路監(jiān)控,感興趣的朋友一起看看吧2022-03-03
Nextcloud介紹及docker-compose.yml部署+onlyoffice方式
Nextcloud是一款開源、自部署的私有云平臺(tái),允許用戶在自己的服務(wù)器上構(gòu)建文件同步、共享和協(xié)作系統(tǒng),它基于PHP和MySQL/MariaDB構(gòu)建,可運(yùn)行在Linux、Docker、Kubernetes等多種環(huán)境中,部署方式靈活,生態(tài)插件非常豐富2026-01-01
從入門到精通Docker Compose 輕松部署微服務(wù)實(shí)戰(zhàn)教程
本文介紹使用Docker Compose部署基于SpringCloudAlibaba的微服務(wù)項(xiàng)目,涵蓋用戶登錄積分功能,涉及Gateway、Redis、MySQL等組件,通過編寫Dockerfile和YAML配置文件,結(jié)合腳本實(shí)現(xiàn)環(huán)境容器與服務(wù)容器的自動(dòng)化部署與驗(yàn)證,感興趣的朋友一起看看吧2025-07-07
詳解MAC OSX Docker開發(fā)環(huán)境搭建
本篇文章主要介紹了詳解MAC OSX Docker開發(fā)環(huán)境搭建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03

