在使用docker的时候,有时候会发现从远程上拉取的镜像并不能满足要求,那么这个时候,就可以根据这个镜像,编写一个Dockerfile来构建出一个属于自己的镜像。
首先创建一个Dockerfile文件,内容如下
FROM centos:7 #来自我本地的centos7
MAINTAINER lgz<lgztxwdwrnd@sina.com> #维护者
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<canueman@vip.qq.vom>
---> 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内容基础知识
- 每条保留字指令都必须为大写字母,且后面至少要跟随一个参数
- 指令按照从上往下,依次执行
- #符号,表示注释
- 每条指令都会创建一个新的镜像层,并对镜像进行提交
Docker执行Dockerfile的大致流程
- docker从基础镜像运行一个容器
- 执行一条指令并对容器作出修改
- 执行类似 docker commit的操作提交一个新的镜像层
- docker再基于刚提交的镜像运行一个新容器
- 执行 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 被触发