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 的相关指令如 ADDCOPY 都是与上下文有关的。

▷ 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

第一列的 FROMRUN 就是 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

posted @ 2024-09-07 17:31  takenika  阅读(101)  评论(0)    收藏  举报