HIGH_FREQUENCY_MODE

NextBlog
NEXT.

下一个博客,记录精彩生活

LIVE_STREAM_CONNECTED

Docker Compose 完整使用指南

A

Mastermind

admin

Dimension

Docker

Timestamp

2025年12月21日

Docker Compose 用于定义和运行多容器 Docker 应用,通过 YAML 文件配置服务。

安装

Docker Desktop

Docker Desktop 已内置 Docker Compose。

Linux 单独安装

# 插件方式(推荐)
sudo apt install docker-compose-plugin

# 验证
docker compose version

基础配置

最小配置

# docker-compose.yml
version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

完整示例

version: '3.8'

services:
  # 前端应用
  frontend:
    build: ./frontend
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    depends_on:
      - backend

  # 后端 API
  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=db
      - DB_PORT=5432
      - REDIS_HOST=redis
    depends_on:
      - db
      - redis
    volumes:
      - ./backend:/app
      - /app/node_modules

  # 数据库
  db:
    image: postgres:15
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: password
      POSTGRES_DB: myapp
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"

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

  # Nginx 反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/ssl:/etc/nginx/ssl
    depends_on:
      - frontend
      - backend

volumes:
  postgres_data:
  redis_data:

networks:
  default:
    name: myapp-network

常用命令

启动服务

# 启动所有服务
docker compose up

# 后台运行
docker compose up -d

# 指定文件
docker compose -f docker-compose.prod.yml up -d

# 只启动特定服务
docker compose up -d backend db

# 强制重新构建
docker compose up -d --build

# 重新创建容器
docker compose up -d --force-recreate

停止服务

# 停止服务
docker compose stop

# 停止并删除容器
docker compose down

# 同时删除卷
docker compose down -v

# 同时删除镜像
docker compose down --rmi all

查看状态

# 查看服务状态
docker compose ps

# 查看日志
docker compose logs
docker compose logs -f              # 实时追踪
docker compose logs backend         # 指定服务
docker compose logs --tail 100      # 最后 100 行

# 查看资源使用
docker compose top

服务管理

# 重启服务
docker compose restart
docker compose restart backend

# 暂停/恢复
docker compose pause
docker compose unpause

# 进入容器
docker compose exec backend sh
docker compose exec backend bash

# 运行一次性命令
docker compose run backend npm test
docker compose run --rm backend npm install

# 扩展服务实例
docker compose up -d --scale backend=3

构建镜像

# 构建所有服务
docker compose build

# 构建指定服务
docker compose build backend

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

# 拉取最新镜像
docker compose pull

配置详解

build 构建配置

services:
  app:
    build:
      context: ./app              # 构建上下文
      dockerfile: Dockerfile.prod # 指定 Dockerfile
      args:                       # 构建参数
        NODE_ENV: production
      target: production          # 多阶段构建目标
      cache_from:
        - myapp:latest

端口映射

services:
  web:
    ports:
      - "80:80"                   # 主机:容器
      - "443:443"
      - "8080-8090:8080-8090"     # 端口范围
      - "127.0.0.1:3000:3000"     # 绑定特定 IP

环境变量

services:
  app:
    # 方式一:直接定义
    environment:
      - NODE_ENV=production
      - DB_HOST=db

    # 方式二:键值对
    environment:
      NODE_ENV: production
      DB_HOST: db

    # 方式三:从文件加载
    env_file:
      - .env
      - .env.local

卷挂载

services:
  app:
    volumes:
      # 绑定挂载
      - ./src:/app/src
      - ./config:/app/config:ro   # 只读

      # 命名卷
      - app_data:/app/data

      # 匿名卷
      - /app/node_modules

volumes:
  app_data:
    driver: local

网络配置

services:
  frontend:
    networks:
      - frontend-net

  backend:
    networks:
      - frontend-net
      - backend-net

  db:
    networks:
      - backend-net

networks:
  frontend-net:
  backend-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

依赖关系

services:
  app:
    depends_on:
      - db
      - redis

  # 带健康检查的依赖
  app:
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

健康检查

services:
  db:
    image: postgres:15
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
      start_period: 30s

重启策略

services:
  app:
    restart: always           # 总是重启
    # restart: on-failure     # 失败时重启
    # restart: unless-stopped # 除非手动停止
    # restart: "no"           # 不重启

资源限制

services:
  app:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

日志配置

services:
  app:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

多环境配置

基础配置 + 覆盖

# docker-compose.yml (基础)
version: '3.8'
services:
  app:
    build: .
    environment:
      - NODE_ENV=development

# docker-compose.override.yml (开发环境,自动加载)
version: '3.8'
services:
  app:
    volumes:
      - .:/app
    ports:
      - "3000:3000"

# docker-compose.prod.yml (生产环境)
version: '3.8'
services:
  app:
    environment:
      - NODE_ENV=production
    restart: always

使用:

# 开发环境(自动加载 override)
docker compose up

# 生产环境
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d

使用 .env 文件

# .env
POSTGRES_USER=admin
POSTGRES_PASSWORD=secret
APP_PORT=3000
# docker-compose.yml
services:
  db:
    environment:
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}

  app:
    ports:
      - "${APP_PORT}:3000"

实用示例

LNMP 环境

version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - php

  php:
    build: ./php
    volumes:
      - ./www:/var/www/html
    depends_on:
      - mysql

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

Node.js + MongoDB

version: '3.8'

services:
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - MONGODB_URI=mongodb://mongo:27017/myapp
    depends_on:
      - mongo

  mongo:
    image: mongo:6
    volumes:
      - mongo_data:/data/db

volumes:
  mongo_data:

WordPress

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress_data:/var/www/html
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - db_data:/var/lib/mysql

volumes:
  wordpress_data:
  db_data:

故障排查

# 查看配置
docker compose config

# 验证配置
docker compose config --quiet

# 查看服务日志
docker compose logs -f service_name

# 进入容器调试
docker compose exec service_name sh

# 查看容器详情
docker compose ps -a
docker inspect container_name

总结

Docker Compose 核心功能:

  • YAML 定义多容器应用
  • 一键启动/停止所有服务
  • 服务依赖管理
  • 网络和卷管理
  • 多环境配置支持

是本地开发和小规模部署的理想选择。

评论

加载评论中...
Spirit Sync

"正在同步你的多巴胺频率,建立高维链接..."