简介
Docker Compose 是一种工具,用于帮助定义和共享多容器应用程序。 通过 Compose,你可以创建 YAML 文件来定义服务,并且只需一个命令,就可以启动或清理所有内容。
使用 Compose 的巨大优点是,你可以在文件中定义应用程序堆栈,使其位于项目存储库的根目录下(它现在受版本控制),并方便其他人参与你的项目。 其他人只需克隆你的存储库即可开始撰写应用。 事实上,你可能会看到 GitHub/GitLab 上的很多项目现在都是这样做的。
那么,如何开始?
Docker Compose的使用步骤
1、安装 Docker Compose
如果你为 Windows 或 Mac 安装了 Docker Desktop,则你已拥有 Docker Compose! Play-with-Docker 实例也已安装 Docker Compose。 如果你使用的是 Linux 计算机,则需要按照此处的说明安装 Docker Compose。
安装教程
安装后,你应该能够运行以下内容并查看版本信息。
docker-compose version
2、创建 Compose 文件
在应用项目的根目录中,创建名为 docker-compose.yml 的文件。
在 Compose 文件中,我们将首先定义架构版本。 在大多数情况下,最好使用支持的最新版本。 你可以查看 Compose 文件参考获取当前架构版本和兼容性矩阵。
version: "3.7"
接下来,定义要作为应用程序的一部分运行的服务(或容器)列表。
version: "3.7" services:
现在,你将开始一次将服务迁移到 Compose 文件中。
3、定义应用服务
请记住,这是用于定义应用容器的命令(在 Windows PowerShell 中,请将 ` 字符替换为 \)。
docker run -dp 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:12-alpine \ sh -c "yarn install && yarn run dev"
首先,定义容器的服务项和映像。 你可为服务选择任何名称。 该名称将自动成为网络别名,这在定义 MySQL 服务时非常有用。
version: "3.7" services: app: image: node:12-alpine
通常,你会看到命令接近 image 定义,尽管对排序没有要求。 接下来,将其移到该文件中。
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev"
通过为服务定义 ports 来迁移命令的 -p 3000:3000 部分。 你将在此使用短语法,但此处还提供了更详细的长语法。
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000
接下来,使用 working_dir 和 volumes 定义迁移工作目录 (-w /app) 和卷映射 (-v ${PWD}:/app)。 卷还有短语法和长语法。
Docker Compose 卷定义的一个优点是你可以使用当前目录中的相对路径。
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app
最后,使用 environment 键迁移环境变量定义。
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos
定义 MySQL 服务
现在,可以定义 MySQL 服务了。 用于该容器的命令如下(在 Windows PowerShell 中,请将 \ 字符替换为 `):
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:5.7
首先,定义新服务并将其命名为 mysql,以便它自动获取网络别名。 同时指定要使用的映像。
version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7
接下来,定义卷映射。 使用 docker run 运行容器时,会自动创建命名卷。 但是,使用 Compose 运行时,则不会。 你需要在最上面的 volumes: 部分定义卷,然后在服务配置中指定装载点。只需仅提供卷名,即可使用默认选项。 不过,还有很多可用选项。
version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql volumes: todo-mysql-data:
最后,只需指定环境变量。
version: "3.7" services: app: # The app service definition mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:
此时,完整的 docker-compose.yml 应如下所示:
version: "3.7" services: app: image: node:12-alpine command: sh -c "yarn install && yarn run dev" ports: - 3000:3000 working_dir: /app volumes: - ./:/app environment: MYSQL_HOST: mysql MYSQL_USER: root MYSQL_PASSWORD: secret MYSQL_DB: todos mysql: image: mysql:5.7 volumes: - todo-mysql-data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: todos volumes: todo-mysql-data:
4、运行应用程序堆栈
现在你已经有了 docker-compose.yml 文件,启动它吧!
首先,确保应用和数据库的其他副本未运行(docker ps 和 docker rm -f <ids>)。
使用 docker-compose up 命令启动应用程序堆栈。 添加 -d 标志以在后台运行所有内容。 或者,你可以右键单击 Compose 文件,然后选择 VS Code 侧边栏上的“启动”选项。
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 会自动创建一个专门针对应用程序堆栈的网络(这就是为什么你在 Compose 文件中没有定义网络)。
使用 docker-compose logs -f 命令查看日志。 你将看到来自每个服务的日志交汇形成一个流。 当你想要关注与时间相关的问题时,这非常有用。 -f 标志指示“跟踪”日志,因此会在生成时显示实时输出。
如果尚未这样做,你会看到如下所示的输出:
mysql_1 | 2019-10-03T03:07:16.083639Z 0 [Note] mysqld: ready for connections. mysql_1 | Version: '5.7.27' 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)。
提示
在启动应用前等待 DB 当应用启动时,它实际上会等待 MySQL 启动并准备就绪,然后再尝试连接到它。Docker 没有任何内置支持,无法等待另一个容器完全启动、运行并准备就绪,然后再启动另一个容器。 对于基于节点的项目,你可以使用 wait-port 依赖项。 其他语言/框架有类似的项目。
此时,你应能够打开应用并看到它正在运行。 嗨! 你只需要一个命令!
全部清理
当你准备好全部清理时,只需运行 docker-compose down
,或者在 VS Code Docker 扩展的容器列表中,右键单击应用程序,然后选择“停止”。 容器将停止,网络将删除。
警告
删除卷 默认情况下,运行 docker-compose down 时,Compose 文件中的命名卷不会删除。 如果要删除卷,则需要添加 --volumes 标志。
清理后,你可以切换到另一个项目,运行 docker-compose up,并准备好参与该项目! 真的没有比这更简单的了!
概括
在本部分中,你了解了 Docker Compose,以及它如何帮助显著简化多服务应用程序的定义和共享。 你通过将所使用的命令转换为适当的 Compos 格式,创建了 Compos 文件。