dockerfile详解

我们可以把对容器的所有操作命令都记录到一个文件里,就像写脚本程序。

之后用 docker build 命令以此文件为基础制作一个镜像,并会自动提交到本地仓库。

这样的话镜像的构建会变的透明化,对镜像的维护起来也更加简单,只修改这个文件即可。

同时分享也更加简单快捷,因为只要分享这个文件即可。

Dokcerfile 是一个普通的文本文件,文件名一般叫 Dockerfile

其中包含了一系列的指令(Instruction), 每一条指令都会构建一层,就是描述该层是如何创建的。

一、小试牛刀

1、编辑 Dockerfile 文件

[root@localhost ~]# mkdir centos_dockerfile
[root@localhost ~]# cd centos_dockerfile/
[root@localhost centos_dockerfile]# vi Dockerfile
FROM centos:latest
LABEL maintainer="yangge "  description="Install tree vim*"
RUN rpm -qa | grep tree || yum  install -y tree vim*

指令介绍:

FORM 定义一个基础镜像
LABEL 定义一些元数据信息,比如作者、版本、关于镜像的描述信息
RUN 执行命令行的命令
2、构建镜像
docker bulid -t 仓库名/镜像名:tag .
eg : [root@localhost centos_dockerfile]# docker build -t centos:1.20 .

二、最佳实践

一般来说,应该会将 Dockerfile 置于一个空目录下,或者项目根目录下。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的

Dockerfile 的文件名并不要求必须为 Dockerfile,而且并不要求必须位于上下文目录中,比如可以用 -f …/Dockerfile.qf 参数指定某个文件作为 Dockerfile。

一般大家习惯性的会使用默认的文件名 Dockerfile,以及会将其置于镜像构建上下文目录中。

[root@localhost dockerfile_qf_ignore]# tree .
.
├── Dockerfile.qf
└── test
    ├── a.txt
    ├── b.txt
    └── test.qf
[root@localhost dockerfile_qf_ignore]# cat Dockerfile.qf
FROM alpine
COPY ./test.qf /root/test.qf
[root@localhost dockerfile_qf_ignore]# docker build -f ../Dockerfile.qf -t alpine:test.qf .
[root@localhost dockerfile_qf_ignore]# docker run -it alpine:test.qf /bin/sh

三、详解

1、FROM 指令
2、LABEL 指令

用于指定一个镜像的描述信息

3、ENV 指令

用于设置环境变量

4、RUN 指令

在容器内执行 shell 命令,默认会是用 /bin/sh -c 的方式执行

5、CMD 指令

Dockerfile 中只能有一条CMD指令。如果列出多个,CMD 则只有最后一个CMD会生效。
CMD 主要目的是为运行容器时提供默认值

6、ENTRYPOINT 指令

ENTRYPOINT 的目的和 CMD 一样,都是在指定容器的启动程序及参数。

7、WORKDIR 指令

用于声明当前的工作目录,以后各层的当前目录就被改为指定的目录。
格式为 WORKDIR <工作目录路径>。
如该目录不存在,WORKDIR 会帮你建立目录。

8、COPY 指令

格式:
	COPY <源路径>... <目标路径>
	
	COPY ["<源路径1>",... "<目标路径>"]

COPY会从构建的上下文目录中,把源路径的文件或目录复制到新的一层的镜像内的 <目标路径> 位置

9、ADD 指令

ADD 指令和 COPY 的格式和性质基本一致.
官方推荐使用 COPY 进行文件的复制.

10、USER 指令

USER 则是改变执行 RUN, CMD 以及 ENTRYPOINT 这类命令的身份.

11、ONBILUD 指令

ONBUILD 是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。
只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

Dockerfile 中的其它指令都是为了定制当前镜像而准备的,唯有 ONBUILD 是为了帮助别人定制自己而准备的

四、例子

vim Dockerfile #首字母大写
# This my first nginx Dockerfile
# Version 1.0
# Base images 基础镜像
FROM centos
#MAINTAINER 维护者信息
MAINTAINER luoyinsheng
#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH
#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.16.1.tar.gz /usr/local/ 
#RUN 执行以下命令
RUN yum -y install epel-release.noarch
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean
all
RUN useradd -s /sbin/nologin -M www
#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.16.1
RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module
--with-pcre && make && make install
#EXPOSE 映射端口
EXPOSE 80
#CMD 运行以下命令
CMD ["nginx","-g","daemon off;"]
docker build -t nginx:v1 .

五、图解

dockerfile详解_第1张图片

你可能感兴趣的:(运维)