15.8.7 常用命令与生命周期管理

本节聚焦 docker-compose 的日常操作与生命周期管理,帮助在开发、测试与生产环境中安全、高效地启动、更新、诊断与清理多容器应用。

一、常用命令速查#

说明:以下命令默认在含有 docker-compose.yml 的目录执行。

  • 启动与创建
  • docker-compose up:创建并启动服务
  • docker-compose up -d:后台运行
  • docker-compose up --build:启动前重建镜像
  • 停止与删除
  • docker-compose stop:停止服务
  • docker-compose down:停止并删除容器、默认网络
  • docker-compose down -v:同时删除匿名卷
  • 查看与日志
  • docker-compose ps:查看服务状态
  • docker-compose logs -f --tail=200:实时查看日志
  • docker-compose top:查看容器进程
  • 进入容器
  • docker-compose exec 服务名 sh/bash
  • docker-compose run --rm 服务名 命令
  • 重启与更新
  • docker-compose restart 服务名
  • docker-compose up -d --no-deps --build 服务名

命令解释示例

# 启动所有服务并后台运行
docker-compose up -d

# 仅重建 web 服务镜像并滚动替换,不重启依赖
docker-compose up -d --no-deps --build web

# 查看所有服务状态(NAME/STATE/PORTS)
docker-compose ps

# 持续查看 app 服务最近 200 行日志
docker-compose logs -f --tail=200 app

二、生命周期管理流程#

原理草图

文章图片

标准流程示例

# 1) 初始化:拉取镜像并创建
docker-compose pull
docker-compose up -d

# 2) 运行:观察服务状态与日志
docker-compose ps
docker-compose logs -f --tail=50

# 3) 变更:更新镜像并滚动重启指定服务
docker-compose pull app
docker-compose up -d --no-deps --build app

# 4) 停机:优雅停止所有服务
docker-compose stop

# 5) 清理:删除容器与默认网络
docker-compose down

三、服务更新与滚动策略#

示例场景:更新 app 服务镜像

# 拉取最新镜像
docker-compose pull app

# 仅更新 app,不重启 db、redis
docker-compose up -d --no-deps --build app

# 预期效果:app 容器被替换,依赖服务不受影响
docker-compose ps

更新注意点
- 确保 depends_onhealthcheck 设置合理,避免依赖未就绪导致重启循环。
- 修改 .envdocker-compose.yml 后需重建或重启对应服务。

示例:健康检查配置片段

# 文件:docker-compose.yml
services:
  app:
    image: myapp:latest
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 10s
      timeout: 3s
      retries: 3

四、日志与诊断要点#

排查流程示例

# 1) 查看服务整体状态
docker-compose ps

# 2) 定位异常服务日志
docker-compose logs -f --tail=200 app

# 3) 进入容器检查进程与配置
docker-compose exec app sh
ps -ef
cat /etc/app/config.yml

# 4) 检查网络解析
docker-compose exec app ping -c 2 db

预期效果
- docker-compose ps 中服务状态为 Uphealthy
- ping db 能解析到依赖服务 IP

五、资源与安全清理#

清理命令示例

# 清理已停止的容器、未使用网络
docker system prune

# 删除无用镜像(包括未引用)
docker image prune -a

# 清理孤立数据卷(谨慎使用)
docker volume prune

生产建议
- 清理前确保业务数据已备份或使用命名卷。

六、常见错误与处理#

1) 容器反复重启
- 现象:docker-compose ps 显示 Restarting
- 处理:

docker-compose logs --tail=200 app
docker-compose exec app sh -c "ls -l /data && cat /var/log/app.log"

2) 端口冲突
- 现象:启动报错 Bind for 0.0.0.0:8080 failed
- 处理:

ss -lntp | grep 8080
# 修改端口映射后重启
docker-compose up -d

3) 配置不生效
- 现象:修改配置后服务仍使用旧值
- 处理:

docker-compose up -d --build app
docker-compose exec app cat /etc/app/config.yml

4) 权限问题
- 现象:写入挂载目录失败
- 处理:

# 确认宿主机目录权限
ls -ld /data/app
# 适当调整权限或使用一致的 UID/GID
chown -R 1000:1000 /data/app

七、安装与环境准备(Compose)#

若系统未安装 Docker Compose,可按以下步骤安装(以 Linux 为例)。

# 1) 下载并安装 docker compose 插件(Docker 20.10+)
mkdir -p /usr/local/lib/docker/cli-plugins
curl -L https://github.com/docker/compose/releases/download/v2.24.6/docker-compose-linux-x86_64 \
  -o /usr/local/lib/docker/cli-plugins/docker-compose
chmod +x /usr/local/lib/docker/cli-plugins/docker-compose

# 2) 验证
docker compose version

预期效果
- 输出类似:Docker Compose version v2.24.6

八、综合示例:从启动到排错#

目录结构与配置

# 文件:/opt/compose-demo/docker-compose.yml
version: "3.9"
services:
  web:
    image: nginx:1.25
    ports:
      - "8080:80"
    depends_on:
      - app
  app:
    image: hashicorp/http-echo:0.2.3
    command: ["-text=ok", "-listen=:5678"]
    ports:
      - "5678:5678"

操作步骤

cd /opt/compose-demo
docker-compose up -d
docker-compose ps
curl http://localhost:8080

预期效果
- curl 返回 nginx 默认页面(若需反代 app,可再扩展配置)

九、练习题#

  1. 使用 docker-compose up -d --no-deps --build 更新单个服务,观察其他服务是否重启。
  2. 故意占用 8080 端口,再启动 Compose,定位并解决端口冲突。
  3. 修改 docker-compose.yml 中的环境变量,验证重建后配置是否生效。