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

 更新时间:2022年02月14日 14:44:49   作者:mikes zhang  
这篇文章主要介绍了如何从正在运行的容器创建 Docker 映像,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在这里插入图片描述

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 映像,它代表容器的文件系统,但必然缺少有关进程、内核和硬件状态的任何数据。

到此这篇关于如何从正在运行的容器创建 Docker 映像的文章就介绍到这了,更多相关容器创建 Docker 映像内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • docker内部容器之间的端口访问实现方法

    docker内部容器之间的端口访问实现方法

    alpine-client 与 alpine-server 两容器,前者访问后者监听之端口,以此探析 Docker 内部容器间端口访问机制,这篇文章主要介绍了如何实现docker内部容器之间的端口访问,需要的朋友可以参考下
    2024-04-04
  • 阿里云CentOS 6.5 安装Docker详细步骤

    阿里云CentOS 6.5 安装Docker详细步骤

    这篇文章主要介绍了阿里云CentOS 6.5 安装Docker的相关资料,现在都是云时代和大数据时代,希望大家也能跟着时代的步伐,需要的朋友可以参考下
    2016-10-10
  • Docker容器的创建、启动、和停止的方法

    Docker容器的创建、启动、和停止的方法

    这篇文章主要介绍了Docker容器的创建、启动、和停止的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Linux系统docker部署.net core3.1的详细步骤

    Linux系统docker部署.net core3.1的详细步骤

    这篇文章主要介绍了Linux系统docker部署.net core3.1,文章演示基本的基于docker部署.netcore服务,linux系统腾讯云ubuntu,.net core版本3.1,需要的朋友可以参考下
    2022-09-09
  • 详解Docker 容器使用 cgroups 限制资源使用

    详解Docker 容器使用 cgroups 限制资源使用

    本篇文章主要介绍了Docker 容器使用 cgroups 限制资源使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • Docker安装(Ubuntu 64bit)的方法步骤

    Docker安装(Ubuntu 64bit)的方法步骤

    本篇文章主要介绍了 Docker安装 Ubuntu 64bit的方法步骤,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 使用Dockerfile制作jdk镜像的详细教程

    使用Dockerfile制作jdk镜像的详细教程

    在Docker的世界里,Dockerfile是一个至关重要的文本文件,它定义了如何构建Docker镜像,通过编写Dockerfile,开发者可以确保他们的应用程序及其依赖项被正确地打包、优化和部署,本文将深入探讨Dockerfile的组成、常用指令以及编写高效Dockerfile的最佳实践
    2024-12-12
  • docker如何打包前端并运行完整步骤详解

    docker如何打包前端并运行完整步骤详解

    这篇文章主要介绍了使用Vue3和Vite1开发前端项目的过程,包括项目启动、开发服务器运行、构建生产环境以及使用Docker部署,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-01-01
  • Docker部署Mysql集群的实现

    Docker部署Mysql集群的实现

    这篇文章主要介绍了Docker部署Mysql集群的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • docker查询日志并输出到文件的方法

    docker查询日志并输出到文件的方法

    docker的运行的时候我们喜欢采用 -d 的命令来启动docker容器,这就导致了一个问题,无法直接看到docker运行日志,只能去后台进去找到日志文件查看,下面这篇文章主要给大家介绍了关于docker查询日志并输出到文件的相关资料,需要的朋友可以参考下
    2023-06-06

最新评论