Docker 镜像 commit|学习笔记

简介: 快速学习 Docker 镜像 commit

开发者学堂课程【Docker 快速入门Docker 镜像 commit】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/850/detail/14040


Docker 镜像 commit


内容介绍

一、Docker 镜像 commit 的补充

一、Docker 镜像 commit 的补充  

上节课讲到 docker unionFS 的联合文件系统,知道了镜像是层层叠加的。最终一层套一层对外暴露出一个整体。接下来就通过命令和案例,让大家加深对镜像的实际操作和理解。  

这个时候先回到常用命令,这里有 docker commit ,说到 docker commit 的时候,就要想到 git commit,这是第一步。

image.png

第二步容器命令。

image.png

下面看一下:

1、Docker commit 提交容器副本使之成为一个新的镜像

// root@atguigu 桌面]# docker images

image.png

root@atguigu 桌面]#

本地库有四个镜像,其中有一个是  tomcat。现在需要把 tomcat 运行起来,基于运行的 tomcat 是一个容器,如果在当前运行的容器上面做了自定义的修改,当前这个容器 commit 又可以形成一个新的镜像,以此类推。

commit 正常情况下,以当前 image 运行 tomcat,假设正在运行了以后,这个tomcat 做了一些自定义的设计和调整,又把它变成 commit 了以后,成为一个符合需求和定义的新的镜像,这样下次就可以不用原始出场的这个镜像,而是用自己的自定义的镜像。  

比如说买了一部车回来,出厂默认设置。开始它根本就没有导航雷达,但是现在就想在这个车加导航和雷达,又加了翅膀各种模板,现在这辆车一车两用,天上是飞机,地上是汽车,这时依照修改了以后能跑能飞的这个实例,又把它形成一个新的飞车模板,下一代的概念性汽车就出来。这时请看以 tomcat 为例。  

2、docker commit-m=“提交的描述信息”-a=“作者”容器ID要 创建的目标镜像:[标签名]  

//commit-m 是提交的描述信息最多,这就多了个 a,作者,还有容器 ID,就是当前正在运行的这个容器,当前正在跑这个车,改成这样以后,是2.0版的新模板,把它提出来,形成一种新的一套标准和样式,这个标准和样式就是新的镜像。  

3、案例演示  

(1)从 Hub 上下载 tomcat 镜像到本地并成功运行

——docker run -it -p 8080:8080 tomcat

-p 主机端口:docker 容器端口  

-P 随机分配端口  

i: 交互  

t: 终端  

//p:tomcat 默认端口是8080,以前是装在 Windows 上面,local host 8080 出现一只猫,这里不再赘述。现在不是直接访问 tomcat,而是要去访问 docker 里面的tomcat,爬到鲸鱼背上去翻集装箱,这时第一个事就是对外暴露的 docker 可以访问的,比如:

[root@atguigu桌面]#docker run-it-p8888:8080  

Docker 的8888对应着 docker 的端口,tomcat 是默认的8080。如果不加“-p8888:8080”是访问不到的,就看不到那只猫。当然端口可以一致,这里是故意写的不一致,也就是说如果觉得反正大家都默认都是8080,docker 的对外暴露的服务端口也叫8080,内部真正实体也叫8080,一般 local host tomcat 8080都是指tomcat,tomcat 默认端口是8080不多说了。  

[root@atquiqu桌面]# docker run-it-p8888:8080 tomcat

回车

image.png

这些经常在 eclipse 里面出现,各种日志打出来。

点击回车:

image.png

docker 里面跑了一个 tomcat 容器实验8.5.32,这个时候就彻彻底底完成了 docker里面启动 tomcat 这个操作。

接下来,退出。  

[root@atquigu桌面]# docker run-it-p 8888:8080tomcat

现在用的是 p,p 是指定端口。

还有个参数 P,叫随机分配:

[root@atquigu桌面]# docker run-it-P tomcat

回车

[root@atguigu桌面]# docker ps

image.png

[root@atguigu桌面]#

可以清晰地看到,当前正在运行的,先不看这里的 centos。上一节课讲的一个小时之前了。59秒钟以前刚刚起了32768的 tomcat。 这个时候请看32768,这个docker 就是前面这命令P所分配的映射端口,但是 docker 里面的 tomcat 永远还是8080。  

