编写一个Dockerfile
你可以使用你喜欢的编辑器写一个简单的Dockerfile, Dockerfile就是用来描述构建镜像的文件、环境和命令的清单,Dockerfile越小越好。
创建一个新的目录
1 | root@iZ23ldh8kudZ:~/code# mkdir mydockerbuild |
进入这个新的目录
1 | root@iZ23ldh8kudZ:~/code# cd mydockerbuild |
在当前目录创建文件Dockerfile
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# vi Dockerfile |
把FROM
代码段写入文件
查看写入后的文件:
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# cat Dockerfile |
FROM
关键字告诉Docker我将以哪个镜像为基础。Whalesay是完美的,它已经有了cowsay程序,所以我们从它开始。
把RUN
代码段写入镜像
查看写入后的文件:
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# cat Dockerfile |
RUN
关键字会安装镜像所需要的程序。whalesay镜像是基于Ubuntu的,所以它使用apt-get
去安装所需要的包,这两个命令是请求此镜像可用的包,并且把fortunes程序安装到镜像,fortunes程序会打印出屋面所说的内容。
把CMD
代码段写入镜像
查看写入后的文件:
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# cat Dockerfile |
CMD
关键字告诉镜像当环境设置完成后运行最后的命令,这个命令是fortune -a
,并且输出到cowsay
命令。
从Dockerfile构建镜像
编译镜像使用的命令是docker build
,参数-t
是给镜像一个标签, 不要忽略了.
,它会告诉docker build
命令去当前目录下查找Dockerfile
文件。
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# docker build -t docker-whale . |
第一次运行时有点慢,大概一分钟左右,此间它会去下载所需要的包,会输出很多看不懂的信息。
学习构建的过程
构建镜像的命令docker build -t docker-whale .
,会在当前目录下读取Dockerfile
文件,并在本地机器上一步一步的按照指令构建一个叫作docker-whale
的镜像,构建需要一些时间,也会输出很多信息,下面来解析输出信息的意思。
Docker检测以确保所有需要构建的都准备好了
1 | Sending build context to Docker daemon 2.048 kB |
检测依赖的基础镜像
1 | Step 1/3 : FROM docker/whalesay:latest |
上面的输出信息对应的代码块是FROM
, 如果本地没有whalesay镜像,则去Docker Hub下载,如果有,那就使用本地的whalesay镜像。
Docker启动一个临时的容器去运行whalesay
在这个临时的容器中,Docker会运行Dockerfile中的下一行命令,即RUN apt-get -y update && apt-get install -y fortunes
, 这个命令是去安装fortunes
命令,此过程中输出了大量的信息。
1 | Step 2/3 : RUN apt-get -y update && apt-get install -y fortunes |
当RUN
命令运行结束后,一个新的layer
就会立即产生,并且销毁临时容器。
一个新的临时容器产生,并且Docker会添加layer
,对应于Dockerfile中的CMD
命令, 最后再销毁临时容器。
1 | Step 3/3 : CMD /usr/games/fortune -a | cowsay |
运行镜像
现在,校验这个新镜像是否在本地存在,并且去运行它。
用docker images
命令查看本地镜像
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# docker images |
运行新镜像docker run docker-whale
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# docker run docker-whale |
运行时,你会发现Docker并没有去再下载任何东西,因为镜像已经在本地构建了。
好不容易构建好了,再运行一次
1 | root@iZ23ldh8kudZ:~/code/mydockerbuild# docker run docker-whale |
你会发现,输出竟然不一样了,好像它有自己的思维,那你就多运行几次看看吧。