一:构建镜像
对于Docker用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的中间件,应用软件,数据库都有现成的Docker官方镜像或其他人和组织创建的镜像,我们只需稍作配置就可以直接使用。
当然,某些情况下我们也不得不自己构建镜像,例如:
(1)找不到现成的镜像,比如自己开发的应用程序
(2)需要在镜像中加入特定的功能,比如官方镜像几乎都不提供ssh
Docker提供了两种构建镜像的方法:docker commit 命令与Dockerfile构建文件。
1.docker commit
docker commit命令是创建新镜像最直观的方法,其过程包含三个步骤:
● 运行容器。
● 修改容器。
● 将容器保存为新的镜像。
语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
OPTIONS说明:
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停。
ps:
将容器qwer1234 保存为新的镜像,并添加提交人信息和说明信息。
docker commit -a "machao" -m "machao images" qwer1234 nginx:v1.12
然而,Docker并不建议用户通过这种方式构建镜像。原因如下:
(1).这是一种手工创建镜像的方式,容易出错,效率低且可重复性弱。比如要在centos镜像中也加入vim,
还得重复前面的所有步骤。
(2).更重要的:使用者并不知道镜像是如何创建出来的,里面是否有恶意程序。也就是说无法对镜像进行审计,
存在安全隐患。
二.Dockerfile
用通俗一点的话来讲:dockerfile就是根据自己的需要自定义一个镜像,就像你写shell脚本一样,把一连串的过程或步骤全部写进dockerfile文件中,一步一步的执行dockerfile文件中你写的内容。
Dockerfile是一个文本文件,记录了镜像构建的所有步骤
ps:Dockerfile指令
2.1.Build命令
用法 : 构建 选项
Usage:docker build [OPTIONS] PATH | URL | -
OPTIONS:
-t ,--tag list #构建后的镜像名称 把新镜像命名为
-f, --file string #指定Dockerfiile文件位置
示例:
1,docker build .
2,docker build -t nginx:v10 .
3,docker build -t nginx:v10 -f /path/Dockerfile /path
一般常用第2种方式构建,我们在构建时都会切换到Dockerfile文件的目录下进行构建,所以不需要指定-f参数。
ps.第一个Dockerfile
[root@ubuntu ~]# cat Dockerfile
FROM ubuntu
RUN yum install vim -y[root@ubuntu ~]# pwd
/root
[root@ubuntu~]# docker build -t ubuntu-vim-dockerfile .
[root@qwer1234 ~]# pwd ①
/root
[root@qwer1234 ~]# ls ②
Dockerfile
[root@qwer123456 ~]# docker build -t ubuntu-dockerfile . ③
Sending build context to Docker daemon 2.048 kB ④
Step 1/2 : FROM ubuntu ⑤
---> 113a43faa138
Step 2/2 : RUN apt-get update && apt-get install -y vim ⑥
---> Running in 6b519717e62d ⑦
…………
Setting up vim (2:8.0.1453-1ubuntu1) ...
---> ff7bda2385c1 ⑧
Removing intermediate container 6b519717e62d ⑨
Successfully built ff7bda2385c1 ⑩
①.当前目录为/root
②.Dockerfile准备就绪
③.运行docker build 命令,-t 将新镜像命名为 ubuntu-vim-dockerfile,命令末尾的 . 指明build context(构建环境)为当前目录。Docker默认会从build context中查找Dockerfile文件,我们也可以通过 -f 参数指定Dokerfile文件位置
④.从这步开始就是镜像真正的构建过程。首先Docker将build context中所有文件发送给Docker daemon。build context为镜像构建提供所需要的文件或目录。
Dockerfile 中的ADD,COPY等命令可以将build context中的文件添加到镜像。此例中,build context 为当前目录/root,该目录下的所有文件和子目录都会被发送给Docker daemon。
所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把/ ,/usr作为build context,否则构建过程会相当缓慢甚至失败。
⑤.step 1:执行FROM,将ubuntu 作为base镜像。
ubuntu镜像ID为113a43faa138
⑥.step 2:执行 RUN,安装vim,具体步骤为 ⑦ ⑧ ⑨。
⑦.启动ID为6b519717e62d的临时容器,在容器中通过apt-get 安装vim。
⑧.安装成功后,将容器保存为镜像,其 ID 为 ff7bda2385c1。
这一步底层使用的是类似docker commit 的命令
⑨.删除临时容器 6b519717e62d。
⑩.构建镜像成功
docker history 'image name' ##docker history 会显示镜像的构建历史,也就是 Dockerfile 的执行过程
3.镜像的缓存特性
Docker 会缓存已有镜像的镜像层,构建新镜像时,如果某镜像层已经存在,就直接使用,无需重新创建
4. 调试 Dockerfile
Dockerfile 构建镜像过程:
(1.) 从 base 镜像运行一个容器。
(2.) 执行一条指令,对容器做修改。
(3.) 执行类似 docker commit 的操作,生成一个新的镜像层。
(4.) Docker 再基于刚刚提交的镜像运行一个新容器。
(5.) 重复 2~4 步,直到 Dockerfile 中所有指令执行完毕。