Docker Compose 详解

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

推广

【腾讯云】语音识别准确率高,支持多语种,多场景,限时特惠,最低14.9元起

Docker Compose简介

Docker Compose是用于定义和运行多容器Docker应用程序的工具。通过YAML文件配置应用程序的服务,然后使用单个命令创建并启动所有服务。

什么是Docker Compose?

Docker Compose是一个用于定义和管理多容器Docker应用的工具。它使用YAML文件来配置应用程序的服务,网络和数据卷。

为什么使用Docker Compose?

  1. 简化多容器管理:一个命令管理多个容器
  2. 环境一致性:开发、测试、生产环境保持一致
  3. 服务编排:定义服务间的依赖关系
  4. 配置管理:集中管理容器配置

安装Docker Compose

Linux安装

# 下载Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 添加执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

使用pip安装

# 使用pip安装
pip install docker-compose

# 验证安装
docker-compose --version

docker-compose.yml文件结构

基本结构

version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
  
  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password

networks:
  default:
    driver: bridge

volumes:
  data:
    driver: local

版本说明

  • version: '3.8':Compose文件格式版本
  • 不同版本支持不同的功能特性
  • 建议使用最新稳定版本

服务配置详解

基本服务配置

version: '3.8'

services:
  web:
    # 使用现有镜像
    image: nginx:alpine
    
    # 或者构建镜像
    build: .
    
    # 端口映射
    ports:
      - "80:80"
      - "443:443"
    
    # 环境变量
    environment:
      - NODE_ENV=production
      - DEBUG=false
    
    # 数据卷挂载
    volumes:
      - ./html:/usr/share/nginx/html
      - ./config:/etc/nginx/conf.d
    
    # 依赖关系
    depends_on:
      - database
    
    # 重启策略
    restart: unless-stopped

构建配置

services:
  app:
    build:
      # 构建上下文
      context: .
      # Dockerfile路径
      dockerfile: Dockerfile.prod
      # 构建参数
      args:
        - NODE_ENV=production
        - BUILD_VERSION=1.0.0
      # 目标阶段(多阶段构建)
      target: production

网络配置

version: '3.8'

services:
  web:
    image: nginx
    networks:
      - frontend
      - backend
  
  api:
    image: node:16
    networks:
      - backend
  
  database:
    image: mysql:8.0
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true

实际应用示例

Web应用栈(LAMP)

version: '3.8'

services:
  # Web服务器
  web:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./html:/var/www/html
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - php
    networks:
      - frontend

  # PHP处理器
  php:
    image: php:8.1-fpm
    volumes:
      - ./html:/var/www/html
    networks:
      - frontend
      - backend

  # 数据库
  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpassword
      MYSQL_DATABASE: myapp
      MYSQL_USER: appuser
      MYSQL_PASSWORD: apppassword
    volumes:
      - mysql_data:/var/lib/mysql
    networks:
      - backend

  # 缓存
  redis:
    image: redis:alpine
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

volumes:
  mysql_data:
    driver: local

Node.js + MongoDB应用

version: '3.8'

services:
  # Node.js应用
  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - MONGODB_URI=mongodb://database:27017/myapp
      - REDIS_URL=redis://redis:6379
    depends_on:
      - database
      - redis
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  # MongoDB数据库
  database:
    image: mongo:5.0
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
      MONGO_INITDB_DATABASE: myapp
    volumes:
      - mongo_data:/data/db
      - ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js
    restart: unless-stopped

  # Redis缓存
  redis:
    image: redis:alpine
    command: redis-server --appendonly yes
    volumes:
      - redis_data:/data
    restart: unless-stopped

  # Nginx反向代理
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - app
    restart: unless-stopped

volumes:
  mongo_data:
  redis_data:

微服务架构示例

version: '3.8'

