使用 Docker Compose
原文:https://docs.docker.com/get-started/08_using_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 服务时很有用。yamlservices: app: image: node:18-alpine
通常,您会在
image
定义附近看到command
,尽管没有顺序要求。在您的compose.yaml
文件中添加command
。yamlservices: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev"
接下来,迁移
-p 127.0.0.1:3000:3000
部分的命令,通过定义服务的ports
。yamlservices: app: image: node:18-alpine command: sh -c "yarn install && yarn run dev" ports: - 127.0.0.1:3000:3000
接下来,迁移工作目录(
-w /app
)和卷映射(-v "$(pwd):/app"
),使用working_dir
和volumes
定义。Docker Compose 卷定义的一个优点是您可以使用当前目录的相对路径。
yamlservices: 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
键迁移环境变量定义。yamlservices: 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
,这样它就自动获得网络别名。还要指定使用的镜像。yamlservices: app: # app 服务定义 mysql: image: mysql:8.0
接下来,定义卷映射。当您使用
docker run
运行容器时,Docker 自动创建了命名卷。然而,使用 Compose 运行时不会发生这种情况。您需要在顶级volumes:
部分定义卷,然后在服务配置中指定挂载点。仅提供卷名称时,将使用默认选项。yamlservices: app: # app 服务定义 mysql: image: mysql:8.0 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data:
最后,您需要指定环境变量。
yamlservices: app: # app 服务定义 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
标志以在后台运行所有内容。consoledocker compose up -d
运行前述命令时,您应该看到如下输出:
plaintextCreating 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
标志跟随日志,因此将为您提供实时输出。如果您已经运行了该命令,您将看到如下输出:
plaintextmysql_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: 3306MySQL Community Server (GPL) app_1 | Connected to mysql db at host mysql app_1 | Listening on port 3000
服务名显示在行首(通常有颜色)以帮助区分消息。如果您想查看特定服务的日志,可以在日志命令的末尾添加服务名(例如,
docker compose logs -f app
)。此时,您应该能够在浏览器中打开 http://localhost:3000 并看到它在运行。
在 Docker Dashboard 中查看应用堆栈
如果您查看 Docker Dashboard,您会看到一个名为 getting-started-app 的组。这是 Docker Compose 的项目名,用于将容器组合在一起。默认情况下,项目名就是 compose.yaml
所在目录的名称。
如果您展开堆栈,您将看到您在 Compose 文件中定义的两个容器。这些名称也更具描述性,因为它们遵循 <service-name>-<replica-number>
的模式。因此,很容易快速看出哪个容器是您的应用,哪个容器是 mysql 数据库。
拆除所有内容
当您准备拆除所有内容时,只需运行 docker compose down
或在 Docker Dashboard 上为整个应用点击垃圾桶图标。容器将停止,网络将被删除。
WARNING
警告
默认情况下,当您运行
docker compose down
时,您的 compose 文件中的命名卷不会被删除。如果您想删除卷,您需要添加--volumes
标志。Docker Dashboard 在删除应用堆栈时不会删除卷。
总结
在本节中,您了解了 Docker Compose 以及它如何帮助您简化定义和共享多服务应用的方式。
相关信息:
下一步
接下来,您将学习一些最佳实践,可以用来改进您的 Dockerfile。