🌈 一、Docker Compose 介紹
? 1. Docker Compose 是什么
- Docker Compose 是由 Docker 官方提供的一個用于定義和運行多容器應用的工具,它讓用戶可以通過一個 YAML 文件(通常是
docker-compose.yml
)來配置應用所需要的服務(如 Web 服務、數據庫、緩存等),然后使用一條命令就可以啟動整個應用棧。 - 在 docker-compose 中,有以下兩個非常重要的概念:
- 服務
service
:由若干相同鏡像容器組成的應用。 - 項目
project
:由一組關聯的應用容器組成的一個完整業務單元,在 docker-compose.yml 文件中定義,整個 docker-compose.yml 定義一個項目。
- 服務
? 2. Docker Compose 的必要性
- Docker 是一個輕量化的應用程序,Docker 官方推薦每個 Docker 容器中只運行一個進程。
- 假設當前要啟動一個應用,它涉及到了 MySQL 和 Nginx,需要分別為應用、MySQL 和 Nginx 創建單獨的 Docker 容器,然后將這些容器運行起來。當構建好 Docker 之后,每次啟動這個應用都至少需要 docker run 三次,未免也太過繁瑣。且這些容器都是分散獨立的,也不方便鏡像管理。
- 此時就引入了 Docker Compose 來將那些為同一個應用服務的容器整合起來,方便進行管理。
Docker Compose 主要優勢
- 簡化控制:Docker Compose 允許用戶在單個 YAML 文件中定義和管理多容器應用程序。簡化了編排和協調各種服務的復雜任務,從而更輕松地管理和復制用戶的應用程序環境。
- 高效協作:Docker Compose 的配置文件易于共享,促進了開發、運營、測試等項目相關者之間的協作。
- 快速應用程序開發:Docker Compose 會緩存用于創建容器的配置。當重新啟動未更改的服務時,Docker Compose 會重新使用現有容器。重復使用容器意味著可以非常快速的更改環境。
- 跨環境的可移植性:Docker Compose 支持 Compose 文件中的變量,可以使用這些變量為不同的環境或不同的用戶自定義合成。
? 3. Docker Compose 的功能
- Docker Compose 可以管理應用程序的整個生命周期。
功能分類 | 具體內容 | 示例命令 |
---|---|---|
服務編排 | 使用 docker-compose.yml 文件定義多個服務 | docker compose up |
自動構建鏡像 | 可以自動根據 Dockerfile 文件構建鏡像 | docker compose build |
一鍵啟動于停止 | 一條命令就可以 啟動 / 停止 整個應用 | docker compose up / down |
服務依賴管理 | 通過 depends_on 來定義服務之間的依賴關系 | depends_on: [db] |
網絡自動管理 | 默認為服務創建隔離的虛擬網絡,也支持自定義網絡 | networks: |
數據卷管理 | 自動創建、掛載卷,實現數據持久化 | volumes: |
日志集中查看 | 查看所有服務容器的日志輸出 | docker compose logs |
配置參數統一管理 | 可以使用 .env 文件來定義環境變量 | .env 文件 + %{VAR} 語法 |
? 4. Docker Compose 的使用場景
- 本地開發環境構建:用于本地構建一個由多個服務組成的項目(如 Web + 數據庫 + 緩存),通過一個 docker-compose.yml 文件可以一鍵啟動所有組件,避免環境配置混亂。
- 多環境配置管理:結合多個 Compose 文件或環境變量管理不同部署環境下的配置,可以避免重復配置和代碼污染,提升部署靈活性。
- 數據庫備份 / 恢復演練:搭建一個隔離的數據庫環境進行數據恢復、備份策略測試或異常演練,不會影響正式環境。
🌈 二、Docker Compose 文件
- Docker Compose 可以通過一個 YAML 文件(通常是
docker-compose.yml
)來配置應用所需要的服務。
? 1. 文件語法版本
- 當前官方支持 3 個大版本(version1、version2、version3),其中的 version1 已經被廢棄。
- 建議始終使用 Docker 官方文檔推薦的最新版語法,以獲得最大兼容性和功能支持。
Compose 版本 | 對應字段寫法 | 支持的最低 Docker Engine 版本 | 說明 |
---|---|---|---|
1 | 不寫 version 字段 | < 1.10 | 功能有限,已廢棄 |
2 | version: ‘2’ | 1.10+ | 引入了 depends_on 等基本功能 |
2.1 ~ 2.4 | version: ‘2.x’ | 1.12 ~ 17.12 | 增強了 healthcheck、資源限制等 |
3 | version: ‘3’ | 1.13+ | 為 Swarm 服務模式涉及 |
3.1 ~ 3.9 | version: ‘3.x’ | 17.01 ~ 20.10 | 添加 secrets、configs、runtime |
3.8 | version: ‘3.8’ | 19.03+ | 最常用的穩定版本 |
3.9 | version: ‘3.9’ | 20.10+ | 最新 v3 版本,新增 profiles |
? 2. 文件基本結構
- 一個標準的
docker-compose.yml
文件主要包括以下幾個頂層字段(提示:xxx 僅作為占位,需根據具體服務進行填寫)。
version: '3.8' # 指定語法版本
services: # 服務定義塊(核心),可以存在多個servicename: # 服務名稱,內部 bridge 網絡下可作為 DNS 名稱image: xxx # 必選,鏡像的名字command: xxx # 可選,覆蓋默認鏡像里的 CMD 命令environment: xxx # 可選,設置環境變量,等價于 docker run 的 --envvolumes: xxx # 可選,掛載數據卷,等價于 docker run 的 -vnetworks: xxx # 可選,加入的網絡,等價于 docker run 的 --networkports: xxx # 可選,端口映射,等價于 docker run 的 -pexpose: xxx # 可選,僅聲明容器暴露的端口,等價于 --exposedepends_on: xxx # 可選,設置服務間的依賴順序,類似于 --linkrestart: xxx # 可選,容器重啟策略,等價于 --restartbuild: xxx # 可選,構建鏡像路徑,等價于 docker build 的 -fservicename2:# ...servicename3:# ...
volumes: # 可選,數據卷定義塊,等價于 docker volume create# volume_name:# driver: xxx
networks: # 可選,網絡定義塊,等價于 docker network create# network_name:# driver: bridge
? 3. 常見字段格式語法
🌙 3.1 image
- 用于指定容器運行的鏡像,以下格式都可以:
image: image_name # 鏡像名(默認最新版本)
image: image_name:tag # 鏡像 + 標簽(版本號)
image: image_name@sha256:digest # 鏡像 + 摘要哈希
image: namespace/image_name # 指定命名空間鏡像
image: registry_host:port/namespace/image_name # 私有倉庫中的鏡像
🌙 3.2 command
- 用于覆蓋鏡像默認的啟動命令,以下格式都可以:
command: "executable param1 param2" # 字符串形式命令
command: ["executable", "param1", "param2"] # 列表形式命令(推薦)
🌙 3.3 entrypoint
- 用于覆蓋容器默認的 entrypoint,以下格式都可以:
entrypoint: "/entry.sh" # 字符串形式入口點
entrypoint: ["sh", "/entry.sh"] # 列表形式入口點(推薦)
🌙 3.4 environment
- 用于設置容器的環境變量,以下格式都可以:
environment:- VAR_NAME=value # 字符串列表格式- VAR_NAME # 從宿主環境繼承變量environment:VAR_NAME: value # 映射格式(推薦使用)ANOTHER_VAR: "true"
🌙 3.5 networks
- 指定容器運行的網絡,可用于服務發現,以下格式都可以:
networks:- network_name # 加入已有網絡(簡寫形式)networks:custom_net:aliases:- service_alias # 在網絡中定義別名
🌙 3.6 volumes
- 用于將宿主機的存儲卷 / 文件掛載到容器中:
volumes:- host_path:container_path # 將宿主機路徑掛載到容器中- volume_name:container_path # 使用命名卷掛載數據- container_path # 創建匿名卷并掛載到容器路徑- type: volume|bind # 指定掛載類型(volume 或 bind)source: volume_name_or_host_path # 數據來源(卷名或宿主路徑)target: container_path # 容器內的目標掛載路徑read_only: true|false # 是否只讀掛載
🌙 3.7 ports
- 用于配置宿主機和容器之間的端口映射:
ports:- "host_port:container_port" # 宿主端口映射到容器端口- "host_ip:host_port:container_port" # 限定綁定主機 IP- "container_port" # 隨機分配宿主機端口映射容器端口- target: container_port # 容器暴露端口(Swarm 專用格式)published: host_port # 映射到宿主機的端口protocol: tcp|udp # 協議類型mode: ingress|host # 發布模式(負載均衡或主機直連)
🌙 3.8 expose
- 用于暴露容器端口,僅在網絡中可訪問:
expose:- container_port # 向同一網絡中的容器暴露端口- another_container_port # 不對主機暴露,僅內部訪問
🌙 3.9 build
- 用于從源碼構建鏡像,以下幾種格式都可以:
build: context_path # 簡寫,指定構建上下文路徑build:context: context_path # 構建上下文路徑(目錄)dockerfile: Dockerfile_name # Dockerfile 文件名(默認是 Dockerfile)args: # 構建時傳入的參數(ARG)ARG_NAME: valuetarget: build_stage_name # 多階段構建時的目標階段cache_from:- image_name:tag # 用于加速構建的緩存鏡像來源
🌙 3.10 depends_on
- 用于聲明依賴服務的啟動順序(僅控制啟動順序,不保證服務已就緒):
depends_on:- service_a # 當前服務依賴 service_a 啟動- service_b # 當前服務依賴 service_b 啟動
🌙 3.11 env_file
- 用于引入
.env
文件來設置環境變量:
env_file:- .env # 默認環境文件,當前路徑- config/dev.env # 自定義路徑下的 .env 文件
🌈 三、Docker Compose 命令
? 1. 命令清單
命令 | 功能 | |
---|---|---|
01 | docker compose build | 構建服務所需要的鏡像 |
02 | docker compose config | 檢查 docker-compose.yml 文件格式是否正確,并以規范的格式來顯示配置 |
03 | docker compose cp | 在本地系統和服務容器之間拷貝文件 |
04 | docker compose create | 創建服務的容器,但不啟動它們 |
05 | docker compose up | 構建,(重新)創建,啟動,鏈接一個服務相關的容器 |
06 | docker compose down | 停止所有容器,并刪除容器、網絡、卷等資源 |
07 | docker compose exec | 在運行中的容器內執行命令 |
08 | docker compose images | 列出所有容器當前使用的鏡像 |
09 | docker compose kill | 強制停止服務的容器 |
10 | docker compose logs | 查看服務容器輸出的日志 |
11 | docker compose ls | 顯示當前主機上的所有 Compose 項目 |
12 | docker compose pause | 暫停服務容器 |
13 | docker compose unpause | 恢復被暫停的服務容器 |
14 | docker compose ps | 列出當前項目中運行的所有容器 |
15 | docker compose pull | 從遠程倉庫拉取服務鏡像 |
16 | docker compose push | 推送服務鏡像到遠程倉庫 |
17 | docker compose restart | 重啟 / 重啟某個服務 |
18 | docker compose rm | 刪除服務停止的容器 |
19 | docker compose run | 在指定服務容器上執行相關的命令(一次性) |
20 | docker compose start | 啟動當前停止的某個容器 |
21 | docker compose stop | 停止當前運行的某個容器 |
22 | docker compose top | 顯示服務容器中運行的進程 |
23 | docker compose port | 列出所有的服務端口映射 |
24 | docker compose events | 從服務獲取實時事件 |
25 | docker compose version | 查看 Compose 版本信息 |
? 2. 命令通用格式
- 對于 Compose 來說,大部分命令的對象既可以是項目本身,也可以指定為項目中的服務或容器。
- 如果沒有特別說明,命令對象默認是項目,這意味著項目中所有的服務都會受到命令影響。
- Docker Compose 命令的基本使用格式如下:
docker compose [options] command [args...]
options 的常見選項 | 說明 |
---|---|
-f 或 --file | 指定使用的 Compose 模板文件,默認為 docker-compose.yml,可以多次指定 |
-p 或 --project-name | 指定項目名稱,默認將所在目錄的目錄名作為項目名 |
? 3. docker compose up
- 該命令用于啟動并創建 Compose 文件中定義的所有服務容器。
- 它會嘗試自動完成包括購進啊鏡像、(重新)創建服務、啟動服務并關聯服務相關容器的一系列操作。
1. 基礎語法
docker compose up [options] [service_name...]
options 的可選項 | 功能 |
---|---|
-d | 在后臺運行服務容器 |
--force-recreate | 強制重新創建容器,不能和 --no-recreate 同時使用 |
--no-recreate | 如果容器已經存在,則不重新創建,不能和 --force-recreate 同時存在 |
2. 使用示例
docker compose up -d web # 后臺啟動名為 web 的服務
? 4. docker compose down
- 用于停止并刪除所有 / 指定的服務容器、網絡、卷(可選)和鏡像(可選),用于徹底清理 Compose 啟動的資源。
1. 基礎語法
docker compose down [options] [service_name...]
options 的可選項 | 功能 |
---|---|
-v 或 --volumes | 刪除所有的目錄映射 |
2. 使用示例
docker compose down -v # 刪除所有的服務容器、網絡、卷
? 5. docker compose run
- 臨時運行一個服務容器,并在其中執行命令,不影響原有容器的生命周期。
1. 基礎語法
docker compose run [options] service_name [command] [args...]
options 的可選項 | 功能 |
---|---|
-d | 在后臺運行容器 |
--name NAME | 自定義容器名稱(默認為 項目_服務_序號) |
--entrypoint CMD | 覆蓋默認的容器啟動指令 |
-e KEY=VAL | 設置環境變量的值 |
-u 或 --user="" | 指定運行容器的用戶 UID 或 用戶名 |
--rm | 命令執行完后,自動刪除容器 |
-p 或 --publish=[] | 將主機端口映射到容器端口,格式為 host_port:container_port |
2. 使用示例
docker compose run --rm db sh # 臨時進入 db 服務執行 sh
docker compose run app npm install # 對 app 服務執行 npm 安裝
🌈 四、Docker Compose 部署 WordPress
? 1. WordPress 介紹
- WordPress 是一個免費、開源的內容管理系統(CMS),用戶可以通過直觀的管理頁面創建、管理、發布數字內容,主要用于構建和管理網站。
WordPress 的核心功能
功能模塊 | 說明 |
---|---|
文章與頁面 | 創建并發布博客文章和頁面,支持分類、標簽、草稿、發布時間等 |
插件系統 | 提供擴展功能,例如 SEO 優化、安全防護、緩存、聯系表單、電商功能等 |
主題系統 | 可切換外觀風格,支持免費/付費主題,開發者也可自定義開發主題 |
媒體管理 | 上傳和插入圖片、視頻、PDF 等媒體資源,有圖庫管理 |
用戶與權限管理 | 支持多個用戶角色:管理員、編輯、作者、投稿者、訂閱者 |
評論系統 | 內建文章評論功能,支持反垃圾評論插件如 Akismet |
多語言支持 | 支持多語言網站,可配合插件如 Polylang、WPML 構建多語種頁面 |
? 2. WordPress 部署
- 編寫 Docker Compose:創建一個 docker-compose.yml 文件,內容如下:
version: "3.8" # 指定 Docker Compose 文件語法版本services: # 所有服務容器定義塊wordpress: # WordPress 服務(Web前端)image: wordpress # 使用官方 WordPress 鏡像restart: always # 始終重啟(容器異常退出時自動恢復)depends_on: # 設置服務依賴關系db: # 依賴名為 db 的服務(MySQL)condition: service_healthy # 等待 db 服務變為健康后才啟動本服務ports:- 8080:80 # 將主機 8080 端口映射到容器 80 端口(HTTP)environment: # 設置環境變量供 WordPress 安裝初始化使用WORDPRESS_DB_HOST: db # 數據庫主機(服務名)WORDPRESS_DB_USER: MyWordPressUser # 數據庫用戶名WORDPRESS_DB_PASSWORD: MyWordPressPass # 數據庫密碼WORDPRESS_DB_NAME: WordPress # 要使用的數據庫名volumes:- ./WordPress:/var/www/html # 映射本地目錄到容器網站目錄,實現持久化db: # MySQL 服務(數據庫)image: mysql:5.7 # 使用官方 MySQL 5.7 鏡像(兼容性良好)restart: always # 始終重啟(數據庫異常后自動恢復)environment: # 設置數據庫初始化參數(首次運行有效)MYSQL_DATABASE: WordPress # 初始化創建的數據庫名MYSQL_USER: MyWordPressUser # 自定義數據庫用戶MYSQL_PASSWORD: MyWordPressPass # 數據庫用戶密碼MYSQL_ROOT_PASSWORD: MyRootPass # 數據庫 root 用戶密碼volumes:- ./MysqlVarLib:/var/lib/mysql # 映射本地目錄到容器數據庫目錄,實現數據持久化healthcheck: # 健康檢查(用于依賴啟動判斷)test: mysql -u root -pMyRootPass -e "SELECT 1;" # 測試 MySQL 是否響應查詢timeout: 5s # 每次檢查最大等待時間retries: 10 # 最大重試次數
- 讓站點在后臺運行:
docker compose up -d
- 在瀏覽器內通過訪問服務器的 8080 端口來訪問容器內的 web 頁面。
- 配置參數,點擊安裝:
- 使用創建的用戶名和密碼進行登錄:
- 進入后臺,發布一篇 blog 看看功能是否正常。
- 清理資源:先停應用,再停數據庫。