Docker开发最佳实践

预计阅读时间:4分钟

事实证明,以下开发模式对使用Docker构建应用程序的人们很有帮助。如果您发现了我们应该添加的内容,请 告诉我们

如何缩小图像

小图像在启动容器或服务时更快地通过网络传输,更快地加载到内存中。有一些经验法则可以使图像尺寸较小:

  • 从适当的基础映像开始。例如,如果您需要JDK,请考虑将映像基于正式openjdk映像,而不是从通用ubuntu映像开始并openjdk作为Dockerfile的一部分进行安装。

  • 使用多阶段构建。例如,您可以使用该maven映像构建您的Java应用程序,然后重置为该tomcat映像并将Java构件复制到正确的位置以部署您的应用程序,所有这些操作都在同一Dockerfile中。这意味着您的最终映像不包括构建所引入的所有库和依赖项,而仅包括运行它们所需的工件和环境。

    • 如果需要使用不包含多阶段构建的Docker版本,请尝试通过最小化RUNDockerfile中单独命令的数量来减少映像中的层数。您可以通过将多个命令合并为RUN一行并使用Shell的机制将它们组合在一起来实现此目的。考虑以下两个片段。第一层在图像中创建两层,而第二层仅创建一层。

      RUN apt-get -y update
      RUN apt-get install -y python
      
      RUN apt-get -y update && apt-get install -y python
      
  • 如果您有多个共同点,请考虑使用共享的组件创建自己的 基本映像,然后在此基础上创建唯一的映像。Docker只需要加载一次公共层,就可以对其进行缓存。这意味着您的派生映像将更有效地使用Docker主机上的内存,并更快地加载。

  • 为了使生产映像保持精简但允许进行调试,请考虑将生产映像用作调试映像的基础映像。可以在生产映像的顶部添加其他测试或调试工具。

  • 当构建映像,始终与编纂版本信息,预期目标(有用的标签标记它们prodtest为实例),稳定性,或其他信息,部署在不同环境中应用程序时非常有用。不要依赖自动创建的latest标签。

在何处以及如何保留应用程序数据

  • 避免使用存储驱动程序将应用程序数据存储在容器的可写层中 。这会增加容器的大小,并且从I / O角度来看,效率不如使用卷或绑定安装。
  • 而是使用volume存储数据。
  • 一种适合使用 绑定挂载的情况是在开发过程中,当您可能想挂载源目录或刚刚内置在容器中的二进制文件时。对于生产,请改用卷,将其安装到与开发期间安装绑定安装架相同的位置。
  • 对于生产,请使用机密存储服务使用的敏感应用程序数据,并 针对非敏感数据(例如配置文件)使用configs。如果当前使用独立容器,请考虑迁移以使用单副本服务,以便可以利用这些仅服务功能。

使用CI / CD进行测试和部署

  • 当您签入对源代码管理的更改或创建拉取请求时,请使用 Docker Hub或其他CI / CD管道自动构建并标记Docker映像并对其进行测试。

  • 通过要求您的开发,测试和安全团队在将映像 部署到生产中之前对映像进行签名,可以使这一点更进一步。这样,在将映像部署到生产中之前,它已经由例如开发,质量和安全团队进行了测试和签名。

开发和生产环境的差异

发展 生产
使用绑定挂载使您的容器可以访问源代码。 使用卷来存储容器数据。
使用适用于Mac的Docker Desktop或适用于Windows的Docker Desktop。 如果可能,请使用Docker Engine与用户映射来更好地将Docker进程与主机进程隔离。
不用担心时间漂移。 始终在Docker主机和每个容器进程中运行NTP客户端,并将它们全部同步到同一NTP服务器。如果使用群集服务,还请确保每个Docker节点将其时钟同步到与容器相同的时间源。
应用程序开发