****************************************************************************

本文主要介绍Dockerfile的基本使用

  1.什么是Dockerfile?

  2.Dockerfile的示例

  3.Dockerfile的常用命令

****************************************************************************

1Dockerfile的使用

1.1、什么是Dockerfile?

Dockerfile 是Docker中创建镜像最常用的方式。Dockerfile是一个Docker镜像的文本描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

 【Docker】Dockerfile的基本使用-编程知识网

1.2Dockerfile示例

1)正常Dockerfile的结构如下所示:

#基于centos镜像

FROM centos

#维护人的信息

MAINTAINER The CentOS Project <303323496@qq.com>

#安装httpd软件包

RUN yum -y update

RUN yum -y install httpd

#开启80端口

EXPOSE 80

#复制网站首页文件至镜像中web站点下

ADD index.html /var/www/html/index.html

#复制该脚本至镜像中,并修改其权限

ADD run.sh /run.sh

RUN chmod 775 /run.sh

#当启动容器时执行的脚本文件

CMD [“/run.sh”]

  由上可知,Dockerfile结构大致分为四个部分:

  (1)基础镜像信息

  (2)维护者信息

  (3)镜像操作指令

  (4)容器启动时执行指令

2)结合实际项目【运维平台】Dockerfile编写示例:

配置说明:通常运维人员会根据项目研发人员提供的镜像封装维护手册来编写Dockerfile文件,基本使用包含引用基础镜像、下载依赖包、复制文件到指定目录、指定工作目录、启动

【Docker】Dockerfile的基本使用-编程知识网

1.3Dockerfile的常用命令

1.3.1、命令直观图

 【Docker】Dockerfile的基本使用-编程知识网

1.3.2、命令详解

1)FROM

指明构建的新镜像是来自于哪个基础镜像,例如:

FROM centos:6

2)RUN

构建镜像时运行的Shell命令,例如:

RUN [“yum”, “install”, “httpd”]
RUN yum install httpd

3)CMD

启动容器时执行的Shell命令,例如:

CMD [“-C”, “/start.sh”]
CMD [“/usr/sbin/sshd”, “-D”]
CMD /usr/sbin/sshd -D

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在docker run 时运行。
RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效

4)ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 –entrypoint 选项,此选项的参数可当作要运行的程序覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

5)ADD(支持解压文件)

ADD 指令和 COPY 的使用格式一致(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

6)COPY(不支持解压文件)

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。用法同ADD,只是不支持自动下载和解压,例如:

COPY ./start.sh /start.sh

7)ENV设置环境内环境变量,例如:

ENV MYSQL_ROOT_PASSWORD 123456
ENV JAVA_HOME /usr/local/jdk1.8.0_45

8)VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

例如:VOLUME [“/var/lib/mysql”]

作用:

避免重要的数据,因容器重启而丢失,这是非常致命的。
避免容器不断变大。

PS:一般不会在Dockerfile中用到,更常见的还是在docker run的时候指定-v数据卷。

9)EXPOSE

仅仅只是声明端口。

作用:

帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

10)WORKDIR

RUN、CMD、ENTRYPOINT以及COPY和AND设置工作目录指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

格式:

WORKDIR /data

11)利用Dockerfile创建镜像

通过目录下的 Dockerfile 构建一个 tomcat:v1(镜像名称:镜像标签)

docker build -t tomcat:v1 .

12)创建容器

docker run -itd –name=tomcate -p 8080:8080

    -v /app/webapps/:/usr/local/apache-tomcat-8.0.46/webapps/

    tomcat:v1