Skip to content

命令 ​

基本操作 ​

命令说明
docker compose up -d后台启动所有服务
docker compose up前台启动所有服务(实时输出日志)
docker compose up -d <service>后台启动指定服务
docker compose stop停止所有服务(保留容器)
docker compose stop <service>停止指定服务
docker compose down停止并删除所有容器、网络
docker compose down -v停止并删除所有容器、网络、数据卷
docker compose down --rmi all停止并删除所有容器、网络、镜像
docker compose restart重启所有服务
docker compose restart <service>重启指定服务
docker compose up -d --build重新构建镜像并启动(不缓存)
docker compose up -d --build <service>重新构建指定服务并启动

查看状态与信息 ​

命令说明
docker compose ps -a查看所有容器状态(含退出码)
docker compose ps <service>查看指定服务状态
docker compose logs -f实时查看所有服务日志
docker compose logs -f <service>实时查看指定服务日志
docker compose logs --tail 100查看最近100行日志
docker compose top查看容器内进程
docker compose config --services查看所有服务名称
docker compose port <service> <port>查看服务端口映射

调试与进入容器 ​

命令说明
docker compose exec <service> sh进入容器执行 Shell
docker compose exec <service> bash进入容器执行 Bash
docker compose exec <service> ls -la在容器内执行单条命令
docker compose exec -u root <service> sh以 root 用户进入容器
docker compose exec -it <service> bash交互式进入容器
docker compose run <service> <command>在容器内执行一次性命令

网络与卷管理 ​

命令说明
docker network ls | grep <project>查看当前项目使用的网络
docker network inspect <network>查看网络详情
docker volume ls查看所有数据卷
docker volume inspect <volume>查看数据卷详情
docker network prune清理未使用的网络
docker volume prune清理未使用的数据卷

配置文件管理 ​

命令说明
docker compose config验证配置文件语法
docker compose config --resolve-image-digests查看解析后的完整配置
docker compose config > compose.rendered.yml导出渲染后的配置文件

扩展与清理 ​

命令说明
docker compose up -d --scale <svc>=<n>横向扩展服务副本数
docker compose pause暂停所有服务
docker compose unpause恢复所有服务
docker compose rm删除已停止的容器
docker compose rm -f强制删除所有容器(含运行中)
docker compose ps --project-name查看当前项目名称

模板 ​

docker-compose
version: '3.8'

# ============================================================
# 服务配置
# ============================================================

