docker commit 和docker build (实战使用以及区别)

这篇具有很好参考价值的文章主要介绍了docker commit 和docker build (实战使用以及区别)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 1.commit与build优缺点比较

commit:

        优点:

                简单、所见所得

        缺点

                元数据信息无法注入

                镜像层级的重用性弱

                编译步骤不可重用

build:

        优点

                元数据信息可注入

                镜像层级的重用性强

                编译步骤不可重用

        缺点:

                编译速度没有宿主机快

                下载程序的依赖包比在宿主机中直接下载更加耗时

                会产生none镜像,占用磁盘空间
 

还是需要从docker 三要素说起,docker的镜像和容器是指的一种实例状态,镜像运行后成为容器,也就是docker run 镜像后的状态叫容器。

1.容器保持运行状态至少需要一个工作在前台的进程。Docker容器中必须有一个前台进程,否则认为容器已经挂掉

2.镜像 docker run——>容器 这是镜像向容器转化。

3.正在运行的容器 docker commit 或者dockerfile build--->镜像,这是容器-->镜像转化和镜像-->镜像。
那么,今天要讨论的是镜像向容器转化的两种方式的实现方法,以及它们之间的异同。

首先,来观察一下几个启动的容器的状态,以更好理解上面所说的第一条。

那么,今天要讨论的是镜像向容器转化的两种方式的实现方法,以及它们之间的异同。

首先,来观察一下几个启动的容器的状态,以更好理解上面所说的第一条


 

