使用 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
定義應用程式服務
在 第 7 部分 中,你使用了以下命令來啟動應用程式服務。
$ 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
通常,你會在
image
定義附近看到command
,儘管對順序沒有要求。將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
服務名稱會顯示在行的開頭(通常是彩色的),以幫助區分訊息。如果你想檢視特定服務的日誌,可以將服務名稱新增到日誌命令的末尾(例如,
docker compose logs -f app
)。至此,你應該能夠在瀏覽器中開啟你的應用程式,地址為 https://:3000 並檢視它是否正在執行。
在 Docker 儀表盤中檢視應用程式堆疊
如果你檢視 Docker 儀表盤,你會看到一個名為 getting-started-app 的組。這是 Docker Compose 的專案名稱,用於將容器分組在一起。預設情況下,專案名稱就是 compose.yaml
所在目錄的名稱。
如果你展開堆疊,你會看到在 Compose 檔案中定義的兩個容器。名稱也更加描述性,因為它們遵循 <service-name>-<replica-number>
的模式。因此,很容易快速地檢視哪個容器是你的應用程式,哪個容器是 mysql 資料庫。
全部拆除
當你準備好將所有內容拆除時,只需執行 docker compose down
或在 Docker 儀表盤中單擊整個應用程式的垃圾桶圖示即可。容器將停止,網路將被刪除。
警告
預設情況下,當你執行
docker compose down
時,compose 檔案中的命名卷不會被刪除。如果你想刪除卷,你需要新增--volumes
標誌。當你刪除應用程式堆疊時,Docker 儀表盤不會刪除卷。
總結
在本節中,你瞭解了 Docker Compose,以及它如何幫助你簡化定義和共享多服務應用程式的方式。
相關資訊
下一步
接下來,你將學習一些可以用來改進你的 Dockerfile 的最佳實踐。