Docker Compose文件

Docker Compose 是一个用于定义和运行多容器 Docker 应用 的工具。通过一个 docker-compose.yml 配置文件来声明多个容器(如应用、数据库等),然后用一条命令启动或停止整个应用栈。

一、Docker Compose

在没有 Docker Compose 之前,如果要用 Docker 跑一个完整的应用(比如一个 Python Web 应用 + MySQL 数据库),需要手动执行一连串 docker run 命令:

复制代码
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0
docker run -d --name redis redis:7.0
docker run -d --name app -p 8080:8080 myapp:latest

而 Docker Compose 通过一个声明式的配置文件,把上面所有问题都解决了。

二、文件:docker-compose.yml

docker-compose.yml 是 Compose 的配置文件,采用 YAML 格式。它定义了应用的服务(services)网络(networks)数据卷(volumes)

示例

复制代码
version: '3.8'

services:
  # ========== MySQL 数据库服务 ==========
  mysql:
    image: mysql:8.0
    container_name: myapp_mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: myapp
      MYSQL_USER: app_user
      MYSQL_PASSWORD: app_pass
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - app_network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

  # ========== Python 应用服务 ==========
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: myapp_python
    restart: always
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_USER=app_user
      - DB_PASSWORD=app_pass
      - DB_NAME=myapp
    volumes:
      - ./app:/app
      - /app/__pycache__  # 排除缓存
    depends_on:
      mysql:
        condition: service_healthy
    networks:
      - app_network
    command: python app.py

  # ========== Redis 缓存服务 ==========
  redis:
    image: redis:7.0-alpine
    container_name: myapp_redis
    restart: always
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    networks:
      - app_network

# ========== 数据卷声明 ==========
volumes:
  mysql_data:
  redis_data:

# ========== 网络声明 ==========
networks:
  app_network:
    driver: bridge

三、配置项

1. services:服务的定义

每个服务代表一个容器。

字段 说明 示例
image 使用现成的镜像 image: mysql:8.0
build 从 Dockerfile 构建镜像 build: .
container_name 指定容器名称 container_name: myapp_mysql
restart 重启策略 restart: always
ports 端口映射 ports: - "8080:8080"
environment / env_file 环境变量 environment: DB_HOST=mysql
volumes 挂载数据卷 volumes: - mysql_data:/var/lib/mysql
networks 加入的网络 networks: - app_network
depends_on 依赖关系 depends_on: - mysql
command 覆盖默认命令 command: python app.py
healthcheck 健康检查 healthcheck: test: ["CMD", "curl", "-f", "http://localhost"]

2. volumes:数据卷声明

复制代码
volumes:
  mysql_data:      # 命名卷,由 Docker 管理
  redis_data:
  # 也可以指定外部卷
  # external_data:
  #   external: true

3. networks:网络声明

复制代码
networks:
  app_network:
    driver: bridge
  # 也可以使用 overlay 网络(Swarm 模式)
  # overlay_network:
  #   driver: overlay

四、常用命令

基础命令

命令 作用
docker-compose up -d 启动所有服务(-d 后台运行)
docker-compose down 停止并删除所有容器
docker-compose ps 查看服务状态
docker-compose logs 查看日志
docker-compose logs -f app 实时查看 app 服务的日志
docker-compose stop 停止服务(不删除容器)
docker-compose start 启动已停止的服务
docker-compose restart 重启服务

构建与管理

复制代码
# 构建镜像
docker-compose build

# 构建时不使用缓存
docker-compose build --no-cache

# 拉取所有服务的镜像
docker-compose pull

# 进入某个服务容器执行命令
docker-compose exec app bash

# 查看某个服务的端口映射
docker-compose port app 8080

扩展命令

复制代码
# 启动指定服务
docker-compose up -d mysql redis

# 以特定配置文件启动
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

# 指定项目名称(默认是目录名)
docker-compose -p myproject up -d

五、进阶配置

1. 环境变量文件(.env

复制代码
# .env 文件
DB_PASSWORD=123456
APP_PORT=8080

# docker-compose.yml
services:
  app:
    ports:
      - "${APP_PORT}:8080"
    environment:
      - DB_PASSWORD=${DB_PASSWORD}

2. 多环境配置

复制代码
# docker-compose.override.yml(默认会被自动加载)
services:
  app:
    environment:
      - DEBUG=true

# docker-compose.prod.yml(生产环境用)
services:
  app:
    environment:
      - DEBUG=false
    restart: always

# 使用生产配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

3. 服务依赖与条件(depends_on)

复制代码
services:
  app:
    depends_on:
      mysql:
        condition: service_healthy  # 等待健康检查通过
      redis:
        condition: service_started  # 等待启动即可

4. 资源限制

复制代码
services:
  app:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
相关推荐
March.s6 小时前
Docker 容器技术完全指南:从生态到架构的深度解析
docker
wdfk_prog7 小时前
ROS教程:01 搭建 ROS1 Noetic Docker 开发环境
运维·缓存·docker·容器·ros
szephyr7 小时前
Docker + Compose 实战:把本地项目一键搬到云服务器,附完整配置
运维·docker·容器·部署·云服务器
wdfk_prog8 小时前
ros教程02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node
运维·缓存·docker·容器·ros
名字还没想好☜11 小时前
Docker 网络实战:bridge/host/none/自定义网络、容器互通与端口映射踩坑
运维·docker·kubernetes
March.s14 小时前
Docker 容器与网络深度指南:从入门到精通
docker
探索云原生14 小时前
KubeClipper 1.7.0 发布:Operation 优化与 Kubernetes 1.37 支持
linux·docker·云原生·kubernetes·go
fengkai454515 小时前
八、Docker详解1-3
运维·docker·容器
一技安身16 小时前
【信创】银河麒麟V10(ARM64,无GPU纯CPU)内网隔离离线部署Deepseek+openWebUI完整方案
docker
AI视觉网奇17 小时前
docker 迁移
docker