Docker 镜像 commit | 学习笔记

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习 Docker 镜像 commit

开发者学堂课程【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.

image.png

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 STATUUSPORTS NAMES

b0c74378ebd8 tomcat "catalina. sh run” 26 seconds ago

Up 25 seconds0.0.0.0:7777->8080/tcpdrunk ardinghelli

root@atquiqu桌面]# dockerrun-d-p6666:8080tomcat5537fed6692e654fc044316bb7098fc6871386cc0ddc49f192e88c1bfee64dd3[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 在后端运行就可以了。

image.png

此时获得了相关的内容。复习了一下 -it 和 -d 这种两种方式的启动和不同,一定要注意 commit 作者提交信息,容器 ID,然后起命名空间、镜像名字,以及最新的 tag 版本标签号。这个就是 commit 的操作的补充以及镜像的理论和案例的说明。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
5天前
|
缓存 Linux 网络安全
docker的镜像无法下载如何解决?
【10月更文挑战第31天】docker的镜像无法下载如何解决?
150 28
|
18天前
|
缓存 监控 持续交付
|
1天前
|
存储 关系型数据库 Linux
【赵渝强老师】什么是Docker的镜像
Docker镜像是一个只读模板,包含应用程序及其运行所需的依赖环境。镜像采用分层文件系统,每次修改都会以读写层形式添加到原只读模板上。内核bootfs用于加载Linux内核,根镜像相当于操作系统,上方为应用层。镜像在物理存储上是一系列文件的集合,默认存储路径为“/var/lib/docker”。
|
7天前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
64 2
|
8天前
|
关系型数据库 MySQL Docker
docker环境下mysql镜像启动后权限更改问题的解决
在Docker环境下运行MySQL容器时,权限问题是一个常见的困扰。通过正确设置目录和文件的权限,可以确保MySQL容器顺利启动并正常运行。本文提供了多种解决方案,包括在主机上设置正确的权限、使用Dockerfile和Docker Compose进行配置、在容器启动后手动更改权限以及使用 `init`脚本自动更改权限。根据实际情况选择合适的方法,可以有效解决MySQL容器启动后的权限问题。希望本文对您在Docker环境下运行MySQL容器有所帮助。
17 1
|
9天前
|
存储 Java 开发者
成功优化!Java 基础 Docker 镜像从 674MB 缩减到 58MB 的经验分享
本文分享了如何通过 jlink 和 jdeps 工具将 Java 基础 Docker 镜像从 674MB 优化至 58MB 的经验。首先介绍了选择合适的基础镜像的重要性,然后详细讲解了使用 jlink 构建自定义 JRE 镜像的方法,并通过 jdeps 自动化模块依赖分析,最终实现了镜像的大幅缩减。此外,文章还提供了实用的 .dockerignore 文件技巧和选择安全、兼容的基础镜像的建议,帮助开发者提升镜像优化的效果。
|
14天前
|
存储 缓存 Java
Java应用瘦身记:Docker镜像从674MB优化至58MB的实践指南
【10月更文挑战第22天】 在容器化时代,Docker镜像的大小直接影响到应用的部署速度和运行效率。一个轻量级的Docker镜像可以减少存储成本、加快启动时间,并提高资源利用率。本文将分享如何将一个Java基础Docker镜像从674MB缩减到58MB的实践经验。
27 1
|
21天前
|
Docker 容器
docker:记录如何在x86架构上构造和使用arm架构的镜像
为了实现国产化适配,需将原x86平台上的Docker镜像转换为适用于ARM平台的镜像。本文介绍了如何配置Docker buildx环境,包括检查Docker版本、安装buildx插件、启用实验性功能及构建多平台镜像的具体步骤。通过这些操作,可以在x86平台上成功构建并运行ARM64镜像,实现跨平台的应用部署。
271 2
|
1天前
|
缓存 JavaScript 安全
深入理解Docker镜像构建过程
深入理解Docker镜像构建过程
9 0
|
25天前
|
网络协议 Docker 容器
docker pull命令拉取镜像失败的解决方案
docker pull命令拉取镜像失败的解决方案
569 1
下一篇
无影云桌面