前言
创建一个Docker镜像有很多种方式,但是我们在日常开发中最常用的一种方式应该是通过一个Dockerfile来进行创建,因为通过这种方式,我们可以通过一个特定Dockerfile文件来持续的可视化的进行相关镜像的创建和更新,下面我们就来了解一下创建Docker镜像的脚本Dockerfile中的常用关键字
关键字
- 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,根据自己的实际情况调整该文件夹名称
在当前目录下执行通过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指令,如果有多条,只会有最后一条生效
0条评论