如何保持图像小
在启动容器或服务时,小图像可以更快地通过网络,并且可以更快地加载到内存中。有一些经验法则可以保持图像尺寸小:
从适当的基本图像开始。例如,如果您需要JDK,请考虑将您的图像基于官方
openjdk
图像,而不是从通用ubuntu
图像开始并openjdk
作为Dockerfile的一部分进行安装。使用多级构建。例如,您可以使用该
maven
映像构建Java应用程序,然后重置为tomcat
映像并将Java工件复制到正确的位置以部署您的应用程序,所有这些都在同一个Dockerfile中。这意味着您的最终图像不包含构建所引入的所有库和依赖项,而只包含运行它们所需的工件和环境。如果您需要使用不包含多级构建的Docker版本,请尝试通过最小化
RUN
Dockerfile 中单独命令的数量来减少图像中的图层数。您可以通过将多个命令合并为RUN
一行并使用shell的机制将它们组合在一起来实现此目的。考虑以下两个片段。第一个在图像中创建两个图层,而第二个图层仅创建一个图层。1
2RUN apt-get -y update
RUN apt-get install -y python1
RUN apt-get -y update && apt-get install -y python
如果您有多个共同点的图像,请考虑使用共享组件创建自己的基本图像,并在其上创建独特的图像。Docker只需要加载公共层一次,然后缓存它们。这意味着您的衍生图像可以更有效地使用Docker主机上的内存并加载更快。
要使生产映像保持精简但允许调试,请考虑使用生产映像作为调试映像的基本映像。可以在生产映像之上添加其他测试或调试工具。
在构建图像时,始终使用有用的标记对其进行标记,这些标记用于编码版本信息,预期目标(
prod
或者test
,例如),稳定性或在不同环境中部署应用程序时有用的其他信息。不要依赖自动创建的latest
标签。在何处以及如何保留应用程序数据
避免使用存储驱动程序将应用程序数据存储在容器的可写层中 。这会增加容器的大小,从I/O角度来看,与使用卷或绑定装载相比效率较低。
- 而是使用卷存储数据。
- 适合使用
bind mounts
的一种情况 是在开发期间,您可能希望将源目录或刚刚构建的二进制文件挂载到容器中。对于生产,请使用卷,将其安装到与开发期间装入绑定装置相同的位置。 - 对于生产,使用
secrets
来存储服务使用的敏感应用程序数据,并对 配置文件等非敏感数据使用configs
。如果您当前使用独立容器,请考虑迁移以使用单一副本服务,以便您可以利用这些仅限服务的功能。
使用CI/CD进行测试和部署
- 当您检查对源代码管理的更改或创建拉取请求时,请使用CI/CD自动构建和标记Docker镜像并对其进行测试。
开发和生产环境的差异
发展 | 生产 |
---|---|
使用bind mounts 为您的容器提供对源代码的访问权限。 |
使用卷来存储容器数据。 |
使用Docker for Mac或Docker for Windows。 | 如果可能,请使用Docker EE,并使用userns-remap 以更好地隔离Docker进程与主机进程。 |
不要担心时间漂移。 | 始终在Docker主机上和每个容器进程内运行NTP客户端,并将它们全部同步到同一个NTP服务器。如果使用swarm服务,还要确保每个Docker节点将其时钟与容器同步到同一时间源。 |