使用 Docker Compose
Docker Compose 是一種協助您定義並共享多容器應用程式的工具。透過 Compose,您可以建立一個 YAML 檔案來定義服務,並只需一行指令,即可啟動或關閉所有內容。
使用 Compose 的一大優勢是,您可以將應用程式堆疊定義在一個檔案中,保留在專案儲存庫的根目錄中(這現在是版本控制的),並輕鬆讓其他人為您的專案做出貢獻。其他人只需要複製您的儲存庫並使用 Compose 啟動應用程式即可。事實上,您現在可能會看到不少 GitHub/GitLab 上的專案正是這樣做的。
建立 Compose 檔案
在 getting-started-app 目錄中,建立一個名為 compose.yaml 的檔案。
├── getting-started-app/
│ ├── Dockerfile
│ ├── compose.yaml
│ ├── node_modules/
│ ├── package.json
│ ├── spec/
│ ├── src/
│ └── yarn.lock定義應用程式服務
在第 6 部分中,您使用了下列指令來啟動應用程式服務。
$ docker run -dp 127.0.0.1:3000:3000 \
-w /app -v "$(pwd):/app" \
--network todo-app \
-e MYSQL_HOST=mysql \
-e MYSQL_USER=root \
-e MYSQL_PASSWORD=secret \
-e MYSQL_DB=todos \
node:18-alpine \
sh -c "yarn install && yarn run dev"
現在,您將在 compose.yaml 檔案中定義此服務。
在文字或程式碼編輯器中開啟
compose.yaml,並首先定義您想要作為應用程式一部分執行的第一個服務(或容器)的名稱和映像檔。名稱將自動成為網路別名,這在定義 MySQL 服務時非常有用。services: app: image: node:18-alpine通常,您會看到
command緊跟在image定義之後,儘管對順序沒有強制要求。將command新增到您的compose.yaml檔案中。services: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev"現在,透過定義服務的
ports,遷移指令的-p 127.0.0.1:3000:3000部分。services: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev" ports: - 127.0.0.1:3000:3000接下來,透過使用
working_dir和volumes定義,遷移工作目錄 (-w /app) 和磁碟區對應 (-v "$(pwd):/app")。Docker Compose 磁碟區定義的一大優勢是,您可以使用相對於當前目錄的路徑。
services: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev" ports: - 127.0.0.1:3000:3000 working_dir: /app volumes: - ./:/app最後,您需要使用
environment金鑰來遷移環境變數定義。services: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev" ports: - 127.0.0.1:3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos
定義 MySQL 服務
現在,是時候定義 MySQL 服務了。您為該容器使用的指令如下
$ docker run -d \
--network todo-app --network-alias mysql \
-v todo-mysql-data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
-e MYSQL_DATABASE=todos \
mysql:8.0
首先定義新服務並將其命名為
mysql,以便它自動取得網路別名。同時指定要使用的映像檔。services: app: # The app service definition mysql: image: mysql:8.0接下來,定義磁碟區對應。當您使用
docker run執行容器時,Docker 會自動建立命名磁碟區。但是,使用 Compose 執行時不會自動發生這種情況。您需要在頂層的volumes:區段中定義磁碟區,然後在服務設定中指定掛載點。只需提供磁碟區名稱,就會使用預設選項。services: app: # The app service definition mysql: image: mysql:8.0 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data:最後,您需要指定環境變數。
services: app: # The app service definition mysql: image: mysql:8.0 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:
此時,您完整的 compose.yaml 應該如下所示
services:
app:
image: node:18-alpine
command: sh -c "yarn install && yarn run dev"
ports:
- 127.0.0.1:3000:3000
working_dir: /app
volumes:
- ./:/app
environment:
MYSQL_HOST: mysql
MYSQL_USER: root
MYSQL_PASSWORD: secret
MYSQL_DB: todos
mysql:
image: mysql:8.0
volumes:
- todo-mysql-data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: todos
volumes:
todo-mysql-data:執行應用程式堆疊
既然您已經有了 compose.yaml 檔案,就可以啟動您的應用程式了。
首先確保沒有其他容器副本正在執行。使用
docker ps列出容器,並使用docker rm -f <ids>將其移除。使用
docker compose up指令啟動應用程式堆疊。新增-d旗標以在背景執行所有內容。$ docker compose up -d當您執行上述指令時,您應該會看到類似以下的輸出
Creating network "app_default" with the default driver Creating volume "app_todo-mysql-data" with default driver Creating app_app_1 ... done Creating app_mysql_1 ... done您會注意到 Docker Compose 建立了磁碟區以及網路。預設情況下,Docker Compose 會自動為應用程式堆疊建立一個特定的網路(這就是為什麼您不需要在 Compose 檔案中定義一個)。
使用
docker compose logs -f指令查看日誌。您將看到來自每個服務的日誌交錯成單一串流。當您想要監控與時間相關的問題時,這非常有用。-f旗標會跟隨日誌,因此會在其生成時為您提供即時輸出。如果您已經執行過該指令,您將看到如下所示的輸出
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000服務名稱顯示在行首(通常有顏色)以協助區分訊息。如果您想查看特定服務的日誌,可以在 logs 指令末尾新增服務名稱(例如,
docker compose logs -f app)。此時,您應該能夠在瀏覽器中開啟 https://:3000 並查看應用程式執行。
在 Docker Desktop 儀表板中查看應用程式堆疊
如果您查看 Docker Desktop 儀表板,您會看到有一個名為 getting-started-app 的群組。這是來自 Docker Compose 的專案名稱,用於將容器分組在一起。預設情況下,專案名稱即為 compose.yaml 所在目錄的名稱。
如果您展開該堆疊,您將看到您在 Compose 檔案中定義的兩個容器。名稱也更具描述性,因為它們遵循 <service-name>-<replica-number> 的模式。因此,可以非常輕鬆地快速看出哪個容器是您的應用程式,哪個容器是 mysql 資料庫。
拆除一切
當您準備好拆除一切時,只需執行 docker compose down,或點擊 Docker Desktop 儀表板上整個應用程式的垃圾桶圖示。容器將會停止,網路將會被移除。
警告預設情況下,當您執行
docker compose down時,Compose 檔案中的命名磁碟區不會被移除。如果您想移除磁碟區,則需要新增--volumes旗標。當您刪除應用程式堆疊時,Docker Desktop 儀表板不會移除磁碟區。
總結
在本節中,您了解了 Docker Compose,以及它如何協助您簡化定義和共享多服務應用程式的方式。
相關資訊
下一步
接下來,您將了解一些可用於改善 Dockerfile 的最佳實踐。
映像檔構建最佳實踐