使用 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"
现在,迁移
-p 127.0.0.1:3000:3000
部分,方法是定义ports
对于服务。services: 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 卷定义的一个优点是您可以使用当前目录中的相对路径。
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
因此,它会自动获取 Network 别名。此外,还要指定要使用的镜像。services: app: # The app service definition mysql: image: mysql:8.0
接下来,定义卷映射。当您使用
docker run
,Docker 会自动创建命名卷。然而,事实并非如此 在使用 Compose 运行时发生。您需要在 顶级volumes:
部分,然后在 Service 中指定挂载点 config。通过仅提供卷名称,默认选项为 使用。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
标志跟随 log 的 log 函数,因此会在生成实时输出时为您提供实时输出。如果您已经运行了该命令,您将看到如下所示的输出:
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
).此时,您应该能够在 http://localhost:3000 上的浏览器中打开您的应用程序并看到它正在运行。
在 Docker Desktop Dashboard 中查看应用程序堆栈
如果您查看 Docker Desktop Dashboard,您将看到一个名为 getting-started-app 的组。这是 Docker 中的项目名称
Compose 和 used 将容器组合在一起。默认情况下,项目名称只是compose.yaml
位于。
如果展开堆栈,您将看到您在 Compose 文件中定义的两个容器。名字也有点
更具描述性,因为它们遵循<service-name>-<replica-number>
.所以,这很容易
快速查看哪个容器是您的应用程序,哪个容器是 MySQL 数据库。
全部拆除
当您准备好将其全部拆除时,只需运行docker compose down
或者去 Docker Desktop Dashboard 上的垃圾桶
对于整个应用程序。容器将停止,网络将被删除。
警告
默认情况下,当您运行
docker compose down
.如果您想 删除卷,您需要添加--volumes
旗。当您删除应用程序堆栈时,Docker Desktop Dashboard 不会删除卷。
总结
在本节中,您了解了 Docker Compose 以及它如何帮助您简化 定义和共享多服务应用程序的方式。
相关信息:
后续步骤
接下来,您将了解一些可用于改进 Dockerfile 的最佳实践。