Skip to content

Docker - Compose

Docker Compose 是一种用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,您可以通过一个 YAML 文件(通常是 docker-compose.yml)来配置应用程序的服务、网络和卷。然后,只需一个命令,您就可以从配置中创建并启动所有服务。

Compose 非常适合开发、测试和预生产环境,以及简单的生产部署。它简化了由多个相互连接的容器(例如,Web 服务器、数据库、缓存层)组成的应用程序的管理。

对于 Windows 和 macOS 用户,Docker Compose 已作为 Docker Desktop 的一部分包含在内,无需单独安装。

对于 Linux 用户,Compose V2 作为 Docker CLI 的插件安装。如果您按照推荐的方法安装了 Linux 上的 Docker Engine(使用 docker-compose-plugin),那么它应该已经安装好了。

要验证您的安装并检查版本,请运行:

docker compose version

注意:较旧的安装版本可能使用独立的 docker-compose 命令(带连字符)。本教程使用现代的 docker compose(带空格)语法。

让我们创建一个简单的示例应用程序,包含一个 Web 服务(使用 Nginx)和一个数据库服务(使用 MySQL)。

在您的项目目录下创建一个名为 docker-compose.yml 的文件:

version: '3.9' # 指定 Compose 文件版本(可选,用于最新特性)
services:
web:
image: nginx:stable-alpine
ports:
- "8080:80" # 将主机端口 8080 映射到容器端口 80
volumes:
- ./html:/usr/share/nginx/html:ro # 挂载本地 html 目录(只读)
depends_on:
- db
networks:
- app-network
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: examplepassword
MYSQL_DATABASE: myappdb
MYSQL_USER: myappuser
MYSQL_PASSWORD: myapppassword
volumes:
- db-data:/var/lib/mysql # 使用命名卷实现数据持久化
networks:
- app-network
networks:
app-network:
driver: bridge
volumes:
db-data: # 定义命名卷

说明:

  • version: '3.9': 指定 Compose 文件格式版本。
  • services:: 定义构成应用程序的容器。
  • web: 和 db:: 服务的名称。
  • image:: 指定服务使用的 Docker 镜像。
  • ports:: 在主机和容器之间映射端口 (HOST:CONTAINER)。
  • volumes:: 挂载路径或命名卷 (HOST_PATH/VOLUME_NAME:CONTAINER_PATH)。这里,./html 被绑定挂载用于 Nginx 内容,而命名卷 db-data 用于 MySQL 数据持久化。
  • depends_on:: 指定服务之间的依赖关系(确保 db 在 web 之前启动,但不保证 db 已准备就绪)。
  • environment:: 设置容器内的环境变量(此处用于 MySQL 设置)。
  • networks:(服务下):将服务连接到指定的网络。
  • networks:(顶层):定义应用程序使用的网络(此处为使用默认 bridge 驱动的 app-network)。
  • volumes:(顶层):定义应用程序使用的命名卷(此处为 db-data)。

您还需要创建一个本地 ./html 目录并放入一些内容(例如一个 index.html 文件),供 Nginx 服务使用。

在终端中导航到包含 docker-compose.yml 文件的目录,并使用以下命令:

# 在后台创建并启动容器 (-d)
docker compose up -d
# 查看服务状态
docker compose ps
# 查看所有服务日志(或指定服务)
docker compose logs
docker compose logs web
# 停止并移除文件中定义的容器、网络、卷
docker compose down
# 停止服务但不移除
docker compose stop
# 启动已停止的服务
docker compose start

执行 docker compose up -d 后,Compose 将会:

  • 如果本地不存在所需镜像(nginx、mysql),则拉取。
  • 创建 app-network 网络。
  • 创建 db-data 卷。
  • 创建并启动 db 和 web 容器,将它们连接到网络并设置卷/端口。

然后,您应该能够通过 http://localhost:8080 访问 Nginx 服务器。web 服务可以使用主机名 db 连接到数据库。