目录
重要事情说三遍:
创建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:
当我们写项目工程的时候,希望自己的工程应用以容器的方式运行,这个时候我们需要把自己的项目打包成一个镜像,运行镜像(容器)。这样项目工程才会在Docker容器里面运行。 一般在公司项目交付的时候都是交付一个镜像。
Dockerfile就是构建Docker镜像的镜像文件,通过命令脚本生成镜像,镜像是一层一层的,脚本是一个个命令,每个命令都是一层。
下面是流程:
构建镜像可以拉取远程的,也可以通过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中指令的作用
所有指令必须是大写
<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容器【图解】: