Skip to content
xiaoyang 的头像xiaoyang发布于 2025-02-083,766 字阅读约 13 分钟浏览加载中

Docker Compose :容器编排工具 ​

1. Docker Compose 简介 ​

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过使用 YAML 文件配置应用程序的服务,可以使用单个命令创建和启动所有服务。它大大简化了容器化应用的部署和管理过程。

Compose 使用的三个步骤:

  • 使用 Dockerfile 定义应用程序的环境。
  • 使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。
  • 最后,执行 docker-compose up 命令来启动并运行整个应用程序。

2. 为什么需要 Docker Compose? ​

在实际开发中,一个应用往往由多个服务组成。例如:

  • Web 应用服务器
  • 数据库服务
  • 缓存服务
  • 消息队列
  • 前端服务

手动管理这些容器是非常繁琐的。Docker Compose 提供了一种优雅的方式来管理这些服务,实现了:

  • 服务配置的版本控制
  • 环境变量管理
  • 服务依赖关系处理
  • 网络和数据卷配置的统一管理

5. docker-compose.yml 详解 ​

5.1 基本结构 ​

yaml
version : '3.8'
services:
  easyai-nacos:
    container_name: easyai-nacos
    image: nacos/nacos-server
    build:
      context: ./nacos
    environment:
      - MODE=standalone
    volumes:
      - ./nacos/logs/:/home/nacos/logs
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    depends_on:
      - easyai-mysql

5.2 常用配置项说明 ​

5.21 version ​

yaml
version: '3.8'
  • 指定 docker-compose 文件的语法版本为 3.8,适用于 Docker 19.03+ 版本。
  • 影响 docker-compose 支持的功能,如 depends_on、volumes、healthcheck 等。

5.22 services ​

yaml
services:
  easyai-nacos:
  • services 定义多个容器服务,easyai-nacos 是其中之一。
  • easyai-nacos 作为 Nacos 注册中心服务。

5.23 container_name ​

yaml
container_name: easyai-nacos
  • 设置容器名称为 easyai-nacos。
  • 若不指定,则 Docker 会随机生成一个名称。

5.24 image ​

yaml
image: nacos/nacos-server
  • 指定使用 nacos/nacos-server 官方 Nacos 镜像。
  • 若 build 存在,则 image 会被忽略。

5.25 build ​

yaml
build:
  context: ./nacos
  • 构建自定义 Nacos 镜像:
    • context: ./nacos 指定 Dockerfile 目录,即 ./nacos/Dockerfile。
    • 若 nacos 目录下有 Dockerfile,则 docker-compose 不会拉取官方镜像,而是本地构建。
  • build 与 image 关系:
    • 同时存在时,build 优先,image 仅用于 docker tag 结果。
    • 若无 build,则直接拉取 image 指定的镜像。

5.26 environment ​

yaml
environment:
  - MODE=standalone

设置环境变量,传递给容器:

  • MODE=standalone 让 Nacos 以单机模式运行,而不是集群模式。

5.27 volumes ​

yaml
volumes:
  - ./nacos/logs/:/home/nacos/logs
  - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
  • 数据持久化,将宿主机目录映射到容器内部:
  • Nacos 的日志存放到宿主机 ./nacos/logs/,防止容器销毁后丢失日志。
  • 覆盖 Nacos 配置文件,允许使用自定义 application.properties。

5.28 ports ​

yaml
ports:
  - "8848:8848"
  - "9848:9848"
  - "9849:9849"
  • 端口映射:宿主机端口:容器端口

    格式:

    1. 8848:8848 → Nacos 控制台(http://localhost:8848/nacos)。
    2. 9848:9848 → gRPC 端口,用于集群间通信(单机模式无用)。
    3. 9849:9849 → gRPC over TLS 端口。

5.29 depends_on ​

yaml
depends_on:
  - easyai-mysql

定义容器间的依赖关系:

  • 确保 easyai-mysql 先启动,再启动 easyai-nacos。
  • 注意:depends_on 仅控制启动顺序,不保证 easyai-mysql完全就绪。
    • 可能 Nacos 仍然需要等待 MySQL 启动完成 才能连接数据库。
    • 可以使用 healthcheck 确保数据库完全启动后再运行 Nacos。

depends_on 与 links 的区别

depends_on仅控制启动顺序,不创建容器间的网络连接:

yaml
depends_on:
  - easyai-redis
  - easyai-mysql

easyai-nacos 在 easyai-redis 和 easyai-mysql 启动后才会启动。

提供额外的网络可见性,但已被 networks取代:

yaml
links:
  - easyai-redis
  - easyai-mysql

使 easyai-nacos能通过容器名称直接访问easyai-redis和 easyai-mysql如:

bash
mysql -h easyai-mysql -u root -p
  • links 适用于旧版 docker-compose,但 networks 更推荐。

depends_on vs. links 总结

特性depends_onlinks
控制启动顺序✅ 是❌ 否
影响网络通信❌ 否✅ 是
推荐使用✅ 是❌ 否(已被 networks 取代)

6.下载安装 ​

  1. 使用 curl 下载官方 docker-compose
bash
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 赋予执行权限
bash
sudo chmod +x /usr/local/bin/docker-compose
  1. 验证安装
bash
docker-compose --version

7. Docker Compose 常用命令 ​

7.1 基本操作 ​

bash
# 启动所有服务
docker-compose up

# 后台运行
docker-compose up -d

# 停止服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 进入服务容器
docker-compose exec service_name bash

6.2 服务生命周期管理 ​

bash
# 构建服务
docker-compose build

# 重启服务
docker-compose restart

# 暂停服务
docker-compose pause

# 恢复服务
docker-compose unpause

# 删除服务(包括数据卷)
docker-compose down -v

8. 总结 ​

Docker Compose 是一个强大的工具,它简化了多容器应用的管理和部署。通过合理使用 Docker Compose,可以:

  • 标准化开发环境
  • 简化部署流程
  • 提高开发效率
  • 实现基础设施即代码

掌握 Docker Compose 对于现代应用开发和部署来说是必不可少的技能。通过持续学习和实践,你可以更好地利用这个工具来优化你的开发工作流程。

DISCUSSION

评论区

欢迎分享你的思考、补充或问题。

基于 VitePress 搭建