services:
  # 服务名(自定义)
  <service_name>:

    # ========== 镜像来源 ==========

    # 【写法1】直接使用现有镜像
    image: <registry>/<image_name>:<tag>

    # 【写法2】从 Dockerfile 构建(简写)
    build: <./path/to/build/dir>

    # 【写法3】从 Dockerfile 构建(完整参数)
    build:
      context: <./path/to/build/dir>          # 构建上下文目录(必填)
      dockerfile: <Dockerfile.alternate>      # 指定 Dockerfile 文件名(默认 Dockerfile)
      args:                                   # 构建参数(--build-arg)
        <ARG_NAME>: <value>
        <ARG_NAME2>: <value2>
      target: <builder>                       # 多阶段构建的目标阶段
      network: <host|none>                    # 构建时使用的网络模式
      cache_from:                             # 指定缓存来源镜像
        - <image1>:<tag>
        - <image2>:<tag>
      labels:                                 # 给镜像打标签
        - "key=value"
      shm_size: <512m>                        # /dev/shm 大小

    # 【写法4】先构建后命名(image + build 同时写)
    image: <最终镜像名>:<tag>
    build:
      context: .
      dockerfile: Dockerfile


    # ========== 容器运行配置 ==========

    container_name: <容器名>                  # 容器名称(唯一,多副本时不要用)
    hostname: <主机名>                        # 容器内主机名
    restart: <always|unless-stopped|on-failure|no>  # 重启策略
    privileged: <true|false>                 # 特权模式
    user: <"UID:GID">                        # 运行用户,如 "1000:1000"
    working_dir: </app>                      # 工作目录

    # command 多种写法(用于指定容器启动时执行的命令)
    command: <"npm start">                   # 字符串写法
    # 或
    command:                                 # 数组写法
      - "npm"
      - "start"
      - "--port"
      - "3000"

    # entrypoint 多种写法(用于指定容器启动时的入口点)
    entrypoint: <"/entrypoint.sh">           # 字符串写法
    # 或
    entrypoint:                              # 数组写法
      - "/entrypoint.sh"
      - "--force"

    tty: <true|false>                        # 分配伪终端(-t)
    stdin_open: <true|false>                 # 保持 STDIN 打开(-i)


    # ========== 端口映射 ==========

    ports:
      # 完整格式:宿主机IP:宿主机端口:容器端口/协议
      - "<宿主机端口>:<容器端口>"              # 如 "8080:80"
      - "<宿主机IP>:<宿主机端口>:<容器端口>"    # 如 "127.0.0.1:8080:80"
      - "<容器端口>"                          # 随机映射宿主机端口
      - "<宿主机端口>:<容器端口>/udp"          # UDP 协议
      - "<宿主机端口>:<容器端口>/tcp"          # TCP 协议(默认)
      - "<起始端口>-<结束端口>:<起始端口>-<结束端口>"  # 端口范围映射,如 "8000-8010:8000-8010"


    # ========== 数据卷挂载 ==========

    volumes:
      # 【语法1】宿主机路径挂载(推荐相对路径)
      - <./宿主机路径>:<容器路径>
      - <./宿主机路径>:<容器路径>:ro          # :ro 只读
      - <./宿主机路径>:<容器路径>:rw          # :rw 读写(默认)

      # 【语法2】命名卷(需在顶层 volumes 声明)
      - <volume_name>:<容器路径>
      - <volume_name>:<容器路径>:ro

      # 【语法3】匿名卷(仅指定容器路径,Docker 自动创建)
      - <容器路径>

      # 【语法4】tmpfs 挂载(内存文件系统,写在 volumes 里或单独用 tmpfs 指令)
      - type: tmpfs
        target: <容器路径>
        tmpfs:
          size: <100m>

      # 【语法5】绑定挂载的高级写法
      - type: bind
        source: <./宿主机路径>
        target: <容器路径>
        read_only: <true|false>
        bind:
          propagation: <rshared|shared|private|rprivate|slave|rslave>

      # 【语法6】卷挂载的高级写法
      - type: volume
        source: <volume_name>
        target: <容器路径>
        read_only: <true|false>
        volume:
          nocopy: <true|false>               # 禁止从容器复制数据到卷

    # tmpfs 独立指令(简写方式)
    tmpfs:
      - <容器路径>
      - <容器路径>:<权限>                     # 如 /tmp:rw


    # ========== 环境变量 ==========

    # 【方式1】直接定义(键值对)
    environment:
      - <KEY>=<value>
      - <KEY2>=<value2>
      - <KEY3>                                # 从宿主机环境变量取值

    # 【方式2】从文件加载(文件格式:KEY=value,每行一个)
    env_file:
      - <.env>                                # 单个文件
      - <./config/app.env>                    # 多个文件,按顺序覆盖


    # ========== 依赖关系 ==========

    depends_on:
      # 简写:仅表达启动顺序
      - <service_name>
      - <service_name2>

      # 完整写法:指定等待条件
      <service_name>:
        condition: <service_started|service_healthy|service_completed_successfully>
        # service_started: 等待容器启动(默认)
        # service_healthy: 等待健康检查通过
        # service_completed_successfully: 等待容器正常退出(任务型容器)
      # 注意:depends_on 只控制启动顺序,不保证服务完全可用


    # ========== 网络 ==========

    # 连接到网络(需在顶层 networks 声明)
    networks:
      - <network_name>
      - <network_name2>

      # 指定网络别名和 IP
      <network_name>:
        aliases:
          - <alias_name>                      # 网络别名(DNS 解析)
        ipv4_address: <172.20.0.10>           # 静态 IPv4(需网络开启 ipam)
        ipv6_address: <2001:db8::c001>        # 静态 IPv6

    # 单独设置网络模式(不连接自定义网络时)
    network_mode: <bridge|host|none|container:<容器名>|service:<服务名>>


    # ========== 资源限制 ==========

    # 注意:cpus 和 memory 限制在单机模式下同样有效
    # 但 deploy 块整体属于 Swarm,单机模式下直接写 cpus 和 mem_limit 更简单
    # 兼容写法(两种都保留,dockser-compose 会忽略 deploy)
    mem_limit: <512M>                          # 内存上限(旧语法)
    memswap_limit: <1G>                        # 内存+交换分区上限
    mem_swappiness: <60>                       # 内存交换倾向(0-100)
    cpus: <0.5>                                # CPU 上限(旧语法)


    # ========== 健康检查 ==========

    healthcheck:
      # test 的多种写法
      test: ["CMD", "curl", "-f", "http://localhost:80/health"]
      # test: ["CMD-SHELL", "curl -f http://localhost:80/health || exit 1"]
      # test: ["NONE"]                        # 禁用父镜像的健康检查
      interval: <30s>                         # 检查间隔
      timeout: <10s>                          # 超时时间
      retries: <3>                            # 连续失败几次视为不健康
      start_period: <40s>                     # 启动后多久开始检查
      start_interval: <5s>                    # 启动期间检查间隔(v3.8+)


    # ========== 日志配置 ==========

    logging:
      driver: <json-file|syslog|journald|gelf|fluentd|awslogs|splunk|etwlogs|gcplogs|none>
      options:
        # json-file 驱动选项
        max-size: "<10m>"
        max-file: "<3>"
        compress: "<true|false>"
        # syslog 驱动选项
        syslog-address: "<tcp://192.168.0.1:514>"
        syslog-facility: "<daemon>"
        # fluentd 驱动选项
        fluentd-address: "<localhost:24224>"
        tag: "<{{.ImageName}}>"


    # ========== 系统配置 ==========

    sysctls:
      - net.core.somaxconn=<1024>
      - net.ipv4.tcp_syncookies=<0>
      # 或者键值对写法
      # net.core.somaxconn: 1024

    extra_hosts:
      - "<hostname>:<ip>"                     # 如 "host.docker.internal:host-gateway"
      - "<domain.com>:192.168.1.100"

    dns:
      - <8.8.8.8>
      - <1.1.1.1>

    dns_search:
      - <example.com>
      - <subdomain.example.com>

    cap_add:
      - <SYS_ADMIN>
      - <NET_ADMIN>
    cap_drop:
      - <MKNOD>

    security_opt:
      - <label:level:Low>                     # SELinux 标签
      - <apparmor:my-profile>                 # AppArmor 配置文件
      - <no-new-privileges:true>              # 禁止提权

    devices:
      - "<宿主机设备>:<容器设备>:<权限>"        # 如 "/dev/ttyUSB0:/dev/ttyUSB0:rwm"

    group_add:
      - <1000>                                # 附加组 ID
      - <1001>

    init: <true|false>                        # 是否使用 init 进程(PID 1)


