Docker Compose 快速入門
本教學旨在透過引導您開發一個基本的 Python 網頁應用程式,來介紹 Docker Compose 的基本概念。
該應用程式使用 Flask 框架,包含一個基於 Redis 的點擊計數器,提供了一個實用的範例,說明 Docker Compose 如何應用於網頁開發情境。
即使您不熟悉 Python,這裡展示的概念也應該是易於理解的。
這是一個非規範性的範例,用於展示 Compose 的核心功能。
先決條件
請確認您已具備
- 安裝最新版本的 Docker Compose
- 對 Docker 概念和其運作方式有基本了解
步驟 1:設定
建立專案目錄
$ mkdir composetest $ cd composetest在您的專案目錄中建立一個名為
app.py的檔案,並貼上以下程式碼import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return f'Hello World! I have been seen {count} times.\n'在此範例中,
redis是應用程式網路中 redis 容器的主機名稱,並使用預設埠號6379。注意請注意
get_hit_count函式的寫法。這個基本的重試迴圈會在 Redis 服務不可用時多次嘗試請求。這在應用程式啟動時很有用,也能讓應用程式在 Redis 服務於其生命週期中需要重新啟動時更具彈性。在叢集中,這也有助於處理節點之間短暫的連線中斷。在您的專案目錄中建立另一個名為
requirements.txt的檔案,並貼上以下程式碼flask redis建立一個
Dockerfile,並貼上以下程式碼# syntax=docker/dockerfile:1 FROM python:3.10-alpine WORKDIR /code ENV FLASK_APP=app.py ENV FLASK_RUN_HOST=0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt EXPOSE 5000 COPY . . CMD ["flask", "run", "--debug"]這會指示 Docker:
- 從 Python 3.10 映像檔開始建置一個映像檔。
- 設定工作目錄為
/code。 - 設定
flask指令使用的環境變數。 - 安裝 gcc 和其他依賴項
- 複製
requirements.txt並安裝 Python 依賴項。 - 將中繼資料新增至映像檔,以說明容器正在監聽埠號 5000
- 將專案中的當前目錄
.複製到映像檔中的工作目錄.。 - 設定容器的預設指令為
flask run --debug。
重要請檢查
Dockerfile沒有.txt等檔案副檔名。有些編輯器可能會自動附加此副檔名,導致您執行應用程式時發生錯誤。有關如何撰寫 Dockerfile 的更多資訊,請參閱 Dockerfile 參考資料。
步驟 2:在 Compose 檔案中定義服務
Compose 簡化了對整個應用程式堆疊的控制,使得在單一、易於理解的 YAML 配置檔中管理服務、網路和儲存卷變得輕而易舉。
在您的專案目錄中建立一個名為 compose.yaml 的檔案,並貼上以下內容
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"這個 Compose 檔案定義了兩個服務:web 和 redis。
web 服務使用從當前目錄中的 Dockerfile 建置的映像檔。然後,它將容器和主機機器的暴露埠號 8000 綁定。這個範例服務使用 Flask 網頁伺服器的預設埠號 5000。
redis 服務使用從 Docker Hub 註冊表拉取的公共 Redis 映像檔。
有關 compose.yaml 檔案的更多資訊,請參閱 Compose 的運作方式。
步驟 3:使用 Compose 建置並執行應用程式
透過單一指令,您可以從配置檔建立並啟動所有服務。
從您的專案目錄中,執行
docker compose up來啟動您的應用程式。$ docker compose up Creating network "composetest_default" with the default driver Creating composetest_web_1 ... Creating composetest_redis_1 ... Creating composetest_web_1 Creating composetest_redis_1 ... done Attaching to composetest_web_1, composetest_redis_1 web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) redis_1 | 1:C 17 Aug 22:11:10.480 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo redis_1 | 1:C 17 Aug 22:11:10.480 # Redis version=4.0.1, bits=64, commit=00000000, modified=0, pid=1, just started redis_1 | 1:C 17 Aug 22:11:10.480 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf web_1 | * Restarting with stat redis_1 | 1:M 17 Aug 22:11:10.483 * Running mode=standalone, port=6379. redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. web_1 | * Debugger is active! redis_1 | 1:M 17 Aug 22:11:10.483 # Server initialized redis_1 | 1:M 17 Aug 22:11:10.483 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. web_1 | * Debugger PIN: 330-787-903 redis_1 | 1:M 17 Aug 22:11:10.483 * Ready to accept connectionsCompose 會拉取 Redis 映像檔,為您的程式碼建置映像檔,並啟動您定義的服務。在此情況下,程式碼會在建置時靜態複製到映像檔中。
在瀏覽器中輸入
https://:8000/以查看應用程式執行。如果無法解析,您也可以嘗試
http://127.0.0.1:8000。您應該會在瀏覽器中看到一條訊息,內容是
Hello World! I have been seen 1 times.

