Docker 容器通常是缺乏内部状态的临时应用程序实例。这是处理它们的最佳实践方法,可让您随时停止或重新启动容器。
但有时对容器文件系统的修改是不可避免的。也许您正在试用软件并希望稍后返回快照。另一个用例可能是容器内的软件停止工作并且您希望保存一个副本以供将来调试的情况。
以下是如何从现有容器创建新的 Docker 映像。然后,您将能够从该映像启动另一个容器,该容器将填充第一个容器的文件系统。
提交容器
该命令用于获取容器并从中生成新图像。它适用于已停止或正在运行的容器。
docker commit
基本语法如下:
码头工人提交示例容器示例图像:最新
这会从名为 的容器中创建一个图像。如果您愿意,还可以通过 ID 识别容器。这两条信息都可以从列出主机上所有容器的输出中获得。
example-container
docker ps
生成的图像被分配作为命令的第二个参数给出的标签。这在上面显示的示例中。就像常规的图像标记操作一样,如果新图像已经存在,它将替换标记的引用。
example-image:latest
现在你可以使用你的镜像将文件系统从一个新的容器实例中恢复:
example-container
docker run -d 示例图像:最新
文件系统内容将在命令执行时与容器匹配有一个重要的警告:安装卷的内容将不包括在内,因此它们的安装位置在创建的容器映像中将是空的。要运行具有完整卷数据的新容器,请在使用启动第二个实例时使用标志从第一个容器重新附加卷。
example-container
docker commit
-v
docker run
另一个值得注意的症结是 Docker 如何处理正在运行的容器的提交。在大多数情况下,这应该可以无缝地工作,但它默认在创建提交之前暂停目标容器。镜像创建完成后容器内的所有进程都会暂停,然后再恢复。这提高了新映像中的数据一致性,但暂时无法访问容器。您可以通过包含在您的命令中来禁用此行为。
--pause false
docker commit
添加提交消息
该命令以与 Git 等版本控制软件类似的方式支持提交消息。从容器创建映像时添加消息可让您记录更改的内容以及提交背后的原因。
docker commit
使用or标志来应用提交消息:
--message
-m
docker commit -m“示例提交”示例容器示例图像:最您也可以使用专用标志添加作者信息。将通用格式的字符串提供给or标志。它将与提交消息一起保存。
First Name
--author
-a
docker commit -a "示例作者
" -m "示例提交" example-container example-image:latest
当您使用该命令查看图像中的图层时,会显示提交消息。它们将显示在最右侧的列中。
docker history
COMMENT
访问此信息的另一种方法是与从图像的 JSON 表示中提取作者身份和评论值一起使用:
docker inspect
grep
docker 检查 grep '创建\|作者\|评论'
这将显示与图像中最顶层的数据相关联。
更改 Dockerfile 指令
提交一个镜像让你有机会改变它的一些 Dockerfile 指令。您可以在新图像中覆盖以下值:
- CMD
- ENTRYPOINT
- ENV
- EXPOSE
- LABEL
- ONBUILD
- USER
- VOLUME
- WORKDIR
要设置指令,请使用or标志:
--change
-c
docker commit --change 'ENTRYPOINT ["sh"]' 示例容器示例图像:最新
您可以根据需要多次重复该标志以应用所有预期的更改。
仅支持影响最顶层文件系统层的指令。您无法通过 和 等指令无缝扩展已提交的图像与新层。但是,如果需要,您可以获取提交的结果并编写一个新的 Dockerfile 来添加新内容:
RUN
COPY
# 通过 `docker commit` 创建
来自示例图像:最新
运行 apt install 示例包
如果您确实在提交时更改了 Dockerfile 指令,则值得添加一条提交消息来解释您正在修改的内容以及原因。这将帮助任何其他有权访问图像的人了解与创建图像的容器相比的任何行为差异。
概括
Docker 镜像通常由 Dockerfiles 构建并用于启动一次性容器。对容器文件系统状态的更改是通过重建镜像、销毁现有容器和启动新容器来实现的。在理想世界中,容器没有任何内部状态,但在实践中并非总是如此。
提交容器为您提供了一种在未来恢复其当前文件系统的方法。提交对于创建麻烦容器的副本很有用,因此您可以在单独的环境中进行调试,同时保持对先前生成的日志和临时文件的访问。
尽管容器提交通常感觉类似于 VM 快照,但它们并不完全相同。VM 控制虚拟硬件,并且该硬件的状态将出现在快照中。Docker 容器只是主机上运行的一组进程;提交是一个新的 Docker 映像,它代表容器的文件系统,但必然缺少有关进程、内核和硬件状态的任何数据。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.