# ============================================================
# 网络声明
# ============================================================

networks:
  <network_name>:
    driver: <bridge|host|none|macvlan|ipvlan>  # 默认 bridge(注意:overlay 是 Swarm 的,已删)
    driver_opts:
      <com.docker.network.bridge.name>: <net_bridge>  # 网卡名称
    ipam:                                               # IP 地址管理
      driver: <default>                                  # 默认 default
      config:
        - subnet: <172.20.0.0/16>
          ip_range: <172.20.0.0/24>
          gateway: <172.20.0.1>
          aux_addresses:
            <host1>: <172.20.0.10>
    external: <true|false>                               # true 表示使用已存在的网络
    external_name: <external_network_name>              # 外部网络名(external=true 时)
    internal: <true|false>                               # 内部网络(无法访问外部)
    labels:
      - "key=value"


# ============================================================
# 数据卷声明
# ============================================================

volumes:
  <volume_name>:
    driver: <local>                                      # 卷驱动
    driver_opts:
      type: <none|bind|nfs|tmpfs>                        # 挂载类型
      device: <设备路径>                                  # 如 /mnt/data 或 nfs://server/path
      o: <bind>                                          # 挂载选项
    external: <true|false>                               # true 表示使用已存在的卷
    external_name: <external_volume_name>               # 外部卷名
    labels:
      - "key=value"
    name: <自定义卷名>                                    # 覆盖 compose 中使用的名称