概述

你有没有试过用 docker run 启动一个包含多个服务的应用?

比如一个典型的 Web 项目:

  • 前端(Nginx)
  • 后端(Node.js)
  • 数据库(MySQL)
  • 缓存(Redis)

你可能写了这样一堆命令:

docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8.0
docker run -d --name redis -p 6379:6379 redis:alpine
docker run -d --name backend -p 3000:3000 --link mysql --link redis my-backend:1.0
docker run -d --name frontend -p 80:80 --link backend nginx:alpine

不仅命令长,还容易出错,重启一次就得重新敲一遍……

别担心,Docker Compose 就是来解决这个问题的!

什么是 Docker Compose

Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。

你只需要写一个 docker-compose.yml 文件,描述所有服务,然后运行:

docker compose up

所有容器自动启动、联网、配置完成

安装Docker Compose的方法

在Linux系统上安装

确保已安装Docker,且系统版本为64位。运行以下命令下载Docker Compose的二进制文件:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

赋予二进制文件可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

验证安装是否成功:

docker-compose --version

在Windows或macOS上安装

对于Windows和macOS用户,Docker Compose通常作为Docker Desktop的一部分自动安装。安装Docker Desktop后,Docker Compose将直接可用。

验证安装:

docker-compose --version

通过Python pip安装

如果系统已安装Python和pip,可以通过以下命令安装:

pip install docker-compose

注意:此方法可能因Python环境问题导致兼容性错误,推荐优先使用官方二进制文件安装。

升级Docker Compose

如需升级到最新版本,先卸载旧版本再重新安装:

sudo rm /usr/local/bin/docker-compose

随后按上述步骤重新下载和安装最新版本。Docker Compose

编写你的第一个 docker-compose.yml

我们以一个简单的 Node.js + MySQL 应用为例。

项目结构

my-app/
├── docker-compose.yml
├── backend/
│   ├── app.js
│   └── package.json
└── mysql/
    └── init.sql

创建 docker-compose.yml

version: '3.8'

services:
  # 后端服务
  backend:
    build: ./backend
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=mysql
      - DB_USER=root
      - DB_PASSWORD=123456
    depends_on:
      - mysql
    networks:
      - app-network

  # 数据库服务
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: 123456
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql
      - mysql-data:/var/lib/mysql
    networks:
      - app-network

  # 可选:前端 Nginx
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - backend
    networks:
      - app-network

# 定义网络
networks:
  app-network:
    driver: bridge

# 定义持久化卷
volumes:
  mysql-data:

我们逐项解释一下 docker-compose.yml:

字段说明
version: '3.8'Compose 文件格式版本
services定义所有服务
build: ./backend从 Dockerfile 构建镜像
image: mysql:8.0使用现成镜像
ports端口映射
environment环境变量
volumes挂载数据卷(持久化数据)
depends_on声明启动顺序(先启动 mysql,再启动 backend)
networks自动创建网络,服务间可通过服务名通信

服务之间通过服务名(如 mysql)即可通信,无需手动配置 IP

启动整个应用

my-app 目录下运行:

docker compose up
  • 第一次会自动构建 backend 镜像
  • 所有服务按顺序启动
  • 日志集中输出,便于调试

想后台运行?加 -d

docker compose up -d

常用命令

命令说明
docker compose up启动所有服务
docker compose up -d后台启动
docker compose down停止并删除容器
docker compose down -v删除容器和卷(慎用)
docker compose logs查看日志
docker compose ps查看运行中的服务
docker compose build仅构建镜像

Docker Compose 的优点

优势说明
一键启动一条命令启动所有服务
配置集中化所有配置在 docker-compose.yml
服务互联自动创建网络,服务名即主机名
依赖管理depends_on 控制启动顺序
开发利器本地环境快速搭建,团队统一配置

最佳实践

  1. 为每个项目创建独立的 docker-compose.yml
  2. 使用 .env 文件管理环境变量
    MYSQL_ROOT_PASSWORD=123456
    DB_PASSWORD=123456
    
    docker-compose.yml 中引用:
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
    
  3. 不同环境使用不同配置文件
    • docker-compose.yml(通用)
    • docker-compose.dev.yml(开发)
    • docker-compose.prod.yml(生产)

总结

传统方式Docker Compose
多条 docker run 命令一个 docker-compose.yml
手动管理网络和卷自动创建和连接
容易出错、难维护配置即代码,易于共享和版本控制

Docker Compose 是管理多容器应用的必备工具,尤其适合本地开发、测试和微服务架构

更多推荐