有几种方法可用来优化 Docker build 过程和生成的 Docker 映像。 本文档详细介绍了 Docker build 过程的操作原理,并演示了使用 Windows 容器创建最佳映像所用的几种策略。
Docker Build
映像层
在检查 Docker build 优化之前,请务必了解 Docker build 的工作原理。 在 Docker build 过程中,会占用 Dockerfile 并且在其自身临时的容器中一对一地运行每个可操作的指令。 结果是,每个可操作的指令都有一个新映像层。
看一看以下 Dockerfile。 在此示例中,正在使用 windowsservercore
基本操作系统映像,安装 IIS,然后创建一个简单的网站。
复制
# Sample Dockerfile
FROM windowsservercore
RUN dism /online /enable-feature /all /featurename:iis-webserver /NoRestart
RUN echo "Hello World - Dockerfile" > c:\inetpub\wwwroot\index.html
CMD [ "cmd" ]
从此 Dockerfile 来看,可预计生成的映像含有两个层:一个用于容器操作系统映像,另一个包括 IIS 和网站,但是这里不是这样的。 新映像由多个层构成,每个层依赖于前者。 若要形象地说明这一点,可以针对新映像运行 docker history
命令。 这样可以显示映像由四个层组成:基层和其他三个附加层。每个层在 Dockerfile 中都对应一条指令。
复制
docker history iis
IMAGE CREATED CREATED BY SIZE COMMENT
f4caf476e909 16 seconds ago cmd /S /C REM (nop) CMD ["cmd"] 41.84 kB
f0e017e5b088 21 seconds ago cmd /S /C echo "Hello World - Dockerfile" > c 6.816 MB
88438e174b7c About a minute ago cmd /S /C dism /online /enable-feature /all / 162.7 MB
6801d964fda5 4 months ago 0 B
每个层都可以映射到 Dockerfile 的一条指令。 底层(本示例中为 6801d964fda5
)代表基本操作系统映像。 上面一层,可以看到 IIS 安装。 下一层包括新的网站,依次类推。
可以编写 Dockerfiles,以最小化映像层、优化生成性能,也可以优化修饰性的项目,例如可读性等。 完成相同的映像生成任务基本上有多种方式。 了解 Dockerfile 的格式如何影响生成时间和生成的映像,以及如何提升自动化体验。
优化映像大小
构建 Docker 容器映像时,映像大小可能是一个重要因素。 容器映像在注册表和主机之间移动、导出和导入,最终占用了空间。 在 Docker build 过程中,可采用几种策略尽可能减小映像大小。 本部分详细介绍一些特定于 Windows 容器的策略。
有关 Dockerfile 最佳做法的附加信息,请参阅 Best practices for writing Dockerfiles on Docker.com(在 Docker.com 上编写 Dockerfile 的最佳做法)。