Docker_使用Dockerfile构建新镜像

在使用docker的时候,有时候会发现从远程上拉取的镜像并不能满足要求,那么这个时候,就可以根据这个镜像,编写一个Dockerfile来构建出一个属于自己的镜像。


首先创建一个Dockerfile文件,内容如下

FROM centos:7                           #来自我本地的centos7
MAINTAINER lgz<[email protected]>    #维护者
VOLUME ["/project"]                     #新建一个数据卷
ENV WORK_PATH /project                  #设置环境变量
WORKDIR $WORK_PATH                      #设置进入容器的工作目录
RUN yum -y install vim                  #安装vim
RUN yum -y install net-tools            #安装net-tools
CMD echo successfully build!!!
CMD /bin/bash

使用build命令构建

语法:docker build -f [自定义的Dockerfile绝对路径] -t [镜像名称[:TAG]] . (命令末尾有个点,不要忽略)

测试命令:docker build -f /myDocker/Dockerfile -t lgz/centos:build2 .

[root@localhost myDocker]# docker build -f /myDocker/Dockerfile -t lgz/centos:build2 .
Sending build context to Docker daemon  3.072kB
Step 1/9 : FROM centos:7
 ---> 5e35e350aded
Step 2/9 : MAINTAINER lgz<[email protected]>
 ---> Running in bfa301e12fd9
Removing intermediate container bfa301e12fd9
 ---> fbbe4d72dbc3
Step 3/9 : VOLUME ["/project"]
 ---> Running in e9b189867994
Removing intermediate container e9b189867994
 ---> 1fc246e02fa0
Step 4/9 : ENV WORK_PATH /project
 ---> Running in f1df0cc7c99d
Removing intermediate container f1df0cc7c99d
 ---> 3235871c6ace
Step 5/9 : WORKDIR $WORK_PATH
 ---> Running in c66d8a0c23a1
Removing intermediate container c66d8a0c23a1
 ---> b8dcc6ba6d13
Step 6/9 : RUN yum -y install vim
 ---> Running in d74fe0dba30c
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: mirrors.163.com
 * extras: centos.ustc.edu.cn
 * updates: mirrors.163.com
Resolving Dependencies
--> Running transaction check
---> Package vim-enhanced.x86_64 2:7.4.629-6.el7 will be installed
--> Processing Dependency: vim-common = 2:7.4.629-6.el7 for package: 2:vim-enhanced-7.4.629-6.el7.x86_64
--> Processing Dependency: which for package: 2:vim-enhance
...
...

构建成功

[root@localhost /]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
lgz/centos          build2              7906476eda5f        15 minutes ago      437MB
lgz/tomcat          build01             6ce2360a3c6c        25 hours ago        507MB
lgz/centos          build01             0b71e009561a        26 hours ago        203MB
tomcat              jdk8-openjdk        c81106060722        3 days ago          507MB
centos              7                   5e35e350aded        13 days ago         203MB

lgz/centos:build2 镜像变更历史

[root@localhost /]# docker history lgz/centos:build2
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
7906476eda5f        28 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
634cd1ef5033        28 minutes ago      /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
5b2fe886d44f        28 minutes ago      /bin/sh -c yum -y install net-tools             89.7MB              
4063988ef5fd        28 minutes ago      /bin/sh -c yum -y install vim                   145MB               
b8dcc6ba6d13        29 minutes ago      /bin/sh -c #(nop) WORKDIR /project              0B                  
3235871c6ace        29 minutes ago      /bin/sh -c #(nop)  ENV WORK_PATH=/project       0B                  
1fc246e02fa0        29 minutes ago      /bin/sh -c #(nop)  VOLUME [/project]            0B                  
fbbe4d72dbc3        29 minutes ago      /bin/sh -c #(nop)  MAINTAINER lgz<canueman@v…   0B                  
5e35e350aded        13 days ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           13 days ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           13 days ago         /bin/sh -c #(nop) ADD file:45a381049c52b5664…   203MB 

Dockerfile是用来构建Docker镜像的构建文件,是由一系列的命令与参数构成的脚本。

Dockerfile内容基础知识

  1. 每条保留字指令都必须为大写字母,且后面至少要跟随一个参数
  2. 指令按照从上往下,依次执行
  3. #符号,表示注释
  4. 每条指令都会创建一个新的镜像层,并对镜像进行提交

Docker执行Dockerfile的大致流程

  1. docker从基础镜像运行一个容器
  2. 执行一条指令并对容器作出修改
  3. 执行类似 docker commit的操作提交一个新的镜像层
  4. docker再基于刚提交的镜像运行一个新容器
  5. 执行 dockerfile中的下一条指令直到所有指令都执行完成

Dockerfile保留字指令

FROM

表示当前新生成的镜像是基于哪个镜像

MAINTAINER

镜像维护者的姓名和邮箱地址

RUN

容器构建时需要运行的命令

EXPOSE

当前容器对外暴露的端口

WORKDIR

指定在容器创建后,终端默认登陆进来的工作目录

ENV

用来在镜像的构建过程中设置环境变量

ADD

将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

COPY

类似ADD,拷贝文件和目录到镜像中
将从构建上下文目录中<源路径>的文件/录复制到新的一层的镜像内的<目标路径>位置
两种写法:
1. COPY src dest;
2. COPY[“src”,“dest”]

VOLUME

容器数据卷,用于数据保存和持久化工作

CMD

指定一个容器启动时要运行的命令
Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被 docker run之后的参数替换

ENTRYPOINT

指定一个容器启动时要运行的命令
ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数

ONBUILD

当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的 onbuild 被触发

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章