Doker 使用中的注意事项
在做本地 CI/CD 过程中,需要自建服务以及部署使用到了 Docker
这个工具,同时也遇到了一系列的小问题需要大家注意。
这里只做提示不展示具体的解决过程,属于部署过程的 checklist
基础
容器数据持久化
- 容器重启时,未持久化的数据将丢失。
- 建议:
- 使用 Volumes 或挂载主机目录进行持久化。
端口映射
- 忘记映射端口,或映射端口与主机已有服务冲突。
- 建议:
- 确认容器端口并使用
docker run -p host_port:container_port
明确指定映射。
- 确认容器端口并使用
时区问题
- 默认容器内时区可能与宿主机不一致。
- 建议:
- 运行容器时设置环境变量
-e TZ=Asia/Shanghai
。
- 运行容器时设置环境变量
镜像管理
镜像过大
- 使用未优化的镜像导致体积庞大,占用空间和带宽。
- 建议:
- 使用精简基础镜像(如 Alpine)。
- 使用多阶段构建(Multi-stage Build)减少镜像体积。
镜像标签混乱
- 未合理使用镜像标签,导致版本混乱。
- 建议:
- 明确使用版本标签,不使用 latest 标签作为生产部署。
安全
容器权限过高
- 默认 root 用户权限高,易产生安全风险。
- 建议:
- 创建专门的低权限用户运行容器应用。
- 尽可能避免使用–privileged选项。
Dockerfile 中敏感信息泄露
- 将敏感信息(如密码)直接写在 Dockerfile 中。
- 建议:
- 使用环境变量或 secret 管理工具(如 Docker secrets)处理敏感信息。
性能优化
资源限制未设置
- 容器默认未设置资源限制,可能导致资源耗尽。
- 建议:
- 使用–memory和–cpus限制容器资源占用。
日志占用空间过大
- Docker 日志默认无限增长,可能导致磁盘爆满。
- 建议:
- 设置日志滚动策略,例如:
docker run --log-opt max-size=10m --log-opt max-file=3
- 设置日志滚动策略,例如:
网络
默认网络隔离问题
- 默认 Bridge 网络下容器间使用 IP 地址通信,IP 会变化。
- 建议:
- 创建自定义网络,并以容器名作为主机名通信:
1
2docker network create my-net
docker run --network=my-net --name=my-container
- 创建自定义网络,并以容器名作为主机名通信:
Docker Compose
服务启动顺序和依赖问题
- Docker Compose 中服务的启动顺序无法确保依赖服务完全启动完成。
- 建议:
- 通过服务健康检查机制或启动脚本明确判断服务是否准备完毕。
环境变量与.env文件冲突
- Docker Compose 中的环境变量可能与宿主机环境变量冲突。
- 建议:
- 明确使用.env文件管理环境变量,避免意外冲突。
运维管理
孤儿容器和镜像积压
- 长时间运行可能产生大量无用镜像和容器。
- 建议:
- 定期清理无用容器和镜像:
1
docker system prune -a
- 定期清理无用容器和镜像:
容器日志未集中管理
- 容器日志分散,难以排查问题。
- 建议:
- 使用 ELK、Fluentd、Loki 等日志聚合工具统一管理容器日志。