Docker开发最佳实践
预计阅读时间:4分钟
事实证明,以下开发模式对使用Docker构建应用程序的人们很有帮助。如果您发现了我们应该添加的内容,请 告诉我们。
如何缩小图像
小图像在启动容器或服务时更快地通过网络传输,更快地加载到内存中。有一些经验法则可以使图像尺寸较小:
-
从适当的基础映像开始。例如,如果您需要JDK,请考虑将映像基于正式
openjdk
映像,而不是从通用ubuntu
映像开始并openjdk
作为Dockerfile的一部分进行安装。 -
使用多阶段构建。例如,您可以使用该
maven
映像构建您的Java应用程序,然后重置为该tomcat
映像并将Java构件复制到正确的位置以部署您的应用程序,所有这些操作都在同一Dockerfile中。这意味着您的最终映像不包括构建所引入的所有库和依赖项,而仅包括运行它们所需的工件和环境。-
如果需要使用不包含多阶段构建的Docker版本,请尝试通过最小化
RUN
Dockerfile中单独命令的数量来减少映像中的层数。您可以通过将多个命令合并为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主机上的内存,并更快地加载。
-
为了使生产映像保持精简但允许进行调试,请考虑将生产映像用作调试映像的基础映像。可以在生产映像的顶部添加其他测试或调试工具。
-
当构建映像,始终与编纂版本信息,预期目标(有用的标签标记它们
prod
或test
为实例),稳定性,或其他信息,部署在不同环境中应用程序时非常有用。不要依赖自动创建的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节点将其时钟同步到与容器相同的时间源。 |