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 运维体系,让容器化部署更加稳定高效。
