Skip to content

Docker Compose 入门指南

用简单的配置管理多个 Docker 容器

Docker Compose 是什么?

想象一下,你的项目需要同时运行:

  • 一个 Java 应用
  • 一个 MySQL 数据库
  • 一个 Redis 缓存

以前你要手动一条一条执行 docker run 命令,还要注意启动顺序,很麻烦。

有了 Docker Compose,你只需要写一个配置文件,然后一条命令就能全部启动。

快速开始

1. 准备 docker-compose.yml 文件

在项目根目录创建 docker-compose.yml 文件:

yaml
version: '3.8'

services:
  # 你的 Java 应用
  app:
    build: .
    ports:
      - "8080:8080"

  # MySQL 数据库
  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=myapp

  # Redis 缓存
  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

2. 常用命令

bash
# 启动所有服务(后台运行)
docker-compose up -d

# 启动并重新构建镜像
docker-compose up -d --build

# 停止所有服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 进入某个服务终端
docker-compose exec app sh

常见配置说明

image - 使用现成的镜像

yaml
services:
  mysql:
    image: mysql:8.0        # 直接使用官方镜像

build - 用 Dockerfile 构建

yaml
services:
  app:
    build: .                # 用当前目录的 Dockerfile 构建

ports - 端口映射

yaml
services:
  app:
    ports:
      - "8080:8080"         # 宿主机端口:容器端口

environment - 环境变量

yaml
services:
  mysql:
    environment:
      - MYSQL_ROOT_PASSWORD=123456

volumes - 数据挂载

yaml
services:
  mysql:
    volumes:
      - mysql_data:/var/lib/mysql           # 数据卷(数据不会丢失)
      - ./config:/etc/mysql/conf.d          # 本地目录挂载

depends_on - 依赖关系

yaml
services:
  app:
    depends_on:
      - mysql           # 先启动 MySQL,再启动 app
      - redis

完整示例

假设你有一个 Spring Boot 项目,需要 MySQL 和 Redis:

yaml
version: '3.8'

services:
  app:
    build: .
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - MYSQL_HOST=mysql
      - REDIS_HOST=redis
    depends_on:
      - mysql
      - redis

  mysql:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=root123
      - MYSQL_DATABASE=drone
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data

volumes:
  mysql_data:
  redis_data:

开发环境热重载

yaml
version: '3.8'

services:
  app:
    build: .
    volumes:
      - .:/app                    # 挂载源码,修改代码后自动生效
      - maven_cache:/root/.m2    # 缓存 Maven 依赖,加速构建
    environment:
      - SPRING_PROFILES_ACTIVE=dev
    working_dir: /app

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=dev123
      - MYSQL_DATABASE=drone_dev

volumes:
  maven_cache:

常见问题

1. 容器启动顺序怎么控制?

depends_on 控制启动顺序:

yaml
services:
  app:
    depends_on:
      - mysql
      - redis

2. 数据会丢失吗?

不会,只要用了数据卷:

yaml
volumes:
  - mysql_data:/var/lib/mysql    # 这个数据卷不会随容器删除而丢失

3. 怎么查看服务日志?

bash
docker-compose logs -f           # 查看所有日志
docker-compose logs app          # 只看 app 的日志

4. 怎么进入容器查看?

bash
docker-compose exec app sh       # 进入 app 容器
docker-compose exec mysql mysql -uroot -p   # 进入 MySQL

一张图理解结构

docker-compose.yml
├── services(服务)
│   ├── app(你的应用)
│   │   ├── build: 用 Dockerfile 构建
│   │   ├── ports: 8080:8080
│   │   └── depends_on: mysql, redis
│   ├── mysql(数据库)
│   │   └── image: mysql:8.0
│   └── redis(缓存)
│       └── image: redis:7-alpine
└── volumes(数据卷)
    ├── mysql_data
    └── redis_data

常用命令速查

命令说明
docker-compose up -d启动所有服务
docker-compose down停止并删除所有服务
docker-compose ps查看服务状态
docker-compose logs -f查看实时日志
docker-compose exec app sh进入容器
docker-compose restart app重启某个服务
docker-compose stop停止所有服务
docker-compose start启动所有服务