SuperAPI AI Directory

compose

Deployment & operations

View repository

Updated 10-16 08:06

About this skill

Docker Compose orchestration

Overview

Skills for multi-container orchestration, environment variables, network configuration, etc.

Basic commands

# 启动服务
docker compose up
docker compose up -d                # 后台运行
docker compose up --build           # 重新构建

# 停止服务
docker compose down
docker compose down -v              # 同时删除卷
docker compose down --rmi all       # 同时删除镜像
View status

docker compose ps docker compose ps -a

View logs

docker compose logs docker compose logs -f # follow in real time docker compose logs service_name

Execute commands

docker compose exec service_name sh docker compose run service_name command

Restart services

docker compose restart docker compose restart service_name

Scaling

docker compose up -d --scale web=3


## 配置文件

### 基础结构
```yaml
# docker-compose.yml
version: "3.9"

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - api

  api:
    build: ./api
    environment:
      - DATABASE_URL=postgres://db:5432/mydb
    depends_on:
      - db

  db:
    image: postgres:15
    volumes:
      - db_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret

volumes:
  db_data:

networks:
  default:
    driver: bridge

Service configuration details

build

services:
  app:
    # 简单形式
    build: ./app
    
    # 完整形式
    build:
      context: ./app
      dockerfile: Dockerfile.prod
      args:
        - VERSION=1.0
      target: production
      cache_from:
        - myapp:cache

ports

services:
  web:
    ports:
      - "80:80"                     # HOST:CONTAINER
      - "443:443"
      - "8080-8090:8080-8090"       # 端口范围
      - "127.0.0.1:3000:3000"       # 绑定特定 IP

volumes

services:
  app:
    volumes:
      # 命名卷
      - data:/var/lib/data
      # 绑定挂载
      - ./config:/etc/app/config:ro
      # 匿名卷
      - /var/lib/data

volumes:
  data:
    driver: local

environment

services:
  app:
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://localhost/db
    # 或使用映射形式
    environment:
      NODE_ENV: production
      DATABASE_URL: postgres://localhost/db
    # 从文件加载
    env_file:
      - .env
      - .env.local

depends_on

services:
  web:
    depends_on:
      - db
      - redis
    # 带条件
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

healthcheck

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

deploy (Swarm mode)

services:
  web:
    deploy:
      replicas: 3
      resources:
        limits:
          cpus: '0.5'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M
      restart_policy:
        condition: on-failure
        delay: 5s
        max_attempts: 3

Network configuration

Custom networks

services:
  frontend:
    networks:
      - frontend
  
  backend:
    networks:
      - frontend
      - backend
  
  db:
    networks:
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge
    internal: true              # 内部网络,无外部访问

Network aliases

services:
  db:
    networks:
      backend:
        aliases:
          - database
          - postgres

Environment variables

.env file

# .env
POSTGRES_VERSION=15
POSTGRES_PASSWORD=secret
APP_PORT=3000
# docker-compose.yml
services:
  db:
    image: postgres:${POSTGRES_VERSION}
    environment:
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  
  app:
    ports:
      - "${APP_PORT}:3000"

Multi-environment configuration

# docker-compose.override.yml(开发环境,自动加载)
# docker-compose.prod.yml(生产环境)

# 使用多个配置文件
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
# docker-compose.yml(基础配置)
services:
  app:
    image: myapp:latest

# docker-compose.override.yml(开发覆盖)
services:
  app:
    build: .
    volumes:
      - .:/app
    environment:
      - DEBUG=true

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

Common scenarios

Scenario 1: Web application stack

version: "3.9"

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
    depends_on:
      - app

  app:
    build: .
    environment:
      - DATABASE_URL=postgres://postgres:secret@db:5432/mydb
      - REDIS_URL=redis://redis:6379
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started

  db:
    image: postgres:15-alpine
    volumes:
      - postgres_data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: mydb
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data

volumes:
  postgres_data:
  redis_data:

Scenario 2: Development environment hot reload

version: "3.9"

services:
  app:
    build:
      context: .
      target: development
    volumes:
      - .:/app
      - /app/node_modules          # 排除 node_modules
    environment:
      - NODE_ENV=development
    command: npm run dev
    ports:
      - "3000:3000"

Scenario 3: Database initialization

services:
  db:
    image: postgres:15
    volumes:
      - postgres_data:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    environment:
      POSTGRES_PASSWORD: secret

Scenario 4: Logging configuration

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

Troubleshooting

# 查看配置
docker compose config

# 查看服务日志
docker compose logs service_name --tail=100

# 进入容器
docker compose exec service_name sh

# 查看网络
docker network ls
docker network inspect project_default

# 重建服务
docker compose up -d --force-recreate service_name
Issue Troubleshooting method
Service fails to start docker compose logs, check dependencies
Network unreachable Check network configuration, service names
Volume mount issues Check paths, permissions
Environment variables not taking effect docker compose config verify