开发者学堂课程【Docker 快速入门:Docker 镜像 commit】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/616/detail/9400
Docker 镜像 commit
内容介绍
一、步骤简介
二、案例演示
一、步骤简介
在 docker 镜像的联合文件系统中,镜像是层层叠加的,最终一层套一层对外暴露出一个整体。接下来就要通过的命令和案例,加深对镜像的实际操作和理解。
第一步,先回到的常用命令,看 docker commit,如果想到 git,一定有个 git commit。
-P: 随机端口映射;
-p: 指定端口映射,有以下四种格式
ip:hostPort:containerPort
ip:containerPort
hostPort:containerPort
containerPort
第二步,容器命令。docker commit 提交容器副本使之成为一个新的镜像。
root@atguigu桌面]# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mongo latest ca96c146aa68 7 hours ago 378.4 MB
hello-world latest 3535063d9957 hours ago 1.848 kB
tomcat latest d94da71c3a1f 7 days ago 462.6 MB
centos latest 88ec626ba223 5 weeks ago 199.7 MB
roothatauiou点面#
现在 docker,本地库有 4 个镜像,其中有 1 个 tomcat。现在需要把 tomcat 运行起来,然后基于运行的 tomcat 容器。如果在当前运行的容器上面做了自定义的修改,然后再把当前这个容器又可以形成一个 commit 新的镜像,以此类推。
案例演示,就要先把案例弄完。commit 在正常情况下,以当前 Image 运行一个tomcat,然后假设正在运行了以后,tomcat 做了一些自定义的设计和调整,然后又把它变成 commit,把它变成一个符合需求和定义的一个新的镜像,下次就可以不用原始的出场的镜像,就可以用自己的自定义的镜像了。比如说买一部车回来,出厂默认设置,没有导航雷达。想自己改车,给这个车加上导航雷达又装了翅膀,装了各种魔感,这个车不但能开还能飞。即一车两要,天上是飞机,地上是汽车,这个时候依照修改以后能跑能飞的车。
docker commit
-m=“提交的描述信息”
-a=“作者”容器 ID 要创建的目标镜像名:[标签名],就是当前正在运行的这个容器,修改以后,认为这个是 2.0 版的新模块,新模板要把它提出来,形成一种新的一套标准,形成新的一个样式,这个标准这个样式就是的新的镜像。
二、案例演示
1. 从 Hub 上下载 tomcat 镜像到本地并成功运行
-P 是 put 端口的英文缩写,主机端口和 docker 卡容器端口,
-i 是交互,
-t 是返回一个终端,
-p 默认端口 8080。
root@atguigu桌面]# docker images tomcat
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
tomcat latest d94da71c3a1f 7 days ago 462.6 MB
root@atguigu桌面]# docker run-it-p8888:8080tomcat
以前是装在的 windows 上面,但是现在不是直接去访问 commit,现在是直接要去访问 docker,访问 docker 上面探讨,这个时候第一个对外暴露的,tomcat 就可以访问的,比方说就要 8888,对应着 docker 里面的端口,commit 默认的就是8080。
如果说不想麻烦了,反正都默认都是 8080 tomcat 访问,docker 的对外暴露的服务端口也叫 8080,内部的真正的才是的实体的也叫 8080。看默认端口 8080 即可。
运行 Tomcat 经常在一个 lips 里面或者 idea 里面就会看到启动,各种日志打出来, local host 注意,现在访问谁?访问的是 docker,docker 的 8888 映射端口是 docker 里面他们看他 8080。如果一切顺利,看现在 docker 里面有了一个tomcat 容器实验 8.5.32,这个时候彻底完成了 docker 里面启动 tomcat 的操作,所以说这个时侯退出。现在用的是 p, p 是指定端口,别忘了还有一个参数是 P 随机分配。
还是一样的命令。
[root@atguigu桌面]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU US PORTS NAMES
108b3dfd11f5 tomcat "catalina. sh run” 9 seconds ago Up 8 seconds 0.0.0.0:32768I>8080/tcp prickly_mcclintock
10b9a3588ab9 centos ”/bin/bash” About an hour ago Up Ab bout an hour admiring_curie
[root@atguigu 桌面]#
32768:docker 前面命令 P 所分配的映射端口,但是到 docker 里面的 tomcat 永远还是 8080.
root@atquiqu桌面]# docker ps PORTS NAMES
CONTAINER ID IMAGE COMMAND CREATED STATUS
108b3dfd11f5 tomcat "catalina. sh run” 9 seconds ago Up 8 seconds 0.0.0.0:32768->8080/tcp prickly_mcclintock
10b9a3588 ab9 centos "/bin/bash” About an hour ago Up About an hour admiring_curie
root@atguigu桌面]# docker ps-l
108b3dfd11f5 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
tomcat "catalina. sh run 30 seconds ago Up 29 seconds 0.0.0.0:32768->8080/tcp pricklymcclintock
root@atguigu桌面]#dockerps-n3
108b3dfd11f5 CONTAINER ID IMAGE tomcat COMMAND catalina.sh run” CREATED35 seconds ago STATUS Up 34 seconds PORTS
0.0.0.0:32768->8080/tcp NAMES prickly_mcclintock33b929adbaaf10b9a3588ab9 tomcat centos”/bin/bash”"catalina. sh run2 minutes ago About an hour ago Up About an hour Exited(130)56 seconds ago admiring_curie loving_perlman
root@atguigu桌面]#
[root@atguigu桌面]# docker ps-n5
CONTAINER ID IMAGE COMMAND CREATED ST TATUS PORTS NAMES
108b3dfd11f5 tomcat "catalina. sh run” 44 seconds ago Up 44 seconds 0.0.0.0:正2768->8080/tcp prickly_mcclintock
33b929adbaaf tomcat "catalina. sh run” 2 minutes ago Ex xited(130)About a minute ago loving_perlman
10b9a3588ab9 centos ”/bin/bash” About an hour ago o About an hour admiring curie
UP
cc18bd4d6908 centos ”/bin/bash” About an hour ago Ex xited(0)About an hour ago pensive pasteur
5ba7fb9a7010 centos "/bin/sh-c'while t About an hour ago Ex xited(137) About an hour ago suspicious ritchie
[root@atguigu桌面]#
可以清晰的看到当前正在运行的, 59 秒前的 commit32768.
p 随机分配的端口外部 32768,访问的时候也就变成 32768。此时内部的分配规律不许理会,又看到了 tomcat. 此时如果在原来的 8888 端口根本就没有了,就是访问失败。
此时 32768 这个端口里面,点开 document,即在这里有。也就是说从阿里云下面拉到 tomcat,document 他是有 tomcat 的。假设把正在运行的这个文档删掉,此时 tomcat 会找不到报错。接下来在 commit 假设就做了一个不需要的这么一个tomcat,拿不需要文档的在正在运行的容器又形成一个新的模板,只要后续拿新的模板来运行的话,新的镜像来运行,生成的新他们看的容器,什么都一样,但是永远访问不到,因为它根本就没有。
2.故意删除上一步镜像生产 tomcat 容器的文档
这个时候再看以前做的 8888,要尽量的跟的文档统一。运行起来。
root@atguigu 桌面]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATU US PORTS NAMES
9fa4193e6e9a tomcat "catalina. sh run” 13 seconds ago Up 11 seconds 0.0.0.0:8838->8080/tcp condescending_thompson
10b9a3588ab9 centos ”/bin/bash” About an hour ago Up Ab bout an hour admiring_curie
root@atguigu 桌面]#
前台交互后,将日志打出来,现在是 8888,点开文档都能访问。
root@atguigu桌面]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9fa4193e6e9a tomcat "catalina. sh run” 41 seconds ago Up 40 seconds 0.0.0.0:8888->8080/tcp condescending_thompson
10b9a3588ab9 centos ”/bin/bash” About an hour agoUp About an hour admiring curie
iroot@atguigu桌面]#dockerexec-it9fa41936e9a/bin/bash root09fa4193e6e9a:/usr/local/tomcat#pwd/usr/local/tomcat
root09fa4193e6e9a:/usr/ocal/tomcat#ll bash ll: command not found
root09fa4193e6e9a:/usr/loca/tomcat#ls
LICENSE NOTICE RELEASE-NOTES RUNNINGtxt bin conf include lib logs nativejni-lib temp webapps work root09fa4193e6e9a:/usr/local/tomcat#ls-1 total 120
-rw-r-----. 1root root57092 Jun 20 19:53LICENSE
-rW-r-----. 1 root root 1723 Jun 20 19:53 NOTICE
-rW-r-----. 1root root 7138 Jun 20 19:53RELEASE-NOTES
-FW-r-----. 1 root root 16246 Jun 20 19:53RUNNINGtxt
drwxr-x---. 2 root root 4096 Jul 402:24 bin
drwx--S---. 3 root root 4096 Jul 11 08: 50 conf
drwxr-sr-x. 3 root staff 4096 Jul 402:24 include
drwxr-x---.
root09fa4193e6e9a:/usr/local/tomcat/webapps#pwd/usr/local/tomcat/webapps
root09fa4193e6e9a:/usr/local/tomcat/webapps# ls RooT docs examples host-manager manager
root09fa4193e6e9a:/usr/local/tomcat/webapps# rm-rf docs
//删除docs root09fa4193e6e9a:/usr/local/tomcat/webapps#ls RoOT examples host-manager manager
root09fa4193e6e9a:/usr/local/tomcat/webapps#
都没有了之后,这个时候打开火狐,然后此时当前正在运行,所谓当前正在运行的容器实力上面是已经没有文档了,打开的 local host8888,一切都一样,缓存刷新,Not found。因为当前他们开的容器已经把这个文档给消灭掉了。接下来当前正在运行的容器,用 docker commit 命令又让它形成自己做的一个没有文档的他们开的镜像。
3.也即当前的 tomcat 运行实例是一个没有文档 当内容的容器,以它为模板commit 一个没有 doc 的 tomcat 新镜境像 atguigu/tomcat02
iroot@atguigu 桌面]# docker search tomcat
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tomcat Apache Tomcat is an open source implementa... 1923 [ 0K]
tomee Apache TomEE is an all-Apache Java EE cert... 51 [0K]
dordoka/tomcat Ubuntu 14.04, Oracle JDK 8 and Tomcat 8 ba... 49 [ 0K]
davidcaste/alpine-tomcat Apache Tomcat 7/8 using racle Java 7/8 wi... 26 [0K]
bitnami/tomcat Bitnami Tomcat Docker Image 17 [0K]
consol/tomcat-7.0 Tomcat7.0.57,8080,"admin/admin” 16 [0K]
cloudesire/tomcat Tomcat server6/7/8 15 [ 0K]
tutum/tomcat Base docker image to run a Tomcat applicat... 10
meirwa/spring-boot-tomcat-mysql-app a sample spring-boot app using tomcat and... 9 [0K]
ieanblanchard/tomcat Minimal Docker image with Apache Tomcat 8
7
aallam/tomcat-mysql DebianOracle JDK,Tomcat&MySL [0K]
rightctrl/tomcat Centos,Oracle Java, tomcat application s... 3 [0K]
maluuba/tomcat7-java8 Tomcat7 with java8.
arm64v8/tomcat Apache Tomcat is an open source implementa...
amd64/tomcat Apache Tomcat is an ope
都有一些前缀的名字,前面是包名,tomcat 是类名在。以上是命名空间的意思,这是规范一点的写法。
接下来:
root@atguigu桌面]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa4193e6e9a tomcat "catalina. sh run” 3 minutes ago Up 3m minutes 0.0.0.0:8888->8080/tcp condescending_thompson
0b9a3588ab9 centos ”/bin/bash” About an hour ago Up Abo out an hour admiring curie
root@atguigu桌面]#
提交:
root@atquigu桌面]#
docker commit-a="zzyy-m=tomcat without docs”9fa41936e9a at guigu/mytomcat:1.24db6a44256b2ff4690dc6ca8c6b5a03ab25a3658d064b69bfb4bfe34254ed039
root@atguigu桌面]#docker images
REPOSITORY atguig/mytomcat
1.2 TAG IMAGE ID4db6a44256b2 CREATED9 seconds ago462.7 VIRTU MB JAL SIZE
mongo latest ca96c146aa68 8 hours ago 378.4 MB
hello-world latest 3535063d9957 8 hours ago 1.848 kB
tomcat latest d94da71c3a1f 7 days ago 462.6 MB
centos latest 88ec626ba223 5 weeks ago 199.7 MB
root@atguigu桌面]#
[root@atguigu 桌面]# docker run -it atguigu/mytomcat:1.2
这个是当前正在运行的容器,然后给他命个名字,看这个时候不再是 latest 了,自己乱标了一个版本编号,tag 标签 1.2。此时通过访问 dockeratguigu,也会访问自定义的 tomcat。
这个时候回车,再打开的火狐,然后来访问一下,在这一块名字随便起来,现在已经换成了 local,host7777. 这个是刚才删了以后又重新形成一个新的镜像,在这儿的 1.2 版本没有找到。
从阿里云来,默认出厂,docker 访问的是端口号 77888。点开有没有完全存在,而是默认的,现在通过不同的镜像运行了不同的容器实例,一个有文档,一个没文档。
4.启动我们的新镜像并和原来的对比
现在来对比了后会发现起到的 atguigu,它没有 doc not found,这是自己的。如果启动原来 tomcat 有 doc,这是阿里云上默认出场的,这个时候就可以理解所说的提交容器的副本,使之成为一个新的镜像。m 和 a 以及容器 iD,以前是由镜像生成的容器实例,但是反过来也可以根据当前运行的容器实力的实际状况,又生成新的镜像,这个有点类似于 Java 里面的反射。
类到实例,实例可以反过来得到类的信息,这样的话基于自己,说明 doctor 强大在什么地方。通过镜像,可以获得最好的、自己需要的、自定义的东西。
下面先退出。再给补充一点:
[root@atguigu 桌面]# docker ps
CONTAINER ID IMAGE COMMANDCREATED STATUUS
PORTS NAMES
b0c74378ebd8 tomcat "catalina. sh run” 26 seconds ago
Up 25 seconds0.0.0.0:7777->8080/tcpdrunk ardinghelli
root@atquiqu桌面]# dockerrun-d-p6666:8080tomcat
5537fed6692e654fc044316bb7098fc6871386cc0ddc49f192e88c1bfee64dd3[root@atguigu桌面]# docker ps
CONTAINER ID IMAGECOMMANDCREATEDSTATTUS
PORTS NAMES
5537fed6692e tomcat "catalina. sh run”9 seconds ago
Up8 8seconds 0.0.0.0:6666->8080/tcp
hungry_mccarthy
b0c74378ebd8 tomcat "catalina. sh run” About a minute agoUpAbout a minute0.0.0.0:7777->8080/tcpdrunk ardinghelli
[root@atguigu桌面]#
T
这个时候 docker ps 一个都没运行,刚才知道的 docker 7777-8080,前台就打印出了这些日志,这个叫前台运行。或者这个时候叫做交互式容器,但是假设现在是守护,想后台运行,这个时候知道的,现在就可以后台访问。
后台访问:
[root@atguigu桌面]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STAT TUS PORTS NAMES
5537fed6692e tomcat "catalina. sh run” 9 seconds ago Up 8 8seconds 0.0.0.0:6666->8080/tcp hungry_mccarthy
b0c74378ebd8 tomcat "catalina. sh run” About a minute ago Up About a minute 0.0.0.0:7777->8080/tcp drunk ardinghelli
效果一回车这么多日志根本就没有。这个时候请看 docker ps,是以后台方式启动,另一个是以前台方式启动,
前台后台他们的效果完全不一样。所以说一定要明白 -d 和 -it,比方说现在就不想有这么一个窗口,就只让 tomcat 在后端运行就可以了。
此时获得了相关的内容。复习了一下 -it 和 -d 这种两种方式的启动和不同,一定要注意 commit 作者提交信息,容器 ID,然后起命名空间、镜像名字,以及最新的 tag 版本标签号。这个就是 commit 的操作的补充以及镜像的理论和案例的说明。