Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help


title: “Docker Management” sidebar_label: “Docker Management” description: “Manage Docker containers, images, volumes, networks, and Compose stacks — lifecycle ops, debugging, cleanup, and Dockerfile optimization”

{/* 本页面由 website/scripts/generate-skill-docs.py 根据技能对应的 SKILL.md 文件自动生成。请直接编辑源文件 SKILL.md,而非此页面。 */}

Docker 管理

使用标准的 Docker CLI 命令来管理 Docker 容器、镜像、卷、网络以及 Compose 集群——涵盖生命周期操作、故障排查、清理工作以及 Dockerfile 优化。

技能元数据

来源可选 —— 通过 hermes skills install official/devops/docker-management 安装
路径optional-skills/devops/docker-management
版本1.0.0
创建者sprmn24
许可证MIT
支持平台linux、macos、windows
标签dockercontainersdevopsinfrastructurecomposeimagesvolumesnetworksdebugging

参考:完整的 SKILL.md 文件

:::info 以下是当触发该技能时 Hermes 会加载的完整技能定义。技能处于激活状态时,Agent 就会看到这些指令作为操作指南。
::

Docker 管理

利用标准的 Docker CLI 命令来管理 Docker 容器、镜像、卷、网络以及 Compose 集群。除 Docker 本身外无需其他额外依赖。

适用场景

  • 运行、停止、重启、删除或检查容器
  • 构建、拉取、推送、标记或清理 Docker 镜像
  • 使用 Docker Compose 管理多服务集群
  • 管理卷或网络配置
  • 排查崩溃的容器或分析日志
  • 检查 Docker 磁盘使用情况并释放空间
  • 审查或优化 Dockerfile

先决条件

  • 已安装并正在运行的 Docker Engine
  • 用户已被添加到 docker 组中(或使用 sudo 权限)
  • Docker Compose v2(随现代 Docker 安装包一同提供)

快速检查:

docker --version && docker compose version

快速参考

操作命令
运行容器(后台模式)docker run -d --name NAME IMAGE
停止并删除容器docker stop NAME && docker rm NAME
查看日志(实时跟踪)docker logs --tail 50 -f NAME
进入容器终端docker exec -it NAME /bin/sh
列出所有容器docker ps -a
构建镜像docker build -t TAG .
启动 Docker Compose 服务docker compose up -d
停止 Docker Compose 服务docker compose down
查看磁盘使用情况docker system df
清理无用资源docker image prune && docker container prune

操作流程

1. 确定所属领域

首先判断请求属于以下哪个范畴:

  • 容器生命周期管理 → 运行、停止、启动、重启、删除、暂停/取消暂停
  • 容器交互操作 → 执行命令、复制文件、查看日志、检查状态、获取统计信息
  • 镜像管理 → 构建、拉取、推送、标记标签、删除镜像、保存/加载镜像
  • Docker Compose 管理 → 启动、停止、列出服务、查看日志、执行命令、构建配置、修改配置
  • 卷与网络管理 → 创建、检查、删除、清理无用资源、连接网络
  • 故障排查 → 日志分析、退出码检查、资源问题处理

2. 容器操作

运行新容器:

# Detached service with port mapping
docker run -d --name web -p 8080:80 nginx

# With environment variables
docker run -d -e POSTGRES_PASSWORD=secret -e POSTGRES_DB=mydb --name db postgres:16

# With persistent data (named volume)
docker run -d -v pgdata:/var/lib/postgresql/data --name db postgres:16

# For development (bind mount source code)
docker run -d -v $(pwd)/src:/app/src -p 3000:3000 --name dev my-app

# Interactive debugging (auto-remove on exit)
docker run -it --rm ubuntu:22.04 /bin/bash

# With resource limits and restart policy
docker run -d --memory=512m --cpus=1.5 --restart=unless-stopped --name app my-app

常用标志:-d 表示分离模式,-it 表示交互式终端模式,--rm 表示自动移除容器,-p 用于指定端口(格式为:主机地址:容器端口),-e 用于设置环境变量,-v 用于挂载卷,--name 用于指定容器名称,--restart 用于设置重启策略。

管理正在运行的容器:

docker ps                        # running containers
docker ps -a                     # all (including stopped)
docker stop NAME                 # graceful stop
docker start NAME                # start stopped container
docker restart NAME              # stop + start
docker rm NAME                   # remove stopped container
docker rm -f NAME                # force remove running container
docker container prune           # remove ALL stopped containers

与容器交互:

docker exec -it NAME /bin/sh          # shell access (use /bin/bash if available)
docker exec NAME env                   # view environment variables
docker exec -u root NAME apt update    # run as specific user
docker logs --tail 100 -f NAME         # follow last 100 lines
docker logs --since 2h NAME            # logs from last 2 hours
docker cp NAME:/path/file ./local      # copy file from container
docker cp ./file NAME:/path/           # copy file to container
docker inspect NAME                    # full container details (JSON)
docker stats --no-stream               # resource usage snapshot
docker top NAME                        # running processes

3. 图像管理

# Build
docker build -t my-app:latest .
docker build -t my-app:prod -f Dockerfile.prod .
docker build --no-cache -t my-app .              # clean rebuild
DOCKER_BUILDKIT=1 docker build -t my-app .       # faster with BuildKit

