【Docker】Dockerfile的基本使用
****************************************************************************
本文主要介绍Dockerfile的基本使用
1.什么是Dockerfile?
2.Dockerfile的示例
3.Dockerfile的常用命令
****************************************************************************
1、Dockerfile的使用
1.1、什么是Dockerfile?
Dockerfile 是Docker中创建镜像最常用的方式。Dockerfile是一个Docker镜像的文本描述文件,我们可以理解成火箭发射的A、B、C、D…的步骤。Dockerfile其内部包含了一条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。
1.2、Dockerfile示例
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文件,基本使用包含引用基础镜像、下载依赖包、复制文件到指定目录、指定工作目录、启动
1.3、Dockerfile的常用命令
1.3.1、命令直观图
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