重新整理頁面。
數字應該會增加。
Hello World! I have been seen 2 times.

切換到另一個終端機視窗,並輸入
docker image ls以列出本地映像檔。此時列出映像檔應該會返回
redis和web。$ docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE composetest_web latest e2c21aa48cc1 4 minutes ago 93.8MB python 3.4-alpine 84e6077c7ab6 7 days ago 82.5MB redis alpine 9d8fa9aa0e5b 3 weeks ago 27.5MB您可以使用
docker inspect <標籤或ID>來檢查映像檔。停止應用程式,可以透過在第二個終端機中從專案目錄內執行
docker compose down,或是在啟動應用程式的原始終端機中按下CTRL+C。
步驟 4:編輯 Compose 檔案以使用 Compose Watch
編輯專案目錄中的 compose.yaml 檔案以使用 watch,這樣您就可以預覽正在執行的 Compose 服務,這些服務會在您編輯並儲存程式碼時自動更新。
services:
web:
build: .
ports:
- "8000:5000"
develop:
watch:
- action: sync
path: .
target: /code
redis:
image: "redis:alpine"每當檔案更改時,Compose 會將檔案同步到容器內 /code 下的相應位置。複製後,套件工具會更新正在執行的應用程式而無需重新啟動。
有關 Compose Watch 如何運作的更多資訊,請參閱 使用 Compose Watch。或者,請參閱 在容器中管理資料 以獲取其他選項。
注意為了使此範例正常運作,
--debug選項已新增到Dockerfile中。Flask 中的--debug選項啟用自動程式碼重新載入,使得無需重新啟動或重新建置容器即可在後端 API 上工作。更改.py檔案後,後續的 API 呼叫將使用新程式碼,但在這個小範例中,瀏覽器 UI 不會自動重新整理。大多數前端開發伺服器都包含與 Compose 搭配使用的原生即時重新載入支援。
步驟 5:使用 Compose 重新建置並執行應用程式
從您的專案目錄中,輸入 docker compose watch 或 docker compose up --watch 來建置並啟動應用程式,並開始檔案監看模式。
$ docker compose watch
[+] Running 2/2
✔ Container docs-redis-1 Created 0.0s
✔ Container docs-web-1 Recreated 0.1s
Attaching to redis-1, web-1
⦿ watch enabled
...
再次在網頁瀏覽器中檢查 Hello World 訊息,並重新整理以查看計數增加。
步驟 6:更新應用程式
要查看 Compose Watch 的實際運作:
更改
app.py中的問候語並儲存。例如,將Hello World!訊息更改為Hello from Docker!return f'Hello from Docker! I have been seen {count} times.\n'在您的瀏覽器中重新整理應用程式。問候語應該已更新,且計數器仍應持續增加。

完成後,執行
docker compose down。
步驟 7:拆分你的服務
使用多個 Compose 檔案可讓您為不同的環境或工作流程自訂 Compose 應用程式。這對於可能使用數十個容器,且所有權分散在多個團隊之間的大型應用程式非常有用。
在您的專案資料夾中,建立一個名為
infra.yaml的新 Compose 檔案。從您的
compose.yaml檔案中剪下 Redis 服務,並貼到您的新infra.yaml檔案中。請確保您在檔案頂部新增services頂層屬性。您的infra.yaml檔案現在應該如下所示services: redis: image: "redis:alpine"在您的
compose.yaml檔案中,新增include頂層屬性,並附帶infra.yaml檔案的路徑。include: - infra.yaml services: web: build: . ports: - "8000:5000" develop: watch: - action: sync path: . target: /code執行
docker compose up以使用更新後的 Compose 檔案建置並執行應用程式。您應該會在瀏覽器中看到Hello world訊息。
這是一個簡化的範例,但它展示了 include 的基本原理,以及它如何使複雜應用程式更容易模組化為子 Compose 檔案。有關 include 和使用多個 Compose 檔案的更多資訊,請參閱 使用多個 Compose 檔案。
步驟 8:嘗試其他指令
如果您想在背景執行您的服務,可以將
-d旗標 (表示「分離模式」) 傳遞給docker compose up,並使用docker compose ps查看目前正在執行的內容。$ docker compose up -d Starting composetest_redis_1... Starting composetest_web_1... $ docker compose ps Name Command State Ports ------------------------------------------------------------------------------------- composetest_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp composetest_web_1 flask run Up 0.0.0.0:8000->5000/tcp執行
docker compose --help以查看其他可用的指令。如果您使用
docker compose up -d啟動了 Compose,請在完成後停止您的服務。$ docker compose stop您可以使用
docker compose down指令停止所有內容,並完全移除容器。