Docker 日常使用的核心是规范操作、性能优化、安全管控、故障排查,掌握以下要点能大幅提升使用效率,减少踩坑,覆盖开发、测试、生产全场景:
一、基础操作:规范使用容器 / 镜像
1. 容器管理(核心)
- 命名规范:创建容器时用
--name指定有意义的名称(如nginx-prod-80),避免默认随机名,便于后续管理:bash
运行
docker run -d --name nginx-prod -p 80:80 nginx - 资源限制:生产环境必须限制容器 CPU / 内存,避免抢占宿主机资源:
bash
运行
# 限制1核CPU、512M内存,内存上限1G docker run -d --name app --cpus=1 --memory=512m --memory-swap=1g app-image - 重启策略:根据场景配置
--restart,避免容器异常退出后无人值守:策略 适用场景 no测试容器(默认,不重启) always核心服务(只要停止就重启) on-failure:5应用服务(非 0 退出时重启,最多 5 次) unless-stopped生产服务(手动停止前一直重启) - 容器清理:避免无用容器占用资源,定期清理:
bash
运行
# 停止所有运行容器 docker stop $(docker ps -q) # 删除已停止容器 docker rm $(docker ps -aq) # 一键清理停止的容器、悬空镜像、网络等 docker system prune -f # -f 免确认,生产环境谨慎
2. 镜像管理
- 镜像命名:遵循
仓库/名称:版本(如myapp/backend:v1.2.3),避免latest(易导致版本混乱); - 镜像瘦身:
- 使用多阶段构建(Dockerfile),仅保留运行时依赖:
dockerfile
# 构建阶段 FROM maven:3.8 AS builder COPY . /app RUN mvn package -f /app/pom.xml # 运行阶段(仅保留jar包) FROM openjdk:8-jre-slim COPY --from=builder /app/target/app.jar /app.jar CMD ["java", "-jar", "/app.jar"] - 避免在 Dockerfile 中执行
apt update后不清理缓存(rm -rf /var/lib/apt/lists/*);
- 使用多阶段构建(Dockerfile),仅保留运行时依赖:
- 镜像备份 / 迁移:
bash
运行
# 导出镜像为tar包 docker save -o app.tar myapp/backend:v1.2.3 # 导入镜像 docker load -i app.tar - 镜像清理:删除悬空镜像(无标签)、无用镜像:
bash
运行
docker rmi $(docker images -f "dangling=true" -q) # 删除悬空镜像
二、数据管理:确保数据安全不丢失
Docker 容器默认「无状态」,数据需通过数据卷(Volume) 或「绑定挂载」持久化:
1. 优先用数据卷(推荐)
数据卷由 Docker 管理,稳定性高,支持跨容器共享:
bash
运行
# 创建命名卷
docker volume create nginx-conf
# 挂载卷到容器(配置文件持久化)
docker run -d --name nginx -v nginx-conf:/etc/nginx nginx
# 查看卷位置(便于手动修改配置)
docker volume inspect nginx-conf
2. 绑定挂载(开发场景)
直接挂载宿主机目录到容器,适合开发时实时同步代码:
bash
运行
# 宿主机./code 挂载到容器/app,修改宿主机代码直接生效
docker run -d --name app -v $(pwd)/code:/app app-image
3. 注意事项
- 生产环境禁止用
/tmp等临时目录挂载关键数据; - 定期备份数据卷:
docker run --rm -v nginx-conf:/source -v $(pwd):/dest alpine cp -r /source/* /dest/nginx-conf-backup; - 避免容器内修改挂载目录权限导致宿主机权限混乱(可在 Dockerfile 中提前设置)。
三、网络管理:避免端口冲突 / 网络隔离
1. 自定义网络(推荐)
默认bridge网络下容器需暴露端口到宿主机,自定义网络可实现容器间内网通信,无需暴露端口:
bash
运行
# 创建自定义桥接网络
docker network create app-network
# 启动容器加入该网络(容器间可通过容器名互相访问)
docker run -d --name mysql --network app-network -e MYSQL_ROOT_PASSWORD=123456 mysql
docker run -d --name app --network app-network app-image # 容器内可通过mysql:3306访问数据库
2. 端口映射规范
- 生产环境避免用
-P(随机端口),明确指定-p 宿主机端口:容器端口; - 宿主机端口尽量用非 80/443 等常用端口(如
8080:80),避免冲突; - 查看端口映射:
docker port 容器名。
四、日志与监控:快速定位问题
1. 日志管理
- 查看容器日志(核心排障手段):
bash
运行
docker logs 容器名 # 查看全部日志 docker logs -f 容器名 # 实时跟踪日志 docker logs --since 10m 容器名 # 查看最近10分钟日志 docker logs --tail 100 容器名 # 查看最后100行日志 - 日志持久化:默认日志存在宿主机
/var/lib/docker/containers/,可通过docker run --log-driver=local --log-opt max-size=100m --log-opt max-file=3限制日志大小,避免占满磁盘; - 生产环境推荐将日志输出到 ELK、Loki 等日志平台,而非仅存本地。
2. 监控容器状态
- 基础监控:
docker stats(实时查看容器 CPU / 内存 / 网络占用); - 健康检查:生产容器必须配置健康检查(详见前文),避免「容器 Up 但应用不可用」;
- 进阶监控:用
cAdvisor/Prometheus+Grafana监控容器指标,实现告警。
五、安全管控:避免权限 / 镜像风险
1. 容器权限
- 禁止用
--privileged(特权模式)运行容器,除非必须(如需要访问宿主机设备); - 用普通用户运行容器(在 Dockerfile 中创建非 root 用户):
dockerfile
FROM alpine RUN adduser -D appuser USER appuser # 后续命令以appuser执行 - 限制容器挂载宿主机敏感目录(如
/etc、/var/run/docker.sock)。
2. 镜像安全
- 优先用官方镜像 / 可信仓库镜像,避免未知来源镜像;
- 拉取镜像时指定具体版本(如
nginx:1.24.0),而非latest; - 扫描镜像漏洞:
docker scan 镜像名(需登录 Docker Hub)。
3. 其他安全措施
- 禁止容器内运行
systemctl/service等宿主机管理命令; - 生产环境开启 Docker TLS 认证,禁止裸奔暴露 2375 端口。
六、Dockerfile 编写规范(核心)
Dockerfile 是镜像构建的核心,规范编写能减少镜像问题:
- 指令精简:合并 RUN 命令(减少镜像层),如:
dockerfile
# 不推荐(多图层) RUN apt update RUN apt install -y curl # 推荐(合并) RUN apt update && apt install -y curl && rm -rf /var/lib/apt/lists/* - 使用
.dockerignore:排除无关文件(如node_modules、.git),减少构建上下文大小; - 避免无用依赖:仅安装运行时必需的包(如用
alpine镜像替代ubuntu,体积更小); - 指定工作目录:用
WORKDIR替代RUN cd,更稳定:dockerfile
WORKDIR /app # 后续命令均在/app执行 COPY . . # 无需指定路径
七、生产环境额外要点
- 避免单机 Docker:生产推荐用 Docker Swarm/K8s 实现容器编排、高可用;
- 自动重启 + 健康检查:所有核心容器必须配置健康检查 +
on-failure重启策略; - 镜像版本固化:每次发布镜像打唯一标签(如 git commit id),避免回滚困难;
- 宿主机资源监控:监控 Docker 根目录(
/var/lib/docker)磁盘使用率,避免日志 / 镜像占满磁盘; - 备份恢复:定期备份数据卷、镜像,制定容器故障恢复预案。
八、常见问题速查
| 问题现象 | 排查方向 |
|---|---|
| 容器启动后立即退出 | 查看日志docker logs,检查 CMD/ENTRYPOINT |
| 容器端口映射后无法访问 | 检查宿主机防火墙、容器内应用是否监听 0.0.0.0 |
| 容器内存占用过高 | docker stats定位,调整--memory限制 |
| 镜像构建慢 | 检查 Dockerfile 构建上下文,换国内镜像源 |
总结
Docker 日常使用的核心是「规范」(命名、权限、版本)+「可控」(资源、日志、健康检查)+「安全」(镜像、权限、数据)。遵循以上要点,既能提升开发效率,也能保障生产环境稳定,减少 90% 以上的常见问题。
35

被折叠的 条评论
为什么被折叠?



