教你如何从正在运行的容器创建 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 映像内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Docker数据卷容器创建及使用方法解析

    数据卷容器是一个专门用来挂载数据卷的容器,该容器主要是供其他容器引用和使用.所谓的数据卷容器,实际上就是一个普通的容器,举例如下: 创建数据卷容器 使用如下方式创建数据卷容器: docker run -itd -v /usr/share/nginx/html/ --name mydata ubuntu 命令执行效果如下图: 引用容器 使用如下命令引用数据卷容器: docker run -itd --volumes-from mydata -p 80:80 --name nginx1 nginx

  • docker 创建容器时指定容器ip的实现示例

    Docker创建容器时默认采用bridge网络,自行分配ip,不允许自己指定. 在实际部署中,我们需要指定容器ip,不允许其自行分配ip,尤其是搭建集群时,固定ip是必须的. 我们可以创建自己的bridge网络 : mynet,创建容器的时候指定网络为mynet并指定ip即可. 查看网络模式 docker network ls 创建一个新的bridge网络 docker network create --driver bridge --subnet=172.18.12.0/16 --gatewa

  • Docker创建容器时目录权限踩坑

    昨天写项目时需要用到Mysql的衍生版本percona, 就想用Doker来安装.结果踩了一晚上坑, 今早终于解决. 现记录在此. 这个坑原因是我对linux的目录权限问题不敏感导致的. 我的系统是ubuntu16.04, 运行 docker pull percona 拉取镜像时一切正常. 拉取完后,输入 docker images查看所有镜像, 显示正常: 然后我创建容器,命令为(执行时不要有换行): docker create --name percona -v /data/mysql-da

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

    1.容器是独立运行的一个或一组应用,及他们的运行环境.容器是Docker中的一个重要的概念. 2.docker容器的启动有三种方式 a.交互方式,基于镜像新建容器并启动 例如我们可以启动一个容器,打印出当前的日历表 [root@rocketmq-nameserver4 ~]# docker run my/python:v1 cal ##my/python:v1为镜像名和标签 我们还可以通过指定参数,启动一个bash交互终端. [root@rocketmq-nameserver4 ~]# dock

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

    Docker 容器通常是缺乏内部状态的临时应用程序实例.这是处理它们的最佳实践方法,可让您随时停止或重新启动容器. 但有时对容器文件系统的修改是不可避免的.也许您正在试用软件并希望稍后返回快照.另一个用例可能是容器内的软件停止工作并且您希望保存一个副本以供将来调试的情况. 以下是如何从现有容器创建新的 Docker 映像.然后,您将能够从该映像启动另一个容器,该容器将填充第一个容器的文件系统. 提交容器 该docker commit命令用于获取容器并从中生成新图像.它适用于已停止或正在运行的容器

  • Docker运行Nacos容器自动退出问题的解决方法

    Dokcer运行Nacos容器自动退出问题 参考博文 学生党,租的云服务器,2核2G.使用Docker运行Nacos容器的时候发现总是自动退出.Nacos日志里面没有明显的报错信息.查了一下是内存溢出错误,指令如下 journalctl -k | grep -i -e memory -e oom 发生了OOM错误,自动杀死了相关进程 又重新看了下Nacos日志,如下图所示,发现堆内存设置的太大了,初始堆内存Xms设置的1G,最大堆内存Xmx设置的1G,年轻代Xmn设置的512M. 问题找到了,将

  • 教你如何在windows 10家庭版上安装docker

    本人之前写Redis书和Spring Cloud Alibaba书时,发现一些分布式组件更适合安装在linux环境,而在搭建Redis等集群时,更需要linux环境. 本人日常练习代码和写书所用的机器,操作系统是windows 10家庭版,为了模拟linux环境,一种解决方法是安装docker.刚开始安装时,发现装不上,后来请教了别人,同时在网上找了些方法后,最终安装成功了. 自认为这个步骤不大顺利,中间也解决了若干问题,在这篇文章里,就详细列出安装步骤,并给出解决相关问题的方法,以供大家参考.

  • php运行时动态创建函数的方法

    本文实例讲述了php运行时动态创建函数的方法.分享给大家供大家参考.具体分析如下: 一般的语言函数必须定义了在运行,而php支持在运行时动态创建函数,下面是一个简单的范例,在运动时根据不同的条件创建函数$a <?php if (count($_POST) > 0) { $prepped = create_function('$a', 'return trim($_POST[$a]);'); } elseif (count($_GET) > 0) { $prepped = create_f

  • 两种方式创建docker镜像的启动容器时区别介绍(总结篇)

    Docker是建立在Linux内核基础上的,在目前的主流Linux系统中,都已经原生支持了Docker且使用体验也最好,当然,在Windows平台和MacOS系统中也支持Docker,只是需要使用类似Boot2Docker等虚拟化工具来提供Linux支持. 下面重点给大家介绍基于两种创建docker镜像的启动容器时区别,感兴趣的朋友可以跟着小编一起学习! 1.凡是用docker commit生成的镜像启动的时候可以加载一个启动自己应用的脚本,例如: docker run -d -P tomcat

  • C#在运行时动态创建类型的实现方法

    本文实例讲述了C#在运行时动态创建类型的实现方法.是C#项目开发中很实用的技巧.分享给大家供大家参考.具体分析如下: 具体来说,C# 在运行时动态的创建类型是通过动态生成C#源代码,然后通过编译器编译成程序集的方式实现动态创建类型的. 主要功能代码如下: public static Assembly NewAssembly() { //创建编译器实例. provider = new CSharpCodeProvider(); //设置编译参数. cp = new CompilerParamete

  • java教程之java程序编译运行图解(java程序运行)

    首先我们在桌面,开始->运行->键入cmd 回车,进入windows命令行.进入如图所示的画面: 可知,当前默认目录为C盘Users文件夹下的Administrator文件夹.一般而言,我们习惯改变当前目录.由于windows有磁盘分区,若要跳到其他磁盘,例如E盘,有几种方法: 1.输入命令: pushd 路径(此命令可将当前目录设为所希望的任一个已存在的路径) 2.输入命令: e:  转移到e盘,然后再输入 cd 转移到所希望的已知路径. 如图: 希望在windows命令行下使用javac.

  • 运行在容器中的Oracle XE-11g

    Oracle XE Oracle是这样介绍XE的:11g XE(Express Edition)简化版是在Oracle11gR2基础之上一个入门级的小体量数据库,免费用于开发/部署与发布,下载很快,使用简单. 特性 Oracle XE主要适用对象: 适用与适用Node.js, Python, PHP, Java, .NET, XML和开源项目的开发者 需要一个免费可用于DBA进行起步阶段的数据库培训或者部署 需要一个免费的起步阶段的数据库的独立软件提供商ISV(Independent Softw

  • Docker容器下运行Nginx并实现反向代理

    目录 一.前言 二.运行Nginx容器 1.获取Nginx镜像 2.运行Nginx容器 三.运行ASP.NET Core应用程序 1.构建ASP.NET Core应用程序镜像 2.运行应用容器 三.设置反向代理 一.前言 我们知道,为了安全考虑,我们一般会设置反向代理,用来屏蔽应用程序真实的IP和端口号.在Linux系统上最常用的反向代理就是Nginx.本篇文章中,我们会通过Docker容器分别运行一个Nginx容器和一个ASP.NET Core应用程序的容器,然后设置反向代理. 二.运行Ngi

随机推荐