services:
  # API网关
  gateway:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./gateway.conf:/etc/nginx/nginx.conf
    depends_on:
      - user-service
      - order-service
      - product-service

  # 用户服务
  user-service:
    build: ./services/user
    environment:
      - DATABASE_URL=postgresql://user:password@user-db:5432/users
    depends_on:
      - user-db

  # 订单服务
  order-service:
    build: ./services/order
    environment:
      - DATABASE_URL=postgresql://user:password@order-db:5432/orders
      - USER_SERVICE_URL=http://user-service:3000
    depends_on:
      - order-db

  # 产品服务
  product-service:
    build: ./services/product
    environment:
      - DATABASE_URL=postgresql://user:password@product-db:5432/products
    depends_on:
      - product-db

  # 用户数据库
  user-db:
    image: postgres:13
    environment:
      POSTGRES_DB: users
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - user_data:/var/lib/postgresql/data

  # 订单数据库
  order-db:
    image: postgres:13
    environment:
      POSTGRES_DB: orders
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - order_data:/var/lib/postgresql/data

  # 产品数据库
  product-db:
    image: postgres:13
    environment:
      POSTGRES_DB: products
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    volumes:
      - product_data:/var/lib/postgresql/data

volumes:
  user_data:
  order_data:
  product_data:

常用命令

基本命令

# 启动所有服务
docker-compose up

# 后台启动
docker-compose up -d

# 启动指定服务
docker-compose up web database

# 停止所有服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

# 重启服务
docker-compose restart

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs

# 查看指定服务日志
docker-compose logs web

# 实时查看日志
docker-compose logs -f

构建和更新

# 构建服务
docker-compose build

# 强制重新构建
docker-compose build --no-cache

# 拉取最新镜像
docker-compose pull

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

扩展和管理

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

# 执行命令
docker-compose exec web bash

# 运行一次性命令
docker-compose run web npm install

# 查看配置
docker-compose config

# 验证配置文件
docker-compose config --quiet

环境变量管理

.env文件

# .env文件
NODE_ENV=production
DATABASE_URL=postgresql://user:password@localhost:5432/myapp
REDIS_URL=redis://localhost:6379
API_KEY=your-api-key
# docker-compose.yml
version: '3.8'

services:
  app:
    image: node:16
    environment:
      - NODE_ENV=${NODE_ENV}
      - DATABASE_URL=${DATABASE_URL}
      - REDIS_URL=${REDIS_URL}
      - API_KEY=${API_KEY}

多环境配置

# 开发环境
docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

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

最佳实践

1. 文件组织

project/
├── docker-compose.yml
├── docker-compose.dev.yml
├── docker-compose.prod.yml
├── .env
├── .env.example
├── services/
│   ├── web/
│   │   └── Dockerfile
│   └── api/
│       └── Dockerfile
└── config/
    ├── nginx.conf
    └── mysql.cnf

2. 安全配置

services:
  database:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD_FILE: /run/secrets/mysql_root_password
    secrets:
      - mysql_root_password

secrets:
  mysql_root_password:
    file: ./secrets/mysql_root_password.txt

3. 健康检查

services:
  web:
    image: nginx
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 40s

小结

本课学习了Docker Compose的核心内容:

  • Docker Compose的安装和基本概念
  • docker-compose.yml文件的编写
  • 实际应用场景的配置示例
  • 常用命令和操作技巧
  • 环境变量管理和最佳实践

Docker Compose是管理多容器应用的强大工具,掌握它对于构建复杂的Docker应用至关重要。

Vue3 + TypeScript 企业级项目实战

课程推荐

Vue3 + TypeScript 企业级项目实战
Python 全栈开发工程师培训

热门课程

Python 全栈开发工程师培训

📚 文章对你有帮助?请关注我的公众号,万分感谢!

获取更多优质技术文章,第一时间掌握最新技术动态

关注公众号

关注公众号

第一时间获取最新技术文章

添加微信

添加微信

技术交流 · 问题答疑 · 学习指导

评论讨论

欢迎留下你的想法和建议