[root@centos7 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
hub.c.163.com/library/centos   7.3.1611            67591570dd29        4 years ago         192MB
[root@centos7 ~]# docker run -itd --name centos1 hub.c.163.com/library/centos:7.3.1611
[root@centos7 ~]# docker run -itd --name centos2 hub.c.163.com/library/centos:7.3.1611
 
[root@centos7 ~]# docker ps -a
CONTAINER ID        IMAGE                                   COMMAND             CREATED             STATUS              PORTS                    NAMES
c7d8d950f20b        hub.c.163.com/library/centos:7.3.1611   "/bin/bash"         6 minutes ago       Up 5 minutes                                 centos2
e20d77bee6af        hub.c.163.com/library/centos:7.3.1611   "/bin/bash"         28 minutes ago      Up 28 minutes                                centos1
我现在有一个容器,这个容器名称为hub.c.163.com/library/centos:7.3.1611,执行docker run命令后,生成了两个容器实例,分别名称为centos1和centos2,status栏表明是up状态,也就是运行状态,此时执行docker exec 命令进入任意一个容器,观察ps  -ef 可以发现,有一个pid 为1的进程。

[root@centos7 ~]# docker exec -it centos2 /bin/bash
[root@c7d8d950f20b /]# ps -ef
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  0 08:41 pts/0    00:00:00 /bin/bash
root        14     0  2 08:54 pts/1    00:00:00 /bin/bash
root        27    14  0 08:54 pts/1    00:00:00 ps -ef
那么,如果在容器内没有这个pid 为1的进程,docker会认为这个容器不是在运行的,容器就会停止运行,为什么会有这个/bin/bash pid 为1的进程呢?请看下面的代码:

[root@centos7 ~]# docker history hub.c.163.com/library/centos:7.3.1611
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
67591570dd29        4 years ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 years ago         /bin/sh -c #(nop)  LABEL name=CentOS Base Im…   0B                  
<missing>           4 years ago         /bin/sh -c #(nop) ADD file:940c77b6724c00d42…   192MB               
<missing>           4 years ago         /bin/sh -c #(nop)  MAINTAINER https://github…   0B   
可以看到这个基础镜像是在另一个基础镜像的基础上 docker build 制作而成的,CMD命令会在镜像启动为容器时执行,执行的命令就是 /bin/bash、而这个命令是工作在容器的前台的哦。(前台运行就是没有&,没有nohup)。

docker commit:
[root@centos7 ~]# docker exec -it centos2 /bin/bash
[root@c7d8d950f20b /]# vim
bash: vim: command not found


在前面启动的容器centos2 这个容器,我们进入后,可以发现这个容器是没有vim命令的,那么在实际使用过程中,会十分的不方便,这个时候我们可以使用 docker commit 先给这个容器安装vim,然后将这个容器转化为镜像,以后再使用这个新的镜像就可以直接使用vim命令 了。

1,容器必须是up状态,也就是运行状态,docker ps -a 查询即可

2,docker exec 进入这个容器,yum安装vim

[root@c7d8d950f20b /]# yum install vim -y
Loaded plugins: fastestmirror, ovl
base                                                                                                                           | 3.6 kB  00:00:00     
extras                                                                                                                         | 2.9 kB  00:00:00     
updates                                                                                                                        | 2.9 kB  00:00:00     
(1/4): base/7/x86_64/group_gz                                                                                                  | 153 kB  00:00:00     
(2/4): extras/7/x86_64/primary_db                                                                                              | 222 kB  00:00:00     
(3/4): base/7/x86_64/primary_db                                                                                                | 6.1 MB  00:00:07     
(4/4): updates/7/x86_64/primary_db                                                                                             | 4.0 MB  00:00:10     
Determining fastest mirrors
 * base: mirrors.163.com
 * extras: mirrors.163.com
 * updates: mirrors.bfsu.edu.cn
Resolving Dependencies
--> Running transaction check


3,退出容器,执行docker commit命令,具体如下:

docker commit  容器名称 新镜像名称

[root@c7d8d950f20b /]# exit
[root@centos7 ~]# docker commit centos2 centos-vim:v1.0
sha256:8df43092cfd1eb53b895fcda19c9ec0d18c358194045a5fd4d5cf47d177e8b30
4, 查看是否生成新镜像

[root@centos7 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos-vim                     v1.0                8df43092cfd1        58 seconds ago      332MB
可以看到,新镜像已经生成,大小变为了332M

4, 查看是否生成新镜像

[root@centos7 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
centos-vim                     v1.0                8df43092cfd1        58 seconds ago      332MB
可以看到,新镜像已经生成,大小变为了332M

5,docker run 新镜像,并进入新容器,查看是否vim保留在了新镜像 centos-vim:v1.0

[root@centos7 ~]# docker run -itd --name centos4 centos-vim:v1.0
85e5a130e4dc1f967534f1e81fba1072f97f81bb1263057e1db0b938b9053323
[root@centos7 ~]# docker exec -it centos4 /bin/bash
[root@85e5a130e4dc /]# vim
[root@85e5a130e4dc /]# whereis vim
vim: /usr/bin/vim /usr/share/vim


可以看到,新的镜像 centos-vim 确实有了vim命令,可以使用新镜像愉快的玩耍了。

6.查看新镜像的生成历史

[root@centos7 ~]# docker history centos-vim:v1.0
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
8df43092cfd1        6 minutes ago       /bin/bash                                       140MB               
67591570dd29        4 years ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 years ago         /bin/sh -c #(nop)  LABEL name=CentOS Base Im…   0B                  
<missing>           4 years ago         /bin/sh -c #(nop) ADD file:940c77b6724c00d42…   192MB               
<missing>           4 years ago         /bin/sh -c #(nop)  MAINTAINER https://github…   0B  v

       
可以看到,新镜像在原有基础镜像上增加了一层140M大小,但并不清楚具体的增加的内容。这就造成了 黑箱操作。(除非我告诉你,否则你根本不会知道这个新镜像有了什么改变)。

docker commit 的弊端:
如果是安装软件包、编译构建,那会有大量的无关内容被添加进来,如果不小心清理,将会导致镜像极为臃肿。

此外,使用 docker commit 意味着所有对镜像的操作都是黑箱操作,生成的镜像也被称为 黑箱镜像,换句话说,就是除了制作镜像的人知道执行过什么命令、怎么生成的镜像,别人根本无从得知。而且,即使是这个制作镜像的人,过一段时间后也无法记清具体在操作的。虽然 docker diff 或许可以告诉得到一些线索,但是远远不到可以确保生成一致镜像的地步。这种黑箱镜像的后期维护工作是非常痛苦的。

而且,镜像所使用的分层存储,除当前层外,之前的每一层都是不会发生改变的,换句话说,任何修改的结果仅仅是在当前层进行标记、添加、修改,而不会改动上一层。如果使用 docker commit 制作镜像,以及后期修改的话,每一次修改都会让镜像更加臃肿一次,所删除的上一层的东西并不会丢失,会一直如影随形的跟着这个镜像,即使根本无法访问到。这会让镜像更加臃肿。

docker commit的优点:
操作简单,易上手,

 

docker build 方式镜像生成新的镜像:
docker build的方式生成新镜像的前提条件是有一个旧的基础镜像,在此基础上通过docker build 命令执行dockerfile 文件从而生成一个新的镜像,不同于docker commit,是镜像--> 镜像的转化。当然,是否转化正确是需要将镜像 docker run起来的哦。

现在,假设需求是将之前的镜像hub.c.163.com/library/centos:7.3.1611 作为基础镜像,通过dockerfile 文件的编写,执行,生成一个新的镜像,镜像名称为centos-vim:v2.0,。

1,新建一个空文件夹,名称任意,只需要为空就好。假设名称为 make_vim 这个文件夹,进入这个文件夹,编写文件,文件名称为 centos-vimv2.0

[root@centos7 make_vim]# pwd
/root/make_vim
[root@centos7 make_vim]# ls
centos-vimv2.0
2.centos-vim2.0 的内容如下:

FROM  hub.c.163.com/library/centos:7.3.1611
RUN yum install -y vim httpd \
&& yum clean all


 3,运行build 命令,生成新镜像centos-vim:v2.0

docker build -f ./centos-vimv2.0 -t centos-vim:v2.0 .

注意,是在 make_vim 这个文件夹下执行此命令,命令最后是有一个点的哦,千万别忘了。

4 , 验证新镜像centos-vim:v2.0 是否带有vim命令

docker run -itd --name centos5 centos-vim:v2.0

[root@centos7 make_vim]# docker exec -it centos5 /bin/bash
[root@1eb659612a86 /]# whereis vim
vim: /usr/bin/vim /usr/share/vim

5,当然了,在dockerfile里,我加入了清理yum安装痕迹命令,因此,镜像要比commit 方式小一些。仅仅做一个小示例,因此dockerfile的很多功能没有演示,比如:复制宿主机的文件和文件夹到镜像内部,cmd ,entrypoint ,add,copy,export,workdir等等并没有使用。docker build -t 后面接的是新镜像的tag,-f 后面接的是dockerfile文件的名称,如果dockerfile的名称是Dockerfile,那么,可以省略-f以及其以后的内容,也就是不指定,docker会自动优先使用名称叫Dockerfile的文件构建新镜像。

Dockerfile的优点:
能够自由灵活的与宿主机联系,比如,某些配置文件在宿主机验证并使用过后很好用,那么,可以将文件copy到镜像中,(这个动作是写在dockerfile里),add 远程主机的配置文件到镜像中,定义onbuild动作等等各种灵活的功能。docker commit不能做到这些事情,因为是在一个封闭的在运行中的容器中,无法做复制拷贝宿主机文件的事情。

dockerfile本身就是一个比较详细的构建文档,有这个文档就可以清楚的知道新构建的镜像经历了怎样的变化。没有黑箱操作的困扰了,后期的维护更为方便了。

后期可扩展性强,一个文件就可以在哪都可以运行镜像了。(前提有网,有安装docker环境)

Dockerfile的缺点:
编写不容易,因为需要对脚本这些比较了解,有Linux基础的人才可以编写出好用的dockerfile,上手难度大。
 文章来源地址https://www.toymoban.com/news/detail-430754.html

到了这里,关于docker commit 和docker build (实战使用以及区别)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker学习(四)使用 commit 制作镜像

    docker学习(一)docker 概述 docker学习(二)docker 安装部署 docker学习(三)常用命令 docker学习(四)使用 commit 制作镜像 docker学习(五)使用 Dockerfile 制作镜像 docker学习(六)卷 Volume docker学习(七)docker daemon docker学习(八)HTTP/HTTPS 代理 docker学习(九)docker 调试 docker学习

    2024年02月14日
    浏览(43)
  • 案例:Docker 镜像的创建及使用(commit与dockerfile方式)

    我要将一个包含nginx的容器做成一个镜像,供其他人使用,这样其他人就不必再执行nginx安装等操作。 首先,还是启动一个容器: 命名为n1。 然后在容器内部安装nginx: 这里yum源出现问题: 解决看这里 安装成功并启动运行: 在另一个终端,查看nginx情况: 然后看到 ip是 17

    2024年02月14日
    浏览(35)
  • Docker与VM虚拟机的区别以及Docker的特点

    VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用; Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。 那么问题来了,没有操作系统,怎么运行程序? 可以在

    2024年01月19日
    浏览(52)
  • Docker使用遇到问题:docker build requires exactly 1 argument(s)

    Docker 是怎么样的东西,这里就不说了,这里说说dockerfile创建容器时遇到的问题。 首先我想达到的目的很简单,就是用dockerfile去创建容器,步骤如下: 创建并编辑dockerfile mkdir mydocker cd /mydocker vim DockerFile (输入以下指令) FROM centos(指定其后构建新镜像所使用的基础镜像) V

    2024年02月09日
    浏览(44)
  • 容器中使用docker build提示docker: not found所遇到的坑(巨坑)

    例如在docker启动的jenkins中编写脚本的时候,docker build报错提示,docker: not found 提示:解决办法就是把宿主机的docker命令传过去 首先看一下我的启动命令,容器开启后进入容器输入docker build提示找不到docker 命令 修改docker版本,之后无压力启动

    2024年02月13日
    浏览(39)
  • 使用 docker buildx 构建跨平台镜像 (QEMU/buildx/build)

    https://docs.docker.com/build/building/multi-platform 构建跨平台镜像是 Docker 生态系统中的一个重要话题, 因为跨平台镜像可以在多种平台上运行, 极具灵活性。为了实现这个目标, Docker 社区提供了多种方式来构建跨平台镜像, 其中之一是使用 docker manifest, 我在《使用 docker manifest 构建跨平

    2024年02月03日
    浏览(57)
  • Jetson开发实战记录(二):Jetson Xavier NX版本区别以及烧录系统

    同系列链接: Jetson开发实战记录(一):Jetson家族的基本介绍 Jetson开发实战记录(二):Jetson Xavier NX版本区别以及烧录系统 Jetson开发实战记录(三):Jetson Xavier NX具体开发(Ubuntu18.04系统) 在上一篇文章:Jetson开发实战记录(一):Jetson家族的基本介绍中,已经对Jetson家族

    2023年04月08日
    浏览(54)
  • 【云原生 | 从零开始学Docker】七丶实战提交自己的镜像以及docker网络

    该篇文章已经被专栏《从零开始学docker》收录 为了巩固dockerfile,我们这里来进行真实的实战。 jdk 下载linux.tar.gz tomcat 最新版就行 首先我们要 vim Dockerfile 以此来创建一个叫dockerfile的文件。注:官方指定命名,build自动寻找,不需要-f指定 然后编写以上的脚本内容加入到dock

    2024年02月02日
    浏览(56)
  • git commit提交以及撤销commit操作详解

    在日常开发中,我们使用git作为版本控制工具管理分支代码,提交版本打标签十分便捷,但也经常会 遇到提交了想撤回的尴尬情况,///不过不用慌,平时养成发布版本前仔细核验的好习惯之外,还有 补救的措施,下面讲下使用git 如何提交信息,如何撤销以及修改信息等等。

    2023年04月19日
    浏览(51)
  • 如何对比github中不同commits的区别

    有时候想要对比跨度几十个commits之前的代码区别,想直接使用github的用户界面。可以直接在官网操作。 首先要创建一个旧commit的branch。进入该旧的commit,然后输入branch名字即可。 然后在项目网址后面加上compare即可对比旧的branch和新的branch的代码区别。 比如:项目GrindingPr

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包