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 |
| 标签 | docker、containers、devops、infrastructure、compose、images、volumes、networks、debugging |
参考:完整的 SKILL.md 文件
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 ps 或 lsof -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:PORT或docker port NAME进行测试 - 镜像是否已构建? → 使用
docker images | grep TAG查看 - Compose 集群状态是否正常? → 使用
docker compose ps查看,所有服务状态应为“running”或“healthy” - 存储空间是否已释放? → 使用
docker system df对比操作前后的存储使用情况
Dockerfile 优化建议
在审查或创建 Dockerfile 时,可参考以下优化措施:
- 采用多阶段构建 —— 将构建环境与运行环境分离,从而减小最终镜像的体积
- 合理排列层顺序 —— 先放置依赖项,再放源代码,避免更改导致缓存层失效
- 合并 RUN 命令 —— 减少层数量,进而缩小镜像体积
- 使用
.dockerignore文件 —— 排除node_modules、.git、__pycache__等文件 - 锁定基础镜像版本 —— 使用具体版本号,如
node:20-alpine,而非node:latest - 以非 root 用户身份运行 —— 添加
USER指令以提高安全性 - 选择轻量级基础镜像 —— 例如使用
python:3.12-slim而非python:3.12