前言

创建一个Docker镜像有很多种方式,但是我们在日常开发中最常用的一种方式应该是通过一个Dockerfile来进行创建,因为通过这种方式,我们可以通过一个特定Dockerfile文件来持续的可视化的进行相关镜像的创建和更新,下面我们就来了解一下创建Docker镜像的脚本Dockerfile中的常用关键字
null

关键字

  • FROM

指定基础镜像信息,后续的指令都依赖于该指令指定的镜像

  • MAINTAINER

指定镜像维护者信息,将Image的制作者的相关信息写入镜像中,通过对该镜像执行docker inspect命令时可以看到相应字段的信息输出

  • RUN

构建指令,在FROM中设置的镜像上运行脚本或命令,在RUN可以运行任何被基础镜像持的命令。如基础镜像选择了ubuntu,那么软件管理部分只能使用ubuntu的命令

  • COPY

将文件从宿主机复制到容器中的指定位置,使用COPY添加文件时,不会解压缩,也不能使用文件URL

  • ADD

将文件从宿主机复制到容器指定位置,同时对压缩文件有自动解压功能

  • ENV

指定环境变量,设置了该环境变量以后,后续的RUN命令都可以使用,container启动后,可以通过docker inspect查看这个环境变量。

  • USER

设置启动容器的用户,为后续的如RUN、CMD、ENTRYPOINT 执行命令指定用户,默认是root用户。

  • EXPOSE

将容器中的端口映射成宿主机器中的某个端口

  • HEALTHCHECK

容器中服务健康检查

  • WORKDIR

为后续的如RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目录,可以多次切换,相当于Linux中的cd命令

  • ENTRYPOINT

设置容器启动时需要执行的命令,

  • CMD

指定启动容器时指定的操作,该操作可以是执行自定义脚本命令,也可以是执行系统命令

  • VOLUME

指定挂载点,使容器中的一个目录有存储持久化数据的功能,该目录可以供容器自己使用,也可以共享给其他容器来使用,当容器关闭,该目录下的所有修改都将消失

实例


FROM docker.io/centos

MAINTAINER zhang@163.com

WORKDIR /usr

RUN mkdir jdk

RUN mkdir tomcat

COPY jdk1.8.0_191 /usr/jdk/

ADD apache-tomcat-9.0.30 /usr/tomcat/

ENV JAVA_HOME=/usr/jdk

ENV JRE_HOME=$JAVA_HOME/jre

ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH

ENV PATH=/sbin:$JAVA_HOME/bin:$PATH

EXPOSE 8080

ENTRYPOINT ["/usr/tomcat/bin/catalina.sh","run"]
  • 创建Dockerfile文件

touch Dockerfile
  • 在当前文件夹下准备一个tomcat服务,并且在当前文件夹下准备一个jdk服务,我准备的tomcat的版本是apache-tomcat-9.0.30, jdk的版本是jdk1.8.0_191,根据自己的实际情况调整该文件夹名称
    null

  • 在当前目录下执行通过Dockerfile创建镜像命令,镜像名称和版本自由发挥


docker build -t centos-tomcat:v1 .
  • 镜像创建成功之后,通过如下的docker命令来启动该镜像,相关的对外映射接口可自由发挥

docker run -d -p 9001:8080 --name centos-tomcat centos-tomcat:v1
  • 服务启动成功,则可以通过在浏览器中调用该tomcat验证是否可正常使用

  • 在容器中,可以通过docker logs命令来查询该服务的访问日志信息


docker logs centos-tomcat

注意

  • Dockerfile是按照顺序一行一行执行的

  • Dockerfile每一行代表一条指令,以#开头的表示注释语句,指令过长可以通过反斜线

\来进行换行

  • WORKDIR可以设置绝对路径,也可以设置相对路径,若使用相对路径,先要以设置的WORKDIR路径为基准更改目录。最初基准为/

  • ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。

  • 一个Dockerfile中只能有一条CMD命令,多条CMD命令则只会执行最后一条

  • 一个Dockerfile中只能有一条ENTRYPOINT命令,如果多次设置,只会执行最后一条

  • 在Dockerfile中只能有一条HEALTHCHECK指令,如果有多条,只会有最后一条生效