将应用整合到容器中并且运行起来的这个过程,称为“容器化”(Containerizing)

容器化是一种将应用及其依赖项打包在容器中的技术,以确保应用在不同环境中的一致性和可移植性。

  1. 不要在容器中存储数据:

  2. 容器是设计为一次性的,因此不应该在容器内部存储数据。

  3. 操作:将数据存储在外部的持久化存储中,如云存储服务或网络文件系统。
  4. 使用持久化存储卷(如Docker卷或Kubernetes持久卷)来存储数据。
  5. 示例:在Docker中,你可以使用docker run -v命令来挂载一个卷到容器中。

  6. 不要发布两份应用:

  7. 每个容器应该只运行一个应用。

  8. 操作:避免在一个容器中部署多个应用,确保容器的单一职责。

  9. 确保Dockerfile或Kubernetes部署配置中只包含一个应用。

  10. 示例:在Dockerfile中,只添加一个应用的依赖和启动命令。

  11. 清除不必要的包和文件:

  12. 容器镜像应该只包含运行应用所需的最小化文件和库。

  13. 操作:在构建镜像前,清理不必要的文件和依赖,以减小镜像大小,加快启动速度。
  14. 在构建镜像时,使用.dockerignore文件来排除不必要的文件和目录。
  15. 示例:在.dockerignore文件中添加*\*.log*来忽略所有日志文件。

  16. 不要在容器中运行多个进程:

  17. 容器设计用于运行单个主进程。

  18. 操作:如果需要运行多个服务,考虑使用多个容器,每个容器运行一个服务。
  19. 使用Docker Compose或Kubernetes来管理多个容器,每个容器运行一个进程。
  20. 示例:在Docker Compose中,定义多个服务,每个服务运行一个容器。

  21. 不要在镜像中存储凭据,使用环境变量:

  22. 避免在容器镜像或应用代码中硬编码敏感信息。

  23. 操作:使用环境变量或配置文件来管理敏感信息,并在运行时注入这些变量。
  24. 在Dockerfile中使用ENV指令来设置环境变量。
  25. 示例:ENV DB_HOST=db.example.com。
  26. 在运行容器时,使用-e参数传递环境变量。
  27. 示例:docker run -e DB_HOST=$DB_HOST myimage。

  28. 使用非root用户运行:

  29. 默认情况下,容器以root用户运行,这可能带来安全风险。

  30. 操作:在Dockerfile中使用USER指令指定一个非root用户来运行容器。
  31. 在Dockerfile中指定一个非root用户。
  32. 示例:FROM ubuntu后跟USER myuser。
  33. 构建镜像时,确保镜像中的USER指令指定了正确的用户

  34. 不要依赖IP地址:

  35. 容器的IP地址可能会变化,依赖IP地址可能导致通信问题。

  36. 操作:使用服务发现机制或容器编排工具(如Kubernetes)来管理服务间的通信,而不是直接使用IP地址。
  37. 使用服务发现工具(如Consul、Etcd)或容器编排工具(如Kubernetes)的服务发现机制。
  38. 示例:在Kubernetes中,使用服务(Service)资源来暴露应用,并使用服务名称进行通信。

另外的一些,镜像打包要最小化,这个关于dockerfilde 的一些优化

设置健康检查

日志管理

监控配置集成

容器镜像安全

遵循这些原则可以帮助你更安全、高效地使用容器技术。在实际操作中,你可能需要根据具体的应用场景和需求来调整这些原则的应用方式。