文章目录
一、DockerFile简介
DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。
构建步骤:
1、编写一个DockerFile文件;
2、docker build 构建称为一个镜像;
3、docker run运行镜像;
4、 docker push发布镜像(DockerHub 、阿里云仓库)。
以我们熟悉的centos为例:
我们可以看到官方的Dockerfile。
但是很多官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像!
二、DockerFile的构建过程
1、基础知识:
1)、每个保留关键字(指令)都是必须是大写字母
2)、执行从上到下顺序
3)、#表示注释
4)、每一个指令都会创建提交一个新的镜像层,并提交!
2、Docker执行DockerFile的大致流程
3、小结
从应用软件的角度来看,Dockerfile、Docker镜像与Docker容器分别代表软件的三个不同阶段:
-
Dockerfile是软件的原材料
-
Docker镜像是软件的交付品
-
Docker容器则可以认为是软件的运行态。
Dockerfile面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可,合力充当Docker体系的基石。
1、Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2、Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
3、Docker容器,容器是直接提供服务的。
三、Dockerfile的指令
文字版:
# DockerFile常用指令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤,tomcat镜像,这个tomcat压缩包!添加内容 添加同目录
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代。
ENTRYPOINT # 指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD # 当构建一个被继承 DockerFile 这个时候就会运行ONBUILD的指令,触发指令。
COPY # 类似ADD,将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
四、CMD 和 ENTRYPOINT区别
1、CMD
CMD:指定这个容器启动的时候要运行的命令,当有多个CMD命令时,只有最后一个会生效,CMD也会被docker run 之后的参数所替代。
比如我们的一个dockerfile文件如下:
FROM centos
CMD ["ls","-a"]
docker build -f dockerfile-test-cmd -t cmd-test:0.1 .
当我们构建一个新镜像后,运行这个镜像想要实现 ls -al 的效果,我们直接执行如下命令:
docker run cmd-test:0.1 -l
这样是不行的,会有报错:
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\":
executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled
这是因为:cmd的情况下 -l 替换了"ls","-a"。 最终变为cmd ["-l"] 。
应该写为:
ocker run cmd-test:0.1 ls -al
2、ENTRYPOINT
ENTRYPOINT:指定这个容器启动的时候要运行的命令,可以追加命令。docker run 之后的参数会被当作参数传递给ENTRYPOINT,之后形成新的命令组合。
还是上面的那个例子,我们的dockerfile文件如下:
FROM centos
ENTRYPOINT ["ls","-a"]
我们运行镜像时可以直接在docker run 后面追加参数:
$ docker run entrypoint-test:0.1 -l
total 56
drwxr-xr-x 1 root root 4096 May 16 06:32 .
drwxr-xr-x 1 root root 4096 May 16 06:32 ..
-rwxr-xr-x 1 root root 0 May 16 06:32 .dockerenv
lrwxrwxrwx 1 root root 7 May 11 2019 bin -> usr/bin
drwxr-xr-x 5 root root 340 May 16 06:32 dev
drwxr-xr-x 1 root root 4096 May 16 06:32 etc
drwxr-xr-x 2 root root 4096 May 11 2019 home
lrwxrwxrwx 1 root root 7 May 11 2019 lib -> usr/lib
lrwxrwxrwx 1 root root 9 May 11 2019 lib64 -> usr/lib64 ....
可以看到,我们运行时传进去的参数拼接在ENTRYPOINT的参数的后面,形成了一个新的命令,相当于ENTRYPOINT [“ls”,"-al"]。
五、实战测试
创建一个自己的centos。
1、Bas镜像(scratch):
Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
2、镜像仓库原始的的centos的情况:
所以,我们想自定义mycentos目的是使我们自己的镜像具备如下:
登陆后的默认路径
vim编辑器
查看网络配置ifconfig支持
3、编写DockerFile
FROM centos
MAINTAINER macay<1207@126.com>
ENV MYPATH /usr/local
WORKDIR $MYPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 80
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash
4、通过这个文件构建镜像
命令 docker build -f 文件路径 -t 镜像名:[tag] .
docker build -f Dockerfile -t mycentos:1.0 .
- -f 指定Dockerfile文件
- -t 指定生成的镜像名(target)
- .代表当前目录下,不能少
可以看到,通过build构建新镜像的过程完全是按照我们的dockfile文件来一步一步执行的。
5、运行容器
docker run -it mycentos:1.0
可以看到,我们自己的新镜像已经支持vim/ifconfig命令,且终端登陆进来就是我们设置的工作目录/usr/local,说明扩展成功了。