【详解】Dockerfile原理、镜像容器、命令总结

目录

1、Docker 中镜像和容器概念

2、Dockerfile原理详解

①镜像:

 ②Dockerfile原理

 ③Dockerfile中指令的作用

具体将一个工程部署到docker容器【图解】:

关于Dockerfile,你学会了吗?



重要事情说三遍:

创建Dockerfile文件的时候,文件名必须是Dockerfile

创建Dockerfile文件的时候,文件名必须是Dockerfile

创建Dockerfile文件的时候,文件名必须是Dockerfile

1、Docker 中镜像和容器概念

①Docker镜像

Docker 镜像是一个特殊的文件系统,除了提供容器所需的程序、库、资源、配置等文件外,还包含了一些能为运行时准备的一些配置参数(匿名卷、环境变量、用户等)。

镜像不包含任何动态数据,其内容在构建之后不会被改变。

构建镜像:

docker build -d -p 8000:8000 --name myimage image 

②Docker容器

Docker 容器是一个在运行的Docker镜像的实例(instance)。包括服务或应用的状态和其他动态的数据。

运行镜像——>容器

docker run -it 容器ID

③镜像和容器小结

镜像是一个类,容器是类的一个实例,一个镜像可以有多个容器。容器是一个动态的。

2、Dockerfile原理详解

镜像:

镜像是一种轻量级、可执行的独立软件包,用来打包软件可运行环境和基于运行环境开发的软件,它包含了某个软件运行所需的所有内容,包括代码、库、环境变量,配置文件等。

docker中的镜像,实际上是由一层一层的文件系统组成,Dockerfile中的每一行命令代表一层,为什么Docker镜像采用的是分层结构呢?因为docker镜像最大的作用是资源共享,多个镜像从相同的Base镜像构建而来,在最底层的镜像是最基础的镜像。docker中所有的镜像都起始于一个基础镜像层,当进行修改或者增加内容时,就会在当前镜像之上创建新的镜像层。如下图,基础Ubuntu镜像层,在此基础之上,创建Python镜像层,Security Patch镜像层。

【详解】Dockerfile原理、镜像容器、命令总结

 就像集装箱一样,一层一层的叠加在一起,而彼此之间相互独立。

【详解】Dockerfile原理、镜像容器、命令总结

 ②Dockerfile原理

为什么要有Dockerfile:

       当我们写项目工程的时候,希望自己的工程应用以容器的方式运行,这个时候我们需要把自己的项目打包成一个镜像,运行镜像(容器)。这样项目工程才会在Docker容器里面运行。 一般在公司项目交付的时候都是交付一个镜像。

Dockerfile就是构建Docker镜像的镜像文件,通过命令脚本生成镜像,镜像是一层一层的,脚本是一个个命令,每个命令都是一层。

下面是流程:

        构建镜像可以拉取远程的,也可以通过Dockerfile构建,运行镜像变成容器,容器打包所需的项目成功后,提交镜像。

【详解】Dockerfile原理、镜像容器、命令总结

 下面重点讲解的是Dockerfile构建镜像的过程。

docker build --name myimage .

 docker build的时候,写的命令是在docker的客户端,执行命令是在docker的服务端,docker服务端接收到build指令的时候,Docker服务端会把Dockerfile所在的目录称之为上下文目录,Docker服务端找到上下文目录的时候,会把上下文中的所有目录进行一次性打包,并发送到Docker服务端。当Docker服务端接收到上下文context打包的文件的时候,根据Dockerfile指令进行构建,一行一行的进行构建。

注意docker build 最后一点【.】的含义:【docker build --name myimage .】 指令的最后一点代表的是Dockerfile所在的目录,也就是上下文目录,docker build 的时候,将后面的一点提交到服务端,Docker服务端找到这个上下文,然后对Dockerfile进行加载。

简洁:

       Docker服务端先收到context(上下文:包信息指的是Dockerfile所在目录))的包信息,然后根据Dockerfile中的指令一行一行进行构建,每读取一行,都会在Docker服务端生成一层镜像。第二层基于第一层,在第一层之上生成一层镜像,最后一行指令会最终生成整个镜像的产物。

docker build 在构建镜像的时候,会把构建成功的镜像放到缓存区。

如下图所示:

【详解】Dockerfile原理、镜像容器、命令总结

 再看下图:

【详解】Dockerfile原理、镜像容器、命令总结

 ③Dockerfile中指令的作用

所有指令必须是大写

<1>FROM:基于哪个镜像构建,第一个指令必须是FROM

<2>RUN :在镜像运行的时候运行的shell指令

<3>EXPOSE:镜像暴露的端口,只有容器启动映射到宿主机的端口,暴露的端口才会起作用

<4>WORKDIR:镜像运行成容器之后,首次进行容器的路径就是WORKDIR 设置的路径。可以理解为Dockerfile的workspace工作路径

<5>ENV:构建镜像过程中设置的环境变量

<6>ADD:作用是 将宿主机中的文件拷贝到镜像中,之后如果文件是压缩文件,还可以解压。也就是 文件可以进一步处理。这也是ADD区别于COPY的的特点。也就是ADD会对拷贝的文件进行处理。

<7>COPY:将宿主机中的文件拷贝到镜像中,其余的啥也不干

ADD\COPY:都是将宿主机中的文件拷贝到镜像中

<8>VOLUME:镜像中的哪个文件挂载到宿主机上

<9>CMD:容器要启动时要运行的指令,Dockerfile可以有多个CMD指令,但是只有最后 一个CMD指令生效,CMD会被docker run 后面的参数替换。CMD命令是可变的 <10>ENRTYPOINT:容器启动时需要执行的指令,用来设置固定命令,不变的

CMD和ENTRYPOINT:都是容器启动时需要运行的指令

具体将一个工程部署到docker容器【图解】:

https://blog.csdn.net/Sunshineoe/article/details/120478455

关于Dockerfile,你学会了吗?

上一篇:Docker学习笔记4 -- Dockerfile


下一篇:20分钟极简入门Docker