Skip to main content

docker-compose 的文件结构及其命令

下面是对 docker-compose.yml 文件更详细的介绍,包括一些高级特性和配置选项。

服务(Services)

每个服务可以有多种配置选项,用于定义如何构建、运行和链接容器。

  • build:

    • context: 指定构建上下文的路径。
    • dockerfile: 指定要使用的 Dockerfile 路径。
    • args: 传递给构建过程的构建参数。
    build:
    context: ./app
    dockerfile: Dockerfile.dev
    args:
    - NODE_ENV=development
  • command: 覆盖容器启动时执行的默认命令。

    command: ["npm", "start"]
  • depends_on: 指定服务启动的顺序。注意,它不保证容器内部的应用程序启动完成,只是保证容器启动。

    depends_on:
    - db
  • entrypoint: 覆盖容器的默认入口点。

    entrypoint: ["sh", "-c", "echo Hello World"]
  • environment: 设置环境变量,可以是列表或字典格式。

    environment:
    - NODE_ENV=production
    - DEBUG=app:*
  • env_file: 从文件中读取环境变量。

    env_file:
    - ./common.env
    - ./app.env
  • expose: 暴露容器内的端口,仅在 Docker 内部使用。

    expose:
    - "3000"
  • ports: 映射主机和容器端口,格式为主机端口:容器端口

    ports:
    - "80:80"
    - "3000:3000"
  • volumes: 挂载卷到容器内,格式为主机目录:容器目录

    volumes:
    - ./data:/data
    - type: volume
    source: mydata
    target: /data
  • restart: 定义容器重启策略。

    restart: always
  • healthcheck: 配置健康检查。

    healthcheck:
    test: ["CMD", "curl", "-f", "http://localhost"]
    interval: 1m30s
    timeout: 10s
    retries: 3

卷(Volumes)

卷用于持久化数据,可以是匿名卷、命名卷或绑定卷。

  • 命名卷: 可以在 volumes 顶级键下定义。

    volumes:
    db_data:
  • 绑定卷: 将主机目录绑定到容器内目录。

    services:
    web:
    volumes:
    - ./website:/var/www/html

网络(Networks)

网络用于定义服务之间的连接。Compose 会自动为每个项目创建默认网络(使用网络访问的时候需要使用服务标签)。

  • 自定义网络: 可以在 networks 顶级键下定义。

    networks:
    frontend:
    backend:
  • 指定网络驱动:

    networks:
    mynetwork:
    driver: bridge

高级配置

  • configs: 用于在 Swarm 模式下管理配置。

    configs:
    my_config:
    file: ./config.cfg
  • secrets: 用于在 Swarm 模式下管理敏感数据。

    secrets:
    my_secret:
    file: ./secret.txt
  • profiles: 用于为不同环境创建不同的配置。

    profiles:
    - test
    - production

完整示例

下面是一个完整的 docker-compose.yml 示例,展示了各种配置选项的组合:

version: "3.8"

services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- frontend
depends_on:
- app
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3

app:
build:
context: ./app
dockerfile: Dockerfile.dev
args:
- NODE_ENV=development
command: ["npm", "start"]
environment:
NODE_ENV: production
env_file:
- ./common.env
networks:
- frontend
- backend
volumes:
- app_data:/usr/src/app

db:
image: postgres:latest
volumes:
- db_data:/var/lib/postgresql/data
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
networks:
- backend

volumes:
db_data:
app_data:

networks:
frontend:
backend:

常用命令

  • 启动服务: docker-compose up(默认模式),docker-compose up -d(后台模式)。
  • 停止服务: docker-compose down
  • 查看日志: docker-compose logsdocker-compose logs -f(实时日志)。
  • 重新构建: docker-compose builddocker-compose up --build
  • 查看服务状态: docker-compose ps

官方文档: Docker Compose Documentation