构建镜像的方式:
1.docker commit
2.docker Dockerfile
Docker commit:
docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤:
● 运行容器
● 修改容器
● 将容器保存为新的镜像。
如何用docker commit创建新镜像。Docker并不建议用户通过这种方式构建镜像。原因如下:
- 手工创建镜像的方式,容易出错,效率低且可重复性弱。
- 使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,存在安全隐患。
- Dockerfile(推荐方法)构建镜像,底层也是docker commit一层一层构建新镜像的
Dockerfile:
Dockerfile是一个文本文件,记录了镜像构建的所有步骤。
构建一个简单的镜像文件:
- 从这步开始就是镜像真正的构建过程。首先Docker将build context中的所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。Dockerfile中的ADD、COPY等命令可以将build context中的文件添加到镜像。
- step1/4执行FROM,将Ubuntu作为base镜像。
- step4/4执行RUN,安装vim
- 安装成功后,将容器保存为镜像,其ID为3e9c8cb93c07
-
docker history会显示镜像的构建历史,也就是Dockerfile的执行过程。
构建镜像命令:docker build -t 新的镜像名 .
如果build context为当前目录。Docker默认会从build context中查找Dockerfile文件,我们也可以通过-f参数指定Dockerfile的位置。
镜像缓存
相同的Dockerfile 顺序一致的情况下会走缓存
把copy文件和 安装 vim 顺序颠倒,重新构建Dockerfile
Dockerfile中每一个指令都会创建一个镜像层,上层是依赖于下层的。无论什么时候,只要某一层发生变化,其上面所有层的缓存都会失效。
总结一下通过Dockerfile构建镜像的过程:
(1)从base镜像运行一个容器。
(2)执行一条指令,对容器做修改。
(3)执行类似docker commit的操作,生成一个新的镜像层。
(4)Docker再基于刚刚提交的镜像运行一个新容器。
(5)重复2~4步,直到Dockerfile中的所有指令执行完毕。
构建一个简单的springboot项目:
● FROM
指定base镜像。
● MAINTAINER
设置镜像的作者,可以是任意字符串。
● COPY
将文件从build context复制到镜像。
COPY支持两种形式: COPY src dest与COPY ["src", "dest"]。
注意:src只能指定build context中的文件或目录。
● ADD
与COPY类似,从build context复制文件到镜像。不同的是,如果src是归档文件(tar、zip、tgz、xz等),文件会被自动解压到dest。
● ENV
设置环境变量,环境变量可被后面的指令使用。例如:
ENV MY_VERSION 1.3 RUN apt-get install -y mypackage=$MY_VERSION
● EXPOSE
指定容器中的进程会监听某个端口,Docker可以将该端口暴露出来。我们会在容器网络部分详细讨论。
● VOLUME
将文件或目录声明为volume。我们会在容器存储部分详细讨论。
● WORKDIR
为后面的RUN、CMD、ENTRYPOINT、ADD或COPY指令设置镜像中的当前工作目录。
● RUN
在容器中运行指定的命令。
● CMD
容器启动时运行指定的命令。
Dockerfile中可以有多个CMD指令,但只有最后一个生效。CMD可以被docker run之后的参数替换。
● ENTRYPOINT
设置容器启动时运行的命令。