Logo
Section 1 / 7

Docker Compose 说明

开始使用 Docker Compose

导入

Docker Compose 说明

开始使用 Docker Compose

简介

Docker Compose 是一个工具,可以通过一条命令组合并运行多个相互关联的服务容器。它允许你将应用程序的所有依赖项集中定义在一个地方,然后只需执行一条简单的命令 docker-compose up,Docker 就会自动运行所有这些服务。

如果你在本地机器上跟随本课程,请记得从官方文档网站安装 Docker Compose。

使用 git clone https://github.com/venky8283/Docker.git 克隆代码仓库。
输入 git checkout 4de325cf1da2428e757be4f2bcc53f35c384c598 可以切换到本节课所用的代码版本。

下面是一个 Docker Compose 文件的示例,它将 MySQL 数据库服务与一个使用 Python Flask 实现简单登录和登出功能的 Web 应用程序组合在一起。

1version: '3' 2services: 3 web: 4 # Dockerfile 的路径 5 # '.' 表示当前目录,即 docker-compose.yml 所在的位置 6 build: . 7 8 # 将容器端口映射到主机端口 9 ports: 10 - "5000:5000" 11 12 # 挂载数据卷 13 volumes: 14 - "/usercode/:/code" 15 16 # 将数据库容器链接到应用容器,确保可访问性 17 links: 18 - "database:backenddb" 19 20 database: 21 # 从 Docker Hub 获取的镜像 22 image: mysql/mysql-server:5.7 23 24 # 启动脚本使用的环境变量 25 # 容器将使用这些变量来启动 26 environment: 27 - "MYSQL_ROOT_PASSWORD=root" 28 - "MYSQL_USER=testuser" 29 - "MYSQL_PASSWORD=admin123" 30 - "MYSQL_DATABASE=backend" 31 32 # 挂载 init.sql 文件,用于自动执行并创建表 33 # /docker-entrypoint-initdb.d 目录下的所有文件会在容器启动后立即执行 34 volumes: 35 - "/usercode/db/init.sql:/docker-entrypoint-initdb.d/init.sql"

Docker Compose 文件详解

Compose 文件采用 YAML 格式,这是一种非常简洁的语言。你可以使用任意在线验证工具来检查 YAML 文件是否正确。这里提供一个参考工具。

接下来,我们逐行解析这个 Docker Compose 文件。

  • version '3':与其他软件一样,Docker Compose 也从 1.0 版本开始。撰写本课程时,最新的 Compose 文件版本为 3.7。

    我们指定了要使用的 Compose 文件版本,Docker 会根据该版本提供相应的功能支持。

    Compose 版本具有向后兼容性,因此建议始终使用最新版本。

  • services:此部分定义了应用程序正常运行所需的所有 Docker 镜像及其构建方式。简而言之,它是所有相互依赖的应用组件的集合。

    我们定义了两个服务:web 和 database。在 Compose 版本 3 中,还可以为同一服务创建多个容器。

    我们将在下一节中看到这一点,如果你感兴趣,可以查阅 Compose 文件文档 中的 deploy 部分。

  • web:web 是我们 Flask 应用服务的名称,可以自定义。Docker Compose 会以此名称创建容器。

  • build:此字段指定 Dockerfile 的位置。'.' 表示当前目录,即 docker-compose.yml 所在的位置,Docker 会使用该目录下的 Dockerfile 构建镜像并运行容器。也可以使用绝对路径代替当前目录符号。

  • ports:ports 字段用于将容器端口映射到主机端口。它在指定的容器端口与主机端口之间建立隧道。

    这等同于使用 docker run 命令时的 -p 5000:5000 选项,将容器的 5000 端口映射到主机的 5000 端口。

  • volumes:这与 docker run 命令中的 -v 选项作用相同。此处我们将本地代码目录挂载到容器的 /code 路径下,这样每次修改文件时就不需要重新构建镜像。

    此外,在调试模式下还能实现服务器的自动重启。

  • links:links 字段用于将一个服务连接到另一个服务。在桥接网络中,必须通过链接指定哪些容器可以被其他容器访问。

    此处我们将数据库容器链接到 web 容器,使 web 容器能够在桥接网络中访问数据库。不过,links 是一种过时的连接方式,已被 弃用。后续课程中你会学习到替代方案(即 networks)。

  • image:如果我们没有 Dockerfile,而是希望直接使用已构建好的镜像运行服务,则可通过 image 字段指定镜像地址。Compose 会拉取该镜像并基于它创建容器。

  • environment:任何需要在容器中设置的环境变量都可以通过 environment 字段定义。这相当于在运行容器时使用 docker run 命令的 -e 参数。

以上所有关键字都是常用且足够支撑开发工作流的基础配置。然而,在生产环境中还会用到一些高级关键字。

随着课程的推进,我们将逐步把这份 Docker Compose 文件改造为适用于生产环境的版本。

在下一课中,我们将通过实际命令操作 Docker Compose,帮助你熟悉其使用方法。

进阶 Docker

Docker Compose 命令概览