在Day 2要為大家講解開發中最常用的Docker Compose;Docker Compose 是一種用來定義和執行多容器應用程式的工具。它可以將應用程式的各個組件(例如 Web 伺服器、資料庫和緩存)作為單個服務進行配置和管理。這使得開發人員和運維人員可以更輕鬆地設置、運行和擴展複雜的應用程式。
Docker Compose 的工作原理是使用 YAML 檔案來定義應用程式的服務。該檔案指定了每個服務所需的容器映像、埠映射、環境變數和其他配置選項。Docker Compose 然後使用這些信息來啟動和管理容器。
本教學將帶領你進入 Docker Compose的世界,介紹如何用 YAML檔案定義你要實作的服務,如你想要做Wordpress服務,你可以定義Wordpress容器與Mysql容器,並且命名成一個服務,即可快速打造你要的各種開發環境。
Table of Contents
Docker Compose基本工作流程
建立一個名為docker-compose.yml的YAML檔案,內容定義了所需應用程式的容器服務,可定義1個以上的容器設定,當你定義完成後系統依照以下步驟啟動容器。
- 開啟終端機(windows上請用powershell),在docker-compose.yml所在的目錄下, 輸入docker-compose up 命令即可開始運行。※建議可以依照功能命名目錄名稱,之後會比較好找。
- Docker Compose 讀取 YAML 檔案並創建和啟動每個服務的容器。
- 應用程式將在容器中運行。
docker-compose.yml 文件結構說明
version:指定 Compose 文件的版本。目前最新的 Compose 文件版本是 3.9。
services:定義應用程序中的一組服務。每個服務都由以下部分組成:
- image:指定服務使用的容器映像。
- command:指定在容器啟動時執行的命令。
- ports:指定容器的端口映射,左邊是 host 的 port 號,右邊是 container 的 port 號。
- volumes:指定容器的掛載volume,左邊是 host 路徑,右邊是 container 路徑。
- environment:指定容器的環境變數。
- depends_on:指定服務的啟動順序,它允許您定義特定服務依賴哪些服務,以確保在啟動服務本身之前,依賴服務已啟動並運行。這有助於維護應用程序的正確啟動順序。
- networks:指定服務使用的網絡。
docker-compose.yml範例
version: "3.9"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/var/www/html
db:
image: postgres:latest
environment:
POSTGRES_PASSWORD: mypassword
以上範例docker-compose.yml定義了一個名為 “web” 的 Web 服務和一個名為 “db” 的數據庫服務。Web 服務使用 Nginx 映像,並將端口 80 映射到容器的端口 80。Web 服務還掛載了本地目錄 ./html 到容器的 /var/www/html 目錄。數據庫服務使用 PostgreSQL 映像,並設置了環境變數 POSTGRES_PASSWORD 的值為 mypassword。
Docker Compose 指令
up – 啟動應用程序的所有服務
docker-compose up
up -d – 啟動docker-compose.yaml中定義的所有服務,並且在背景執行★
docker-compose up -d
up -b – 構建容器而不啟動
docker-compose up -b
up -f – 指定不同的 Docker Compose 配置文件
docker-compose -f docker-compose.dev.yml up
#也可以讓他在背景執行
docker-compose -f docker-compose.dev.yml up -d
※日常在開發時候,會有不同的環境,如dev、test、stage、prod等開發環境,如果你有不同環境的需求,可以用Docker的Extend,他會依序載入檔案,並且後載入的會override 之前載入的檔案,在執行up直令時候,加上 『 -f 』即可指定多環境,相關檔案名稱命名法為docker-compose.override.yml
#預設環境的docker-compose
docker-compose -f docker-compose.yml up
#開發環境的docker-compose。
docker-compose -f docker-compose.dev.yml up
#測試環境的docker-compose
docker-compose -f docker-compose.test.yml up
#UAT的docker-compose
docker-compose -f docker-compose.stage.yml up
#正式環境的docker-compose
docker-compose -f docker-compose.production.yml up
docker-compose.yml內容
version: '3.9'
services:
nginx:
image: nginx:stable-alpine
ports:
- 127.0.0.1:8080:80
environment:
- TEST_VAR_0=0
- DEBUG=true
- WP_DEBUG_DISPLAY=false
docker-compose.dev.yml內容
version: '3.9'
services:
nginx:
ports:
- 8090:80
environment:
- TEST_VAR_1=1
- DEBUG=false
- WP_DEBUG_DISPLAY=true
執行的時候依序輸入yaml的設定檔案,則會依序執行docker-compose.ym->docker-compose.dev.yml 後面會蓋掉前面的
docker-compose \
-f docker-compose.yml \
-f docker-compose.dev.yml \
up
如果這時候透過docker-compose exec nginx sh,你可以將docker-compose.ym與docker-compose.dev.yml 的相關環境變數印出
- echo $TEST_VAR_0=>0
- echo $TEST_VAR_1=>1
- echo $DEBUG=>false
- echo $WP_DEBUG_DISPLAY=>true
down – 停止並刪除應用程序的所有服務★
docker-compose down
ps – 列出應用程序的所有服務★
docker-compose ps
logs – 查看應用程序的日誌
docker-compose logs
exec – 在容器中執行命令
docker-compose exec
※打 ★ 的為常用指令
docker compose CLI 指令指南
用法:
docker compose [選項] 命令
選項:
--ansi 字串 控制何時列印 ANSI 控制字元(“never” | “always” | “auto”)(預設值 “auto”)
--compatibility 以向後相容模式運行 Compose
--dry-run 以幹運行模式執行命令
--env-file 字串陣列 指定替代的環境檔
-f, --file 字串陣列 Compose 設定檔
--parallel 整數 控制最大並行度,-1 表示不限(預設值 -1)
--profile 字串陣列 指定要啟用的設定檔
--progress 字串 設置進度輸出類型(auto、tty、plain、quiet)(預設值 “auto”)
--project-directory 字串 指定替代的工作目錄(預設值:第一個指定 Compose 檔的路徑)
-p, --project-name 字串 專案名稱
命令:
attach 將本地標準輸入、輸出和錯誤流附加到服務的運行容器。
build 構建或重建服務
config 解析、解析和呈現規範格式的 Compose 檔
cp 在服務容器和本地檔案系統之間複製檔/資料夾
create 創建服務的容器。
down 停止並刪除容器、網路
events 從容器接收即時事件。
exec 在運行的容器中執行命令。
images 列出創建的容器使用的鏡像
kill 強制停止服務容器。
logs 查看來自容器的輸出
ls 列出正在運行的 Compose 專案
pause 暫停服務
port 列印埠綁定的公共埠。
ps 列出容器
pull 拉取服務鏡像
push 推送服務鏡像
restart 重新開機服務容器
rm 刪除已停止的服務容器
run 在服務上運行一次性命令。
scale 縮放服務
start 啟動服務
stats 顯示容器資源使用情況統計資訊的即時流
stop 停止服務
top 顯示正在運行的進程
unpause 取消暫停服務
up 創建並啟動容器
version 顯示 Docker Compose 版本資訊
wait 阻塞直到第一個服務容器停止
watch 監視服務的構建上下文,並在檔更新時重新構建/刷新容器
要了解更多关于某个命令的信息,请运行 docker compose 命令 --help。
Docker Compose優點
- 簡化部署:
- Docker Compose 可以將整個應用程序以一個單一命令部署到不同環境中,包括開發、測試和生產環境。
- 可擴展性:
- Docker Compose 支持應用程式的擴展,您可以根據需要添加更多的容器服務,並根據需要調整配置。
- 易於管理:
- Docker Compose 提供了一套命令來管理應用程序,這使得管理多個容器變得更加容易。
environment 變數補充說明
在 Docker Compose 中,environment 變數可以使用 =
或 :
來指定變數值。兩種語法在功能上沒有區別,但它們在語法和可讀性方面略有不同。
使用 =
指定變數值
version: '3'
services:
nginx:
image: nginx:stable-alpine
ports:
- 127.0.0.1:8080:80
environment:
- WORDPRESS_DB_HOSTT=192.168.0.1:3306
- WORDPRESS_DB_USERT=dbuser
- WORDPRESS_DB_PASSWORDT=password
- WORDPRESS_DB_NAMET=mywordpress
- WORDPRESS_WP_HOMET=http://example.com
使用 :
指定變數值
version: '3'
services:
nginx:
image: nginx:stable-alpine
ports:
- 127.0.0.1:8080:80
environment:
WORDPRESS_DB_HOST: 192.168.0.1:3306
WORDPRESS_DB_USER: dbuser
WORDPRESS_DB_PASSWORD: password
WORDPRESS_DB_NAME: mywordpress
WORDPRESS_WP_HOME: http://example.com
※如果要驗證變數在容器內的值目前內容,可以透過docker-compose exec nginx sh來驗證,測試、故障排除或執行管理任務。它提供了一個交互式 shell 環境,您可以在其中直接與容器的文件系統、進程和網絡進行互動。
語法如下
docker-compose exec nginx sh
範例:假設您想檢查 nginx 容器內 /var/log/nginx/access.log 文件的內容。您可以使用以下命令
docker-compose exec nginx sh -c "cat /var/log/nginx/access.log"
Reference
- Docker 官方文件-Docker Compose overview
- Docker 官方文件-Overview of docker compose CLI
- Dockerfile CheatSheet
- docker-compose CheatSheet
你好,我是RD爸,希望透過我的紀錄,可以帶給你一些新的想法~ 專注於各式3C產品的開箱評測、程式相關技術及理財筆記。
email ►[email protected]