[root@atguigu桌面]#docker ps-l

[root@atguigu桌面]#

image.png

[root@atguigu桌面]#docker ps-n3

image.png

[root@atguigu桌面]#

[root@atguigu桌面]#docker ps-n5

image.png

[root@atguigu桌面]#

image.png

而如果输入原来的8888:

image.png

下面点开32768端口里面的 ducumentation: 也就是说从阿里云下面 tomcat 这个document 是有的,有 tomcat 的说明文档,那么假设根据正在运行的,把ducumentation 这个文档删掉,此时 tomcat 再次访问的时候会显示404 Not found。假设做了一个不需要文档的 tomcat,那这个不需要文档的当前正在运行的容器又形成一个新的模板。这样会导致什么问题呢?只要你后期拿这个新的模板来运行,生成的tomcat 容器,什么都一样,但是点 documentation 是永远访问不到的,因为他根本就没有。

(2)故意删除上一步镜像生产tomcat容器的文档

//

[root@atquigu桌面]# docker run-it-p8888:8080tomcat

Using CATALINA_BASE: /usr/local/tomcat  

Using CATALINA HOME: /usr/local/tomcat  

Using CATALINA TMDIR:/usr/local/tomcat/temp Using JRE_HOME: /docker-java-home/jre  

Using CLASSPATH: /usr/local/tomcat/bin/bootstrapjar:/usr/local/tomcat/bin/tomcat-juli.jar

点击运行。  

[root@atguigu桌面]#docker ps

CONTAINER ID IMAGE COMMAND CREATED  

STATUS PORTS NAMES  

9fa4193e6e9a tomcat "catalina. sh run” 9 seconds ago  

Up 8 seconds 0.0.0.0:8888->8080/tcp condescending_thompson

10b9a3588ab9 centos ”/bin/bash”

About an hour ago  

Up About an hour admiring curie  

[root@atguigu桌面]#    

Tomcat 前台交互站,日志打出来:

image.png

点击 documentation,可以点开:

image.png

image.png

故意删除上一步镜像生产 tomcat 容器的文档

[root@atguigu桌面]# docker ps  

image.png

[root@atquiqu桌面]#dockerexec-it9fa4193e6e9a/bin/bash root@9fa4193e6e9a:/usr/local/tomcat#pwd usr/local/tomcat root@9fa4193e6e9a:/usr/local/tomcat#ll  bash: ll: command not found root@9fa4193e6e9a:/usr/local/tomcat#ls LICENSE NOTICE RELEASE-NOTES RUNNING txt bin conf include lib logs native-ini-lib temp webapps work root@9fa4193e6e9a:/usr/local/tomcat#ls-1 total 120

-rW-r-----. 1 root root57092 Jun 20 19:53LICENSE

-rW-r-----. 1 root root 1723 Jun 20 19:53 NOTICE  

-rW-r-----. 1 root root 7138 Jun 20 19:53 RELEASE-NOTES  

-rW-r-----.1 root root16246 Jun 20 19:53 RUNNINGtxt

drwxr-x---. 2 root root 4096 Jul 402:24 bin  

drwx--S--- 3root root 4096 Jul 11 08:50conf  

drwxr-sr-x. 3 root staff 4096 Jul 402:24include  

drwxr-x---. 2 root root 4096 Jul 402:24 lib  

drwxr-x---. 2 root root4096 Jul 1108:50 logs root@9fa4193e6e9a:/usr/local/tomcat/webapps#pwd usr/local/tomcat/webapps root@9fa4193e6e9a:/usr/local/tomcat/webapps#ls ROOT dos examples host-manager manager root@9fa4193e6e9a:/usr/loca/tomcat/webapps# rm-rf docs root@9fa4193e6e9a:/usr/loca/tomcat/webapps# ls ROOT examples host-manager manager

root@9fa4193e6e9a:/usr/local/tomcat/webapps#  

9fa4193e6e9a 是当前在运行的容器,在这个实例上已经没有文档了。

打开。local host 8888:

image.png

点击 documentation:  

image.png

点击刷新:

image.png

