一:构建镜像

  对于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指令

 

如何搭建docker镜像仓库局域网 docker建立镜像_shell

 



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 中所有指令执行完毕。