# Pull and push
docker pull node:20-alpine
docker login ghcr.io
docker tag my-app:latest registry/my-app:v1.0
docker push registry/my-app:v1.0

# Inspect
docker images                          # list local images
docker history IMAGE                   # see layers
docker inspect IMAGE                   # full details

# Cleanup
docker image prune                     # remove dangling (untagged) images
docker image prune -a                  # remove ALL unused images (careful!)
docker image prune -a --filter "until=168h"   # unused images older than 7 days

4. Docker Compose

# Start/stop
docker compose up -d                   # start all services detached
docker compose up -d --build           # rebuild images before starting
docker compose down                    # stop and remove containers
docker compose down -v                 # also remove volumes (DESTROYS DATA)

# Monitoring
docker compose ps                      # list services
docker compose logs -f api             # follow logs for specific service
docker compose logs --tail 50          # last 50 lines all services

# Interaction
docker compose exec api /bin/sh        # shell into running service
docker compose run --rm api npm test   # one-off command (new container)
docker compose restart api             # restart specific service

# Validation
docker compose config                  # validate and view resolved config

最简的 compose.yml 示例:

services:
  api:
    build: .
    ports:
      - "3000:3000"
    environment:
      - DATABASE_URL=postgres://user:pass@db:5432/mydb
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  pgdata:

5. 卷与网络

# Volumes
docker volume ls                       # list volumes
docker volume create mydata            # create named volume
docker volume inspect mydata           # details (mount point, etc.)
docker volume rm mydata                # remove (fails if in use)
docker volume prune                    # remove unused volumes

# Networks
docker network ls                      # list networks
docker network create mynet            # create bridge network
docker network inspect mynet           # details (connected containers)
docker network connect mynet NAME      # attach container to network
docker network disconnect mynet NAME   # detach container
docker network rm mynet                # remove network
docker network prune                   # remove unused networks

6. 磁盘使用情况与清理

在开始清理之前,请务必先进行诊断分析:

# Check what's using space
docker system df                       # summary
docker system df -v                    # detailed breakdown

# Targeted cleanup (safe)
docker container prune                 # stopped containers
docker image prune                     # dangling images
docker volume prune                    # unused volumes
docker network prune                   # unused networks

# Aggressive cleanup (confirm with user first!)
docker system prune                    # containers + images + networks
docker system prune -a                 # also unused images
docker system prune -a --volumes       # EVERYTHING — named volumes too

警告: 未经用户确认,切勿运行 docker system prune -a --volumes 命令。该命令会删除可能包含重要数据的命名卷。

常见问题

问题原因解决方案
容器立即退出主进程已结束或崩溃查看 docker logs NAME,尝试使用 docker run -it --entrypoint /bin/sh IMAGE 启动容器
“端口已被占用”有其他进程正在使用该端口使用 docker pslsof -i :PORT 查找占用端口的进程
“设备空间不足”Docker 存储空间已满先执行 docker system df 查看情况,再针对性地进行清理
无法连接到容器应用程序在容器内绑定到 127.0.0.1 地址应程序需绑定到 0.0.0.0,请检查 -p 参数的映射设置
卷访问被拒绝主机与容器的 UID/GID 不匹配使用 --user $(id -u):$(id -g) 参数指定用户身份,或修正权限设置
Compose 服务之间无法通信网络配置或服务名称有误服务会以服务名称作为主机名,需检查 docker compose config 的配置内容
构建缓存失效Dockerfile 中的层顺序错误将更改频率较低的层放在前面(先将依赖项放入,再放源代码)
镜像体积过大未使用多阶段构建,也未添加 .dockerignore 文件采用多阶段构建方式,并添加 .dockerignore 文件

结果验证

执行任何 Docker 操作后,都需验证结果是否正确:

  • 容器已启动? → 使用 docker ps 查看,状态应为“Up”
  • 日志是否正常? → 使用 docker logs --tail 20 NAME 查看,确保没有错误信息
  • 端口是否可访问? → 使用 curl -s http://localhost:PORTdocker port NAME 进行测试
  • 镜像是否已构建? → 使用 docker images | grep TAG 查看
  • Compose 集群状态是否正常? → 使用 docker compose ps 查看,所有服务状态应为“running”或“healthy”
  • 存储空间是否已释放? → 使用 docker system df 对比操作前后的存储使用情况

Dockerfile 优化建议

在审查或创建 Dockerfile 时,可参考以下优化措施:

  1. 采用多阶段构建 —— 将构建环境与运行环境分离,从而减小最终镜像的体积
  2. 合理排列层顺序 —— 先放置依赖项,再放源代码,避免更改导致缓存层失效
  3. 合并 RUN 命令 —— 减少层数量,进而缩小镜像体积
  4. 使用 .dockerignore 文件 —— 排除 node_modules.git__pycache__ 等文件
  5. 锁定基础镜像版本 —— 使用具体版本号,如 node:20-alpine,而非 node:latest
  6. 以非 root 用户身份运行 —— 添加 USER 指令以提高安全性
  7. 选择轻量级基础镜像 —— 例如使用 python:3.12-slim 而非 python:3.12