Docker 制作镜像Dockerfile和commit *** 作

Docker 制作镜像Dockerfile和commit *** 作,第1张

Docker制作镜像Dockerfile和commit *** 作

本文主要介绍Docker制作镜像Docker文件和提交 *** 作,具有很好的参考价值。希望对你有帮助。来和边肖一起看看吧。

构建镜像

构建镜像有两种主要方法:

使用dockercommit命令从正在运行的容器提交镜像;

使用dockerbuild命令从Dockerfile构建镜像。

首先,介绍如何从运行的容器提交镜像。我还是以busybox映像为例,使用下面的命令创建一个名为busybox的容器并输入。

$dockerrun-RM-name=busybox-itbusyboxsh

执行上述命令后,当前窗口将启动一个busybox容器并进入该容器。在容器中,执行以下命令创建一个文件并写入内容:

/#touchhello.txt&;&echo“我爱Docker”>hello.txt

此时,在容器的根目录中,已经创建了一个hello.txt文件和“我爱Docker”。已经写好了。

接下来,我们打开另一个新的命令行窗口,并运行以下命令来提交映像:

$dockercommitbusyboxbusybox:hello

sha256:CBC6406AEF080D1DD3087d4ea1e6c6c9915ee0ee0f5d9E0a90b03e2215e81c

然后使用上面提到的dockerimagels命令查看图像:

$dockerimagelsbusybox REPOSITORYTAGIMAGEIDCREATEDSIZE busyboxhellocbc6406aaef02minutesago1.22MB busyboxlatest018c9d7b792b4weeksago1.22MB

此时,我们可以看到busybox:hello映像是在主机上新创建的。

相比之下,使用Dockerfile构建docker显然更好。docker提交的缺点如下:

在容器中 *** 作既麻烦又低效。

这也是最重要的一点。别人或者自己不知道过了一段时间这个镜像是怎么做出来的,但是我们可以看到apt-getinstall命令是针对用Dockerfile构建的镜像执行的。

第二种方法是最重要也是最常用的镜像构造方法:Dockerfile。Dockerfile是包含所有用户构建命令的文本。您可以使用dockerbuild命令从Dockerfile生成图像。

使用Dockerfile构建镜像有以下特点:

Dockerfile的每个命令行都会生成一个独立的镜像层,并具有唯一的ID。

Dockerfile的命令是完全透明的。通过查看Dockerfile的内容,可以知道镜像是如何一步一步构建的

Dockerfile是纯文本,方便和代码一起存放在代码仓库,做版本管理。

看到用Dockerfile搭建镜像有这么多好的特性,是不是迫不及待想知道怎么用了?别急,先来学习一下Dockerfile的常用指令。

Dockerfile命令 说明介绍 FROM Dockerfile除了第一行必须来自的注释,后面是图像名,表示我们希望在哪个基础图像上构建容器。 RUN RUN后面是一个特定的命令,类似于Linux命令行执行命令。 添加 将本地文件或远程文件复制到镜像中 COPY 将本机文件复制到镜像中 USER 指定启动容器的用户 点 容器 的启动命令CMD CMD为ENTRYPOINT指令提供默认参数,或者CMD可以单独用于指定容器启动参数 ENV 指定容器运行时的环境变量,格式为key=value ARG 定义外部变量,可以使用build-arg=的格式将参数传递给build EXPOSE 指定容器监听的端口,格式为[port]/tcp或[port]/udp WORKDIR 为Dockerfile中的所有以下RUN、CMD、ENTRYPOINT、COPY和ADD命令设置工作目录。

看了这么多说明,感觉有点迷茫?别担心,我会通过一个例子让你熟悉它们。这是一个Dockerfile文件:

FROMcentos:7 COPYnginx.repo/etc/yum.repos.d/nginx.repo RUNyuminstall-ynginx EXPOSE80 ENVHOST=mynginx CMD["nginx","-g","daemonoff;"]

第一行表示我想构建一个基于centos:7的定制镜像。这里需要注意的是,除了注释,每个Dockerfile的第一行必须以FROM开头。

第二行表示将本地文件nginx.repo文件复制到容器中的/etc/yum.repos.d目录。这里复制了文件nginx.repo来添加nginx的安装源。

第三行表示yuminstall-ynginx命令在容器中运行,nginx服务安装在容器中。执行第三行命令后,容器中的nginx就已经安装好了。

第四行声明容器中的服务(nginx)使用端口80向外界提供服务。

第五行定义了容器启动时的环境变量HOST=mynginx,容器启动后可以获得环境变量HOST的值为mynginx。

第六行定义了容器的启动命令。命令格式是json数组。这里,容器的启动命令设置为nginx,nginx-g的启动参数为‘daemonoff;’,以便nginx作为前台启动。

镜像原理

实际上,Docker图像是由一系列图像层组成的,每一层都代表了图像构建过程中的一次提交。下面这个由镜像构建的Dockerfile文件说明了镜像是如何分层的。

来自busybox

复制测试/tmp/测试

运行mkdir/tmp/testdir

上面的Dockerfile文件包含三个步骤:

第一行基于busybox创建镜像层;

第二行将本机测试文件复制到映像中;

第三行在/tmp文件夹下创建一个目录testdir。

这里我的Docker用的是overlay2文件驱动。转到/var/lib/docker/overlay2目录并使用树。查看生成的图像文件的命令:

$tree. #以下为tree.命令输出内容 |--3e89b959f921227acab94f5ab4524252ae0a829ff8a3687178e3aca56d605679 ||--diff#这一层为基础层,对应上述Dockerfile第一行,包含busybox镜像所有文件内容,例如/etc,/bin,/var等目录 ...此次省略部分原始镜像文件内容 |`--link |--6591d4e47eb2488e6297a0a07a2439f550cdb22845b6d2ddb1be2466ae7a9391 ||--diff#这一层对应上述Dockerfile第二行,拷贝test文件到/tmp文件夹下,因此diff文件夹下有了/tmp/test文件 ||`--tmp ||`--test ||--link ||--lower |`--work |--backingFsBlockDev |--bec6a018080f7b808565728dee8447b9e86b3093b16ad5e6a1ac3976528a8bb1 ||--diff#这一层对应上述Dockerfile第三行,在/tmp文件夹下创建testdir文件夹,因此diff文件夹下有了/tmp/testdir文件夹 ||`--tmp ||`--testdir ||--link ||--lower |`--work ...

从上面的目录结构可以看出,Dockerfile中的每一行命令都会生成一个镜像层,每一层的diff文件夹下只存储增量数据,如图2所示。

Docker的分层结构使得Docker图像非常轻量级,每一层根据图像内容都有唯一的ID值。当不同图像具有相同的图层时,可以实现不同图像之间共享图层的效果。

综上所述,Docker镜像是一个静态的分层记录组,镜像底层的实现依赖于联合文件系统(UnionFS)。充分掌握镜子的原理可以帮助我们在生产实践中构造出最佳的镜子,同时可以帮助我们更好地理解容器与镜子的关系。

摘要

到目前为止,相信你对Dockerimage的核心概念已经有了深刻的理解,并且熟悉Dockerimage的常用 *** 作(拉取、查看、“重命名”、删除、构建自定义图像)以及底层的实现原理。

镜像 *** 作命令:

拉映像,使用dockerpull命令将远程仓库的映像拉至本地;

重命名镜像,使用docker标记命令“重命名”镜像;

检查图像,并使用dockerimagels或dockerimages命令检查本地现有的图像;

删除镜像,使用dockerrmi命令删除无用镜像;

镜子,建立镜子有两种方法。第一种方式是使用dockerbuild命令基于Dockerfile构建映像,这也是推荐的映像构建方法。第二种方法是使用dockercommit命令根据已经运行的容器作为镜像进行提交。

镜像原理:

镜像由一系列镜像层组成,每一层都代表镜像构建过程中的一次提交。当我们需要修改镜像中的一个文件时,只需要在当前镜像层的基础上新建一个镜像层,只存储修改后的文件内容。分层结构使镜像之间共享镜像层变得非常简单和方便。

以上Docker镜像Dockerfile和commit *** 作都是边肖分享的内容。希望给大家一个参考,多多支持我们。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/774134.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存