为什么是 not found 呢?因为当前的 tomcat 容器已经把文档干掉了。接下来,当前在运行的容器就用 docker commit 命令,又让它形成自己做的一个没有文档的tomcat。

[root@atguigu docker]# docker ps

[root@atguigu docker]# docker exec-it d52498cea537/bin/bash root@d52498cea537:/usr/local/tomcatcd webapps/ root@d52498cea537:/usr/local/tomcat/webapps#ls -l  total 20

dnwxr-x---. 3 root root 4096 Jun 900:44 ROOT  

dnwxr-x---. 14 root root 4096 Jun 9 00:44

docs dnwxr-x---. 6 root root 4096 Jun 9 00:44 examples

dnwxr-x---. 5root root 4096 Jun 900:44host-manager  

dnwxr-x---. 5 root root 4096 Jun 9 00:44 manager root@d52498cea537:/usr/local/tomcat/webapps# rm-rf docs root@d52498cea537:/usr//ocal/tomcat/webapps  total 16

dnwxr-x---. 3 root root 4096 Jun 900:44 ROOT

dnwxr-x---.6 root root 4096 Jun 900:44examples

dnxr-x---.5 root root 4096 Jun 9 00:44 host-manager  

dnwxr-x---.5 root root 4096 Jun 900:44 manager root@d52498cea537:/usr/Local/tomcat/webapps#  

(3)也即当前的 tomcat 运行实例是一个没有文档内容的容器, 以它为模板commit 一个没有 doc 的 tomcat 新镜像 atguigu/tomcat02

//[root@atguigu 桌面]# docker search tomcat

image.png

[root@atguigu 桌面]#

都有一些前缀的名字,可以当作 tomcat 是类名,前面这些就是包名。命名空间是规范一点的写法。

image.png

[root@atguigu 桌面]# docker ps

image.png

[root@atquiqu 桌面]#dockercommit-a="zzyy”-m=tomcat without docs”9fa41936e9a at tguigu/mytomcat:1:2 4db6a44256b2ff4690dc6ca8c6b5a03ab25a3658d064b69bfb4bfe34254ed039 [root@atguigu 桌面]#docker images

[root@atguigu 桌面]#

这里的 tomcat 是往阿里云默认拉的。

[root@atguigu 桌面]#docker ps-q 9fa4193e6e9a 10b9a3588ab9

[root@atguigu 桌面]#

[root@atguigu桌面]# docker rm -f $(docker ps-q) 9fa4193e6e9a1 0b9a3588ab9

[root@atguigu 桌面]#

把正在运行的容器统统删干净。

[root@atguigu桌面]#docker ps

[root@atguigu 桌面]#

现在是一个容器运行着。

[root@atauiau 桌面] # docker images

image.png

[rootatguigu 桌面]#

有两个 tomcat。刚才运行的时候删了一个文档,删了文档的那个容器自己做了1.2的版本。下面先运行看是否能成功。回车。  

[root@atguigu桌面]#dockerrun-itatguigu/mytomcat12

Using CATALINA BASE: /usr/local/tomcat

Using CATALINA HOME: /usr/local/tomcat  

Using CATALINATMPDIR:/usr/local/tomcat/temp

Using JRE_HOME: /docker-java-home/jre UsingCLASSPATH/usr/local/tomcat/bin/bootstrapiar:/usr/local/tomcat/bin/tomcat-juli.iar

可以看出这一步不合适,因为没有指定端口,没有写 P,这个时候访问没有对外暴露端口,映射不到。  

[root@atguigu桌面]# docker

run-it-p7777:8080atuigu/mytomcat:1:2

Using CATALINA_BASE:/usr/local/tomcat

Using CATALINA HOME: /usr/local/tomcat  

Using CATALINATMPDIR:/usr/local/tomcat/temp

Using JRE_HOME: /docker-java-home/jre UsingCLASSPATH:/usr/local/tomcat/bin/bootstrapjar:/usr/local/tomcat/bin/tomcat-juli.jar

image.png

点击 documentation:

image.png

7777是刚才删了以后又重新形成一个新的镜像,运行这个1.2版本这个时候时带来的直接结果:  

[root@atguigu 桌面]# docker images

image.png

[root@atguigu桌面]#

本来就不带这个文档,所以用1.2这个版本找不到。

