Docker development best practices

预计阅读时间:4分钟

以下开发模式已被证明有助于人们使用 Docker 构建应用程序. 如果您发现了我们应该添加的内容,请告诉我们.

How to keep your images small

启动容器或服务时,小图像更快地通过网络拉取并更快地加载到内存中. 有一些经验法则可以保持较小的图像尺寸:

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

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

    • 如果您需要使用不包含多阶段构建的 Docker 版本,请尝试通过最小化 Dockerfile 中单独的RUN命令的数量来减少映像中的层数. 您可以通过将多个命令合并到单个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标签.

Where and how to persist application data

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

Use CI/CD for testing and deployment

  • When you check in a change to source control or create a pull request, use 码头工人中心 or another CI/CD pipeline to automatically build and tag a Docker image and test it.

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

Differences in development and production environments

Development Production
使用绑定挂载让您的容器可以访问您的源代码. 使用卷来存储容器数据.
使用适用于 Mac 的 Docker Desktop 或适用于 Windows 的 Docker Desktop. 使用 Docker 引擎,如果可能的话,使用用户映射来更好地隔离 Docker 进程与主机进程.
不用担心时间漂移. 始终在 Docker 主机和每个容器进程中运行 NTP 客户端,并将它们全部同步到同一个 NTP 服务器. 如果您使用 swarm 服务,还要确保每个 Docker 节点将其时钟同步到与容器相同的时间源.
application, development

by  icopy.site