xiaowei-system/skills/devops/docker/SKILL.md

5.7 KiB
Raw Blame History

tags name description triggers version
devops
docker Docker container management — build, run, inspect, debug, compose, and troubleshoot containers/images/volumes/networks.
docker
容器
docker-compose
container
dockerfile
image
1.0.0

Docker

Common Operations

Containers

# List running containers
docker ps

# List all containers (including stopped)
docker ps -a

# Run a container
docker run -d --name myapp -p 8080:80 nginx:latest
docker run -d --name db -e POSTGRES_PASSWORD=secret postgres:16

# Run interactively
docker run -it ubuntu:24.04 bash

# Start / stop / restart
docker stop myapp
docker start myapp
docker restart myapp

# Remove
docker rm myapp
docker rm -f myapp   # force remove running container

# View logs
docker logs myapp
docker logs -f myapp        # follow
docker logs --tail 100 myapp

# Inspect
docker inspect myapp
docker stats myapp            # live resource usage

Images

# List images
docker images

# Pull
docker pull nginx:latest

# Build
docker build -t myapp:latest .
docker build -t myapp:latest --build-arg ENV=prod .

# Tag
docker tag myapp:latest myregistry.com/myapp:v1.0

# Push
docker push myregistry.com/myapp:v1.0

# Remove unused
docker image prune -f

# Inspect layers
docker history myapp:latest

Volumes

docker volume create mydata
docker volume ls
docker volume inspect mydata
docker run -v mydata:/data nginx
docker volume rm mydata
docker volume prune -f

Networks

docker network ls
docker network create mynet
docker network connect mynet myapp
docker run --network mynet myapp

docker-compose

# Start (detached)
docker compose up -d

# Start with rebuild
docker compose up -d --build

# Stop
docker compose down

# Stop and remove volumes
docker compose down -v

# View logs
docker compose logs -f

# Restart a service
docker compose restart api

# Scale
docker compose up -d --scale api=3

# Run one-off command
docker compose run --rm api python manage.py migrate

Dockerfile Essentials

FROM python:3.12-slim

WORKDIR /app

# Copy only dependency files first (layer cache optimization)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# Then copy app code
COPY . .

# Non-root user for security
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser

EXPOSE 8080
CMD ["python", "main.py"]

Multi-stage Build

# Stage 1: Build
FROM golang:1.23 AS builder
WORKDIR /build
COPY . .
RUN go build -o myapp

# Stage 2: Run
FROM ubuntu:24.04
COPY --from=builder /build/myapp /usr/local/bin/
CMD ["myapp"]

hermes-agent 实际构建模式(参考)

  • uv 作为 Python 包管理:COPY --from=ghcr.io/astral-sh/uv /uv /usr/local/bin/
  • tini 回收僵尸进程:apt-get install tini && ENTRYPOINT ["/usr/bin/tini", "-g", "--"]
  • 动态 UID 映射:通过 HERMES_UID/HERMES_GID 环境变量在运行时用 usermod 映射

Debugging

Shell into running container

docker exec -it myapp bash
docker exec -it myapp sh        # for alpine

Copy files in/out

docker cp config.json myapp:/app/config.json
docker cp myapp:/app/logs/output.log ./

Check resource usage

docker stats
docker stats --no-stream

Network debugging

docker exec -it myapp curl localhost:8080/health
docker exec -it myapp nslookup db          # DNS lookup
docker exec -it myapp netstat -tlnp        # listening ports

Inspect with dive (layer inspection)

# Install
curl -sL https://raw.githubusercontent.com/wagoodman/dive/master/scripts/get | bash

# Use
dive myapp:latest

Troubleshooting

Problem Fix
Cannot connect to Docker daemon sudo systemctl start docker or add user to docker group
Port already allocated docker ps check, docker rm conflicting container
No space left on device docker system prune -a --volumes
Image pull failure Check registry auth, try docker login
Container exits immediately docker logs — usually missing env var or entrypoint error
Docker not available in cron cron 环境无 TTY无法 sudo。手动安装sudo apt-get install docker.io && sudo usermod -aG docker $USER

Pitfalls

  • cron 环境无 Dockercron 任务没有 TTY无法输入 sudo 密码。Docker 安装需要在有 TTY 的环境中手动执行 sudo apt-get install docker.io,然后 sudo usermod -aG docker $USER 并重新登录。
  • 层缓存失效:每次 COPY . . 后跟 RUN 会让 RUN 步骤在代码变化时重新执行。把依赖文件requirements.txt、go.mod单独提前复制再用 RUN 安装,最后才 COPY 源码。
  • 容器内 root 默认:容器默认以 root 运行,生产环境应创建非 root 用户(RUN useradd -m appuser && USER appuser)。
  • hermes-agent 需要 tiniGateway 进程中可能有 MCP stdio 子进程等,需要 tini 作为 PID 1 回收僵尸进程。

学习计划

学习进度追踪见 references/docker-learning-plan.md

Cleanup

# Remove stopped containers, unused networks, dangling images, build cache
docker system prune -af

# Remove all volumes (DATA LOSS)
docker system prune -af --volumes

模板与参考文件

文件 用途
templates/newapi.Dockerfile Go 静态二进制生产级 Dockerfile 模板
templates/newapi.docker-compose.yml newapi 服务 docker-compose 示例
templates/dockerignore 标准 .dockerignore 模板
references/hermes-agent-docker.md hermes-agent 实际 Dockerfile 设计分析 + newapi 容器化要点
references/docker-china-mirror.md Docker Hub 国内加速DaoCloud 镜像),解决 GFW 阻断