docker 构建镜像
▶ 认识 docker 构建镜像 image
▷ 构建镜像的方式
创建镜像的方式有两种,
docker commit命令docker build命令
▷▷ 两者的区别
对于 docker commit 来说它的可重复性是比较差的,比如当需要在 B容器 中执行与 A容器 一样的操作就意味着要重复进行操作,同时创建容器的步骤很难与别人分享,这时候如果有类似脚本一样的东西出现,即可以执行与前面的机器一样的操作,同时也能进行个性化的操作就会方便很多。
在 https://www.cnblogs.com/takenika/articles/18401352 的一小节 ▷ 留下容器,创建镜像-docker commmit-docker container commit 具体说了用法。
而 docker build 则是使用的是形如 docker build -t 镜像名 Dockerfile的路径 这种格式,对于 Dockerfile 来说,这就好比是 sh 脚本,提供了自动化的过程,而 Dockerfile 则是与 docker build 相互关联的文件,在真实的使用过程中 Dockerfile 的使用表现在它的路径与 docker build 向串联。
▷▷ 写一个简单的 Dockerfile 文件来创建一个新的镜像
先创建一个目录用来专门存放 Dockerfile 文件。
[root@server ~]# mkdir the_dockerfile
[root@server ~]# cd the_dockerfile/
[root@server the_dockerfile]# touch Dockerfile
编辑 Dockerfile 文件的内容
[root@server the_dockerfile]# vi Dockerfile
FROM debian
RUN apt update && apt install neofetch -y
使用 docker build 命令来创建镜像,docker build 目录中 Dockerfile 文件的内容,然后创建镜像。
[root@server the_dockerfile]# docker build neofetch .
--snip--
[+] Building 110.4s (6/6) FINISHED docker:d => [internal] load build definition from Dockerfile
=> => transferring dockerfile: 151B => [internal] load metadata for docker.io/library/debian:latest
=> [internal] load .dockerignore => => transferring context: 2B
=> CACHED [1/2] FROM docker.io/library/debian:latest => [2/2] RUN apt update && apt install neofetch -y
=> exporting to image => => exporting layers
=> => writing image sha256:5d31f3d341e9d329992b900d1c510c9d50150ab21e4d99e03ae583c2f43a2813 => => naming to docker.io/library/neofetch
这样镜像就构建好了。
通过 docker iamges 来查看该构建的镜像。
[root@server ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
neofetch latest 5d31f3d341e9 2 hours ago 390MB
这样基于 Dockerfile 文件创建的镜像就完成了,这一过程涉及多个内容,做为一个简单演示里面的包含的信息在下面的内容中。
▶ docker build、Dockerfile、上下文、镜像层
▷ docker build - docker buildx build
Start a build - 开始构建
docker build 需要用到 Dockerfile 和 构建环境的上下文。
▷ 上下文
这里的上下文是指 build context 即是 构建环境的上下文。
上下文:一组本地文件和目录,通常是以目录路径的形式指定。
在之前的示列中 docker build neofetch . 最后的 . 就是表明上下文的位置,. 是当前目录的意思,也就是说 . 表示的当前目录就是 docker build 的构建环境的上下文。
上下文在后面写 Dockerfile 过程中有一定的作用,Dockerfile 的相关指令如 ADD 与 COPY 都是与上下文有关的。
▷ Dockerfile
Dockerfile 就像是脚本一样对于创建镜像是极为重要的文件。
Dockerfile 文件中有指定这一概念。
关于Dockerfile:https://www.cnblogs.com/takenika/articles/18404170
[root@server the_dockerfile]# cat Dockerfile
FROM debian
RUN apt update && apt install neofetch -y
第一列的 FROM、RUN 就是 Dockerfile 文件的指令,指令的作用显而易见就是告诉 docker 在创建镜像之前创建镜像的容器会执行怎样的操作。
值得注意的是 FROM 这个指令,该指令指定了你要创建的镜像是基于那个镜像产生的,这里是基于 debian 这个系统产生的。在所有的 Dockerfile 中一定要有 FROM 指令作为第一个非注释的指令。
Dockerfile 的指令很多,这里不提。
▷ 镜像层
这是docker容器中一个重要的概念。
镜像是容器运行的基石,容器的运行是基于镜像的,根据图中显示容器在镜像之上运行。
最底层的镜像层是基础镜像,通常是操作系统,越往上走就是在这个镜像中的操作系统执行的命令。
在 Dockerfile 中每个指令就会创建一个新的镜像层。一个新的镜像层的建立,是用上一层的镜像启动容器,然后执行 Dockerfile 的指令后,把它保存为一个新的镜像。
镜像层越多,自然就越复杂,这很不好,所以 RUN apt update && apt install neofetch -y 其实是两个命令结合而成的中使用 && 来连接,这样就只是使用了一次 RUN 也就在原来的镜像层上构建了一层。
▷▷ 使用 docker history 来查看镜像
[root@server ~]# docker history neofetch
IMAGE CREATED CREATED BY SIZE COMMENT
5d31f3d341e9 35 hours ago RUN /bin/sh -c apt update && apt install neo… 274MB buildkit.dockerfile.v0
<missing> 3 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 days ago /bin/sh -c #(nop) ADD file:1129dcf71f67461f4… 117MB
通过 docker history 可以查看镜像构建的过程,可以看到该镜像构建了三层,最上面一层是在之前 docker build 的过程中构建的,基于的是一个 debian 的镜像层,可以看到 debian 镜像层的镜像标识符 IMAGE 是 <missing>,只显示了最上面的镜像 5d31f3d341e9。

浙公网安备 33010602011771号