如何从正在运行的容器创建 Docker 映像

x33g5p2x  于2022-02-14 转载在 Docker  
字(2.2k)|赞(0)|评价(0)|浏览(265)

Docker 容器通常是缺乏内部状态的临时应用程序实例。这是处理它们的最佳实践方法,可让您随时停止或重新启动容器。

但有时对容器文件系统的修改是不可避免的。也许您正在试用软件并希望稍后返回快照。另一个用例可能是容器内的软件停止工作并且您希望保存一个副本以供将来调试的情况。

以下是如何从现有容器创建新的 Docker 映像。然后,您将能够从该映像启动另一个容器,该容器将填充第一个容器的文件系统。

提交容器

该docker commit命令用于获取容器并从中生成新图像。它适用于已停止或正在运行的容器。

基本语法如下:

docker commit example-container example-image:latest

这会从名为 的容器中创建一个图像example-container。如果您愿意,还可以通过 ID 识别容器。这两条信息都可以从docker ps列出主机上所有容器的输出中获得。

生成的图像被分配作为命令的第二个参数给出的标签。这example-image:latest在上面显示的示例中。就像常规的图像标记操作一样,如果新图像已经存在,它将替换标记的引用。

现在你可以使用你的镜像将文件系统从example-container一个新的容器实例中恢复:

docker run -d example-image:latest

文件系统内容将在命令执行example-container时与容器匹配有一个重要的警告:安装卷的内容将不包括在内,因此它们的安装位置在创建的容器映像中将是空的。要运行具有完整卷数据的新容器,请在使用启动第二个实例时使用标志从第一个容器重新附加卷。docker commit-vdocker run

另一个值得注意的症结是 Docker 如何处理正在运行的容器的提交。在大多数情况下,这应该可以无缝地工作,但它默认在创建提交之前暂停目标容器。镜像创建完成后容器内的所有进程都会暂停,然后再恢复。这提高了新映像中的数据一致性,但暂时无法访问容器。–pause false您可以通过包含在您的docker commit命令中来禁用此行为。

添加提交消息

该docker commit命令以与 Git 等版本控制软件类似的方式支持提交消息。从容器创建映像时添加消息可让您记录更改的内容以及提交背后的原因。

使用–messageor-m标志来应用提交消息:

docker commit -m "Example commit" example-container example-image:latest

您也可以使用专用标志添加作者信息。将通用First Name email@example.com格式的字符串提供给–authoror-a标志。它将与提交消息一起保存。

docker commit -a "Example Author <example@example.com>" -m "Example commit" example-container example-image:latest

docker history当您使用该命令查看图像中的图层时,会显示提交消息。它们将显示在COMMENT最右侧的列中。

访问此信息的另一种方法是与从图像的 JSON 表示中提取作者身份和评论值docker inspect一起使用:grep

docker inspect <image-id> | grep 'Created\|Author\|Comment'

更改 Dockerfile 指令
提交一个镜像让你有机会改变它的一些 Dockerfile 指令。您可以在新图像中覆盖以下值:

  • CMD
  • ENTRYPOINT
  • ENV
  • EXPOSE
  • LABEL
  • ONBUILD
  • USER
  • VOLUME
  • WORKDIR

要设置指令,请使用–changeor-c标志:

docker commit --change 'ENTRYPOINT ["sh"]' example-container example-image:latest

您可以根据需要多次重复该标志以应用所有预期的更改。

仅支持影响最顶层文件系统层的指令。您无法通过 和 等指令无缝扩展已提交的图像与新RUN层COPY。但是,如果需要,您可以获取提交的结果并编写一个新的 Dockerfile 来添加新内容:

# Created via `docker commit`
FROM example-image:latest
RUN apt install example-package

如果您确实在提交时更改了 Dockerfile 指令,则值得添加一条提交消息来解释您正在修改的内容以及原因。这将帮助任何其他有权访问图像的人了解与创建图像的容器相比的任何行为差异。

概括
Docker 镜像通常由 Dockerfiles 构建并用于启动一次性容器。对容器文件系统状态的更改是通过重建镜像、销毁现有容器和启动新容器来实现的。在理想世界中,容器没有任何内部状态,但在实践中并非总是如此。

提交容器为您提供了一种在未来恢复其当前文件系统的方法。提交对于创建麻烦容器的副本很有用,因此您可以在单独的环境中进行调试,同时保持对先前生成的日志和临时文件的访问。

尽管容器提交通常感觉类似于 VM 快照,但它们并不完全相同。VM 控制虚拟硬件,并且该硬件的状态将出现在快照中。Docker 容器只是主机上运行的一组进程;提交是一个新的 Docker 映像,它代表容器的文件系统,但必然缺少有关进程、内核和硬件状态的任何数据。

相关文章