上一章我们用的是 docker commit 命令创建的自己的库,虽然简单但是定制性比较差,因此我们采用另一种且更广泛的做法就是 docker build命令,先上手做个demo

1
2
3
4
cd $HOME/document/www
mkdir build_demo
cd build_demo
vi Dockerfile

下面是 Dockerfile 中的代码

1
2
3
4
5
6
# Version 0.0.1
FROM gaofeifiy/ubuntu-last
MAINTAINER GPF “5173180@qq.com”
RUN touch /ReadMe.txt
RUN echo 'hey your contain build success!' > /ReadMe.txt
EXPOSE 80

然后在 $HOME/document/www/build_demo 目录下运行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
➜  lnmp_docker docker build -t="gaofeifiy/lnmp_server" .
# 下面是显示的
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM gaofeifiy/ubuntu-last
 ---> 6f8cfa1871b0
Step 2 : MAINTAINER GPF
 ---> Running in 3e442a5807f3
 ---> 8d0efc1cf9f7
Removing intermediate container 3e442a5807f3
Step 3 : RUN touch /ReadMe.txt
 ---> Running in 91a7a049d18c
 ---> b98309a7d5a4
Removing intermediate container 91a7a049d18c
Step 4 : RUN echo 'hey your contain build success!' > /ReadMe.txt
 ---> Running in 0158f49fef8f
 ---> 6416fe72ff4c
Removing intermediate container 0158f49fef8f
Step 5 : EXPOSE 80
 ---> Running in 26e1d7df6ab7
 ---> c994cb02df6e
Removing intermediate container 26e1d7df6ab7
Successfully built c994cb02df6e

-t 就是我们新建镜像的标签

接下来我们查看一下本地的镜像列表里出现了什么

1
2
3
4
➜  lnmp_docker docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
gaofeifiy/lnmp_server   latest              c994cb02df6e        40 hours ago        227 MB
gaofeifiy/ubuntu-last   latest              6f8cfa1871b0        2 days ago          227 MB

我们刚刚创建的镜像已经出现到本地的列表里面了 输入 docker history c994cb02df6e 查看镜像的构建流程

我们回顾一下整个流程:刚才所有的操作都是在 Dockerfile 这个文件中进行的,我们用到以下命令

. FROM gaofeifiy/ubuntu-last 新建的库采用 gaofeifiy/ubuntu-last 这个镜像构建的(就是上一章我们建的那个,因为写这个的时候电脑没网… 其实应该是 ubuntu:16.04 这类的基础镜像) . MAINTAINER GPF “5173180@qq.com” 指定了该镜像的作者和邮箱 . RUN touch /ReadMe.txt 运行系统命令,创建一个ReadMe.txt 文件 其他的RUN命令欧式同样的道理 . EXPOSE 80 指定镜像对外端口是80

下面介绍一下更多的Dockerfile相关的指令

. ENV 设置镜像中的环境变量 比如 ENV REFRESHED_AT 2017-02-22 设置缓存更新时间 . CMD 和docker run 命令类似,是等容器启动后执行的命令,会被docker run指令干扰 例CMD ["/bin/bash","-l"] 这里推荐使用数组形式,防止出现-c参数的干扰 . ENTRYPOINT 和CMD命令类似,但是不会被docker run的命令干扰,而且会把docker run后的指令当作 ENTRYPOINT的参数来用 例如:ENTRYPOINT ["/usr/sbin/nginx","-g","demon off"] 这条命令和 ENTRYPOINT ["/usr/sbin/nginx"] 加上 docker run -t -i xxx镜像 -g "demon off" 两条语句产生的作用相同 . USER 指定镜像以什么用户去运行,默认是root 也可以docker run -u 来指定用户 . VOLUME 创建一个容器的共享卷,这样的话多个镜像容器公用一套内容,相当于类中的静态变量 . ADD 将本地文件添加到镜像当中,会解压 仅限在以Dockerfile文件为根目录的目录下 . COPY 将本地文件拷贝到镜像当中,不会解压 仅限在以Dockerfile文件为根目录的目录下 . ONBUILD 当其他镜像使用本镜像的时候触发的命令 例如ONBUILD RUN echo 'hello world' 当别的镜像引用到这个镜像的时候就会执行这条命令