[root@atquigu桌面]# docker run-it-p7788:8080 tomcat  

image.png

点击 documentation:

image.png

是有的。

现在是通过不同的镜像运行了不同的容器实例,一个有文档,一个没文档。对比了以后,就会发现:

(4)启动我们的新镜像并和原来的对比  

-启动 atguigu/tomcat02,它没有 docs

-新启动原来的 tomcat,它有 docs

//这个时候就能理解提交容器的副本,使之成为一个新的镜像。做了两件事: M 和a,容器 ID。换句话说以前是由镜像生成的容器实例,反过来也可以根据当前运行的容器转换成实例的实际状况又生成新的镜像。有点类似于 Java 里面反射,类到实例,实例可以反过来得到类的信息,基于 docker 强大在通过镜像可以获得最好的,最需要的自定义的。下面再补充一点:

[root@atguigu桌面]# docker ps

[root@atguigu桌面]#

一个都没运行。

[root@atquiqu 桌面]# dockerrun-it-p7777:8080tomcat

Using CATALINA BASE: /usr/local/tomcat  

Using CATALINA HOME: /usr/local/tomcat  

Using CATALINA_TMPDIR:/usr/ocal/tomcat/temp

Using JRE_HOME: /docker-java-home/jre  

Using CLASSPATH: /usr/local/tomcat/bin/bootstrapjar:/usr/local/tomcat/bin/tomcat-juli.jar  

前台就打印出了这些日志,这个叫前台运行。这个就是交互式容器。假设现在是守护,后台运行:  

[root@atguigu桌面]#docker ps

image.png

[root@atguigu桌面]#

image.png

那么什么叫后台访问呢?

[root@atguigu桌面]#docker run-d-p 6666:8080 tomcat 5537fed6692e654fc044316bb7098fc6871386cc0ddc49f192e88c1bfee64dd3 [root@atguigu桌面]#  

[root@atguigu桌面]# docker ps

image.png

[root@atguigu 桌面]#  

image.png

虽然能访问,但是前台后台的效果是完全不一样的。  

一定要明白 -d 和 -ip。比方说现在不想有这个窗口,就想让他们卡在后端好好的运行着。现在 tomcat 只是安安静静地返回了“5537fed6692e654fc044316bb7098fc6871386cc0ddc49f192e88c1bfee64dd3“。

一定要注意 Commit,作者,提交信息,容器 ID。 以上就是我们对 commit 操作补充以及镜像的理论和案例的说明。

相关文章
|
3月前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
380 100
|
3月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
314 99
|
3月前
|
缓存 Docker 容器
优化Docker镜像大小的五个实用技巧
优化Docker镜像大小的五个实用技巧
330 98
|
3月前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
2月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
504 5
|
3月前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
206 8
|
4月前
|
缓存 Ubuntu Docker
Ubuntu环境下删除Docker镜像与容器、配置静态IP地址教程。
如果遇见问题或者想回滚改动, 可以重启系统.
311 16
|
4月前
|
运维 关系型数据库 数据库
应用官方 Docker 镜像已成熟,团队为何转向 Websoft9 而不再依赖 Bitnami
随着云原生发展,部署工具从 Bitnami 转向 Websoft9。后者基于官方镜像,提供多应用编排与统一运维,提升部署效率与维护能力,适合多系统协同场景。
应用官方 Docker 镜像已成熟,团队为何转向 Websoft9 而不再依赖 Bitnami
|
4月前
|
Ubuntu 网络安全 PHP
如何使用vscode的Docker插件管理ubuntu 拉取服务器的镜像以及创建容器
本测试镜像旨在记录使用vscode的Docker插件拉取病创建Dockerfile,以及拉取镜像。
|
5月前
|
存储 缓存 Serverless
【Azure Container App】如何在Consumption类型的容器应用环境中缓存Docker镜像
在 Azure 容器应用的 Consumption 模式下,容器每次启动均需重新拉取镜像,导致冷启动延迟。本文分析该机制,并提出优化方案:使用 ACR 区域复制加速镜像拉取、优化镜像体积、设置最小副本数减少冷启动频率,或切换至 Dedicated 模式实现镜像缓存,以提升容器启动效率和应用响应速度。
150 0

热门文章

最新文章