开发者学堂课程【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,这是第一步。
第二步容器命令。
下面看一下:
1、Docker commit 提交容器副本使之成为一个新的镜像
// root@atguigu 桌面]# docker images
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
回车
这些经常在 eclipse 里面出现,各种日志打出来。
点击回车:
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
[root@atguigu桌面]#
可以清晰地看到,当前正在运行的,先不看这里的 centos。上一节课讲的一个小时之前了。59秒钟以前刚刚起了32768的 tomcat。 这个时候请看32768,这个docker 就是前面这命令P所分配的映射端口,但是 docker 里面的 tomcat 永远还是8080。
[root@atguigu桌面]#docker ps-l
[root@atguigu桌面]#
[root@atguigu桌面]#docker ps-n3
[root@atguigu桌面]#
[root@atguigu桌面]#docker ps-n5
[root@atguigu桌面]#
而如果输入原来的8888:
下面点开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 前台交互站,日志打出来:
点击 documentation,可以点开:
故意删除上一步镜像生产 tomcat 容器的文档
[root@atguigu桌面]# docker ps
[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:
点击 documentation:
点击刷新:
为什么是 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
[root@atguigu 桌面]#
都有一些前缀的名字,可以当作 tomcat 是类名,前面这些就是包名。命名空间是规范一点的写法。
[root@atguigu 桌面]# docker ps
[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
[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
点击 documentation:
7777是刚才删了以后又重新形成一个新的镜像,运行这个1.2版本这个时候时带来的直接结果:
[root@atguigu 桌面]# docker images
[root@atguigu桌面]#
本来就不带这个文档,所以用1.2这个版本找不到。
[root@atquigu桌面]# docker run-it-p7788:8080 tomcat
点击 documentation:
是有的。
现在是通过不同的镜像运行了不同的容器实例,一个有文档,一个没文档。对比了以后,就会发现:
(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
[root@atguigu桌面]#
那么什么叫后台访问呢?
[root@atguigu桌面]#docker run-d-p 6666:8080 tomcat 5537fed6692e654fc044316bb7098fc6871386cc0ddc49f192e88c1bfee64dd3 [root@atguigu桌面]#
[root@atguigu桌面]# docker ps
[root@atguigu 桌面]#
虽然能访问,但是前台后台的效果是完全不一样的。
一定要明白 -d 和 -ip。比方说现在不想有这个窗口,就想让他们卡在后端好好的运行着。现在 tomcat 只是安安静静地返回了“5537fed6692e654fc044316bb7098fc6871386cc0ddc49f192e88c1bfee64dd3“。
一定要注意 Commit,作者,提交信息,容器 ID。 以上就是我们对 commit 操作补充以及镜像的理论和案例的说明。






























