命令
基本操作
| 命令 | 说明 |
|---|---|
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 中使用的名称