Docker 容器运维实战:从部署到监控的全链路管理


阿里云特惠 - 新用户专享

Docker 容器运维实战:从部署到监控的全链路管理

Docker 已经成为容器化部署的标准工具,但很多运维人员在日常管理中仍然面临各种挑战。本文分享 Docker 容器运维的实战经验,涵盖部署、监控、故障排查等各个环节。

一、Docker 部署最佳实践

1. 镜像优化

# 使用多阶段构建减小镜像体积
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production

FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/node_modules ./node_modules
COPY . .
CMD ["node", "server.js"]

# 优化前后对比
# 优化前:node:18 基础镜像约 900MB
# 优化后:node:18-alpine 基础镜像约 120MB

2. 资源限制

docker run -d \
  --name myapp \
  --memory="512m" \
  --cpus="1.0" \
  --memory-swap="1g" \
  --restart=unless-stopped \
  myapp:latest

# 查看容器资源使用
docker stats myapp

3. 网络配置

# 创建自定义网络
docker network create --driver bridge app-network

# 运行容器并连接网络
docker run -d --network app-network --name web nginx:alpine
docker run -d --network app-network --name app myapp:latest

二、Docker 监控方案

1. 使用 cAdvisor

# 运行 cAdvisor(容器监控)
docker run -d \
  --name=cadvisor \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:ro \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  gcr.io/cadvisor/cadvisor:latest

# 访问 http://localhost:8080 查看监控数据

2. 使用 Prometheus + Grafana

docker run -d --name prometheus \
  -p 9090:9090 \
  -v /path/to/prometheus.yml:/etc/prometheus/prometheus.yml \
  prom/prometheus

docker run -d --name grafana \
  -p 3000:3000 \
  grafana/grafana

# 在 Grafana 中导入 Docker 监控仪表盘模板

三、常用运维命令

# 查看所有容器(包括停止的)
docker ps -a

# 查看容器日志(实时)
docker logs -f myapp

# 查看容器资源使用
docker stats --no-stream

# 进入容器执行命令
docker exec -it myapp /bin/bash

# 复制文件到容器
docker cp localfile.txt myapp:/path/in/container/

# 从容器复制文件
docker cp myapp:/path/in/container/remotefile.txt .

# 查看容器详细信息
docker inspect myapp

# 查看容器端口映射
docker port myapp

# 查看容器进程
docker top myapp

四、日志管理

1. 配置日志驱动

# 使用 json-file 驱动(默认)
docker run --log-driver=json-file --log-opt max-size=10m myapp

# 使用 syslog 驱动
docker run --log-driver=syslog myapp

# 使用 journald 驱动
docker run --log-driver=journald myapp

2. 日志轮转配置

# 编辑 /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

# 重启 Docker
sudo systemctl restart docker

五、故障排查

1. 容器无法启动

# 查看容器日志
docker logs myapp

# 查看容器详细状态
docker inspect myapp

# 检查资源限制
docker stats --no-stream myapp

# 手动运行容器查看错误
docker run --rm myapp:latest

2. 容器频繁重启

# 查看重启策略
docker inspect myapp | grep RestartPolicy -A 2

# 查看重启次数
docker inspect myapp | grep RestartCount

# 查看最近重启时间
docker inspect myapp | grep StartedAt

3. 性能问题

# 查看资源使用
docker stats myapp

# 进入容器查看进程
docker exec -it myapp top

# 查看容器网络连接
docker exec -it myapp netstat -tulpn

六、Docker Compose 多容器编排

# docker-compose.yml
version: '3.8'
services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    depends_on:
      - app
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf

  app:
    image: myapp:latest
    environment:
      - DB_HOST=db
      - DB_PORT=3306
    depends_on:
      - db

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:
# 启动所有服务
docker-compose up -d

# 查看服务状态
docker-compose ps

# 查看日志
docker-compose logs -f

# 停止所有服务
docker-compose down

七、Docker 安全加固

# 1. 使用非 root 用户运行
FROM node:18-alpine
RUN addgroup -g 1001 -S nodejs
RUN adduser -S nodejs -u 1001
USER nodejs

# 2. 只读文件系统
docker run --read-only myapp:latest

# 3. 禁用特权模式
docker run --privileged=false myapp:latest

# 4. 限制 capabilities
docker run --cap-drop=ALL --cap-add=NET_BIND_SERVICE myapp:latest

# 5. 使用 AppArmor/SELinux
docker run --security-opt apparmor=docker-default myapp:latest

八、Docker 清理

# 清理停止的容器
docker container prune

# 清理未使用的镜像
docker image prune -a

# 清理未使用的卷
docker volume prune

# 清理未使用的网络
docker network prune

# 一键清理所有
docker system prune -a --volumes

总结

Docker 容器运维是一个系统工程。从镜像优化、资源限制,到监控告警、日志管理,再到故障排查、安全加固,每个环节都不可忽视。建议建立完善的 Docker 运维体系,让容器化部署更加稳定高效。

发表评论