0%

Doker 使用中的注意事项

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
      2
      docker 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 等日志聚合工具统一管理容器日志。