1. 概述

当需要维护多个配置复杂的容器时,仅依赖 docker run 命令可能会变得非常困难。幸运的是,Docker Compose 提供了一个解决方案,它允许我们通过一个 YAML 配置文件来定义多容器的 Docker 应用。

在本文中,我们将演示如何将 docker run 命令转换为 docker-compose.yml 文件。


2. docker run 命令的基本结构

docker run 命令用于创建并运行容器非常有用

$ docker run -d \
  --name container_name \
  -p host_port:container_port \
  -e ENV_VAR=value \
  -v /host/path:/container/path \
  --network my-network \
  image_name:tag

我们来逐项解释一下这个命令的含义:

  • -d:后台运行容器(detached 模式)
  • --name container_name:为容器指定名称
  • -p host_port:container_port:将主机端口映射到容器端口
  • -e ENV_VAR=value:设置环境变量(格式为 KEY=value
  • -v /host/path:/container/path:挂载主机目录到容器目录
  • --network my-network:将容器连接到指定网络
  • image_name:tag:指定使用的镜像和标签

下面是一个实际运行的示例命令:

$ docker run -d \
  --name my-container \
  -p 8080:80 \
  -e APP_ENV=production \
  -v /var/www/html:/usr/share/nginx/html \
  --network my-network \
  nginx:latest

对于简单的场景,docker run 使用起来非常直接。但在复杂配置下,重复执行命令容易出错,维护困难


3. Compose 文件的基本结构

Docker Compose 的配置文件一般以 docker-compose.yml 为名,其基本结构如下:

version: '3.9'
services:
  service_name:
    image: image_name:tag
    container_name: container_name
    ports:
      - "host_port:container_port"
    environment:
      - ENV_VAR=value
    volumes:
      - /host/path:/container/path
    networks:
      - network_name
networks:
  network_name:
    driver: bridge

我们用上面的结构来转换前面的 docker run 示例:

version: '3.9'
services:
  my-container:
    image: nginx:latest
    container_name: my-container
    ports:
      - "8080:80"
    environment:
      - APP_ENV=production
      - DB_HOST=db.example.com
    volumes:
      - /var/www/html:/usr/share/nginx/html
    networks:
      - my-network
networks:
  my-network:
    driver: bridge

✅ 各字段含义如下:

  • version:指定 Compose 文件版本,这里使用的是 3.9,适用于现代 Docker 版本
  • services:定义服务(容器)的区域,每个服务的配置类似于 docker run 中的参数
  • image:指定镜像名称和标签
  • container_name:容器名称
  • ports:端口映射,这里是将主机的 8080 映射到容器的 80
  • environment:环境变量设置
  • volumes:挂载目录
  • networks:指定容器连接的网络

⚠️ 建议将敏感环境变量放在 .env 文件中,而不是直接写在 Compose 文件里,以提高安全性


4. Docker Compose 的优势

接下来我们介绍 Docker Compose 相较于 docker run 所具备的几个显著优势。

4.1. 更多配置选项

Compose 支持一些 docker run 无法直接实现的高级配置,例如:

  • 服务依赖关系

    depends_on:
      - database
    

    保证容器按依赖顺序启动

  • 自动重启策略

    restart: always
    

    容器异常退出时自动重启

  • 健康检查

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      retries: 3
    

    定期检查服务是否正常,失败多次后自动重启容器

4.2. 更好的容器管理

Compose 允许我们通过一个 YAML 文件集中管理所有容器配置,避免了使用多个 docker run 命令带来的复杂性和潜在错误

  • 团队协作时,可以轻松添加新服务或修改现有配置
  • 无需手动重启容器即可更新配置
  • 支持一键查看日志、重启、停止等操作,便于调试

4.3. 可扩展性更强

Docker Compose 支持对服务进行横向扩展,例如:

$ docker compose up --scale my-container=3

上面命令会启动 3 个 my-container 服务的实例,非常适合做负载均衡或压力测试。

4.4. 网络通信更方便

在同一个 docker-compose.yml 中定义的服务之间可以直接通过服务名进行通信。Docker Compose 会自动创建一个默认网络,使得这些服务之间无需额外配置即可互相访问。

这种机制简化了微服务之间的网络连接管理

4.5. 更好的可移植性与协作性

docker-compose.yml 文件可以纳入版本控制,便于在不同环境中保持一致性

  • 一份配置文件即可定义所有服务、依赖、网络和挂载点
  • 轻松分享配置,团队协作更高效

4.6. 快速执行与更新

使用 Docker Compose v2 语法(docker compose,非 docker-compose):

  • 启动服务:

    $ docker compose up -d
    
  • 停止并删除服务:

    $ docker compose down
    
  • 如果修改了 Compose 文件,可以加 --build 重新构建镜像:

    $ docker compose up -d --build
    

4.7. 与高级工具集成更好

Docker Compose 能很好地与 Kubernetes 等编排工具集成

  • 可以作为从本地开发环境过渡到生产环境的桥梁
  • DevOps 流程中可结合 CI/CD 工具,实现自动化部署

5. 总结

本文介绍了如何将 docker run 命令转换为 Docker Compose 配置文件。

  • 首先我们回顾了 docker rundocker-compose.yml 的基本结构
  • 然后我们对比了 Docker Compose 相较于 docker run 的诸多优势
  • 包括更丰富的配置选项、更便捷的容器管理、良好的网络通信支持、可扩展性以及与 CI/CD 的集成能力

如果你的应用涉及多个服务、需要稳定运行或便于维护,推荐使用 Docker Compose 来管理你的容器化应用


原始标题:Convert a docker run Command Into a Docker Compose File