(1)、Dockerfile是什么?
(2)、为什么要自己构建镜像
(3)、DockerFiler文件语法
DSL语言书写时有顺序的,如上图
<1>、FROM【必选】
用于指定构建镜像时依赖的基础镜像格式:1 、 FROM < 镜像名 > 或 FROM< 镜像名 >:< 版本 > # 不填 tag 默认为 latest例如: FROM docker.io/nginx除了选择现有镜像为基础镜像外, Docker 还存在一个特殊的镜像,名为 scratch 。这个镜像是虚拟的概念,并不实际存在,它表示一个空白的镜像。2 、 FROM scratch如果你以 scratch 为基础镜像的话,意味着你不以任何镜像为基础,接下来所写的指令将作为镜像第一层开始存在。
<2> MAINTAINER[可选]、LABEL[可选]
MAINTAINER :镜像维护人的信息示例: MAINTAINER 火狐 @ 老六 邮箱地址LABEL :指定该 dockerfile 的基本信息,如维护者、版本等 ,新版的 dockerfile 中使用 LABEL 来指定信息例如: LABEL author=“火狐 @ 老六” version=“1.0” describe=“ 构建 nginx 镜像 ”
<3>、 RUN[可选,但用的频率非常高]
每条 RUN 指令将在当前镜像的基础上执行指定命令,并提交为新的镜像。当命令较长时可以使用 \ 来换行,多条命令用 && 来连接,避免执行多个 RUN ,使得镜像层数变多。最好只留一个 RUNRUN 命令有两种格式1. RUN <command>2. RUN ["executable", "param1", "param2"]第一种后边直接跟 shell 命令在 linux 操作系统上默认 /bin/sh -c在 windows 操作系统上默认 cmd /S /C第二种是类似于函数调用。可将 executable 理解成为可执行文件,后面就是两个参数。
<4>、 ADD[可选,但用的频率非常高]
一个复制命令,把文件复制到镜像中。语法如下:1. ADD <src>... <dest>2. ADD ["<src>",... "<dest>"]路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径,推荐写成绝对路径路径可以是一个本地文件或者是一个本地压缩文件,还可以是一个 url 如果把写成一个 url ,那么 ADD 就类似于wget【下载】命令示例ADD test relativeDir/ADD http://example.com/foobar /注意事项src 为一个目录的时候,会自动把目录下的文件复制过去,目录本身不会复制如果 src 为多个文件, dest 一定要是一个目录
<5>、WORKDIR[可选]
设置指令,可以多次切换 ( 相当于 cd 命令 ) ,对 RUN,CMD,ENTRYPOINT 生效。格式:WORKDIR /path/to/workdir
<6>、VOLUME[可选]
可实现挂载功能,可以将宿主机目录挂载到容器中格式:VOLUME["<mountpoint>"]例如:FROM baseVOLUME ["/tmp/data"]
<7>、EXPOSE[可选]
告诉 Docker 服务,容器需要暴露的端口号,可通过 docker history 镜像名查看暴露的端口号,在启动容器时通过 -p 参数让 Docker 主机分配一个端口转发到容器的指定端口格式:EXPOSE <port> [<port>...]
<8>、CMD[可选]
指定启动容器时执行的命令,每个 Dockerfile 只能有一条 CMD 命令。如果指定了多条 CMD 命令,只有最后一条会被执行。如果用户在启动容器时指定了要运行的命令,则会覆盖掉 CMD 指定的命令。格式:CMD ["executable","param1","param2"]CMD ["param1","param2"]CMD command param1 param2第三种比较好理解了,就时 shell 这种执行方式和写法第一种和第二种其实都是可执行文件加上参数的形式举例说明两种写法:CMD [ "sh", "-c", "echo $HOME" ]CMD [ "echo", "$HOME" ]
<9> 、补充:ENTRYPOINT
功能是:容器启动时运行得启动命令语法如下:ENTRYPOINT ["executable", "param1", "param2"]ENTRYPOINT command param1 param2与 CMD 比较说明(这俩命令太像了,而且还可以配合使用):相同点:只能写一条,如果写了多条,那么只有最后一条生效容器启动时才运行,运行时机相同不同点:ENTRYPOINT 不会被运行的 command 覆盖,而 CMD 则会被覆盖如果我们在 Dockerfile 种同时写了 ENTRYPOINT 和 CMD ,并且 CMD 指令不是一个完整的可执行命令,那么 CMD指定的内容将会作为 ENTRYPOINT 的参数
<10>、ENV[可选]
指定一个环境变量,会被后续 RUN 指令使用,在容器中通过 export 可以查看格式 :# 一次设置一个变量ENV <key> <value># 设置多个环境变量ENV <key1>=<value1> <key2>=<value2> <key3>=<value3>
(4)、示例
1、创建一个demo目录将需要使用到安装包上传
2、在当前目录中创建Dokcerfile文件,并配置
# 第一步:Dockerfile需要一个初始镜像
#初始镜像是一个linux
FROM centos
# 第二步:构建镜像用的一些资源上传进入镜像【tomcat.tar.gz+jdk.tar.gz】
# 将文件复制到容器内有两个指令可用:add 【会自动解压】 / copy
# linux 安装时需要将tar.gz 用 tar -zxvf 解压,因此选择add
#ADD上传 dockerfile同目录下tomcat压缩包 解压镜像中/usr/local/tomcat
ADD apache-tomcat-9.0.21.tar.gz /usr/local/tomcat
ADD jdk-8u161-linux-x64.tar.gz /usr/local/jdk#第三步:配置环境变量 安装JDK流程---tar压缩包--->配置环境变量就OK了
# tar步骤add干了,就差环境变量
#变量路径要根据安装包来,jdk-8u161--转为--jdk1.8.0_161
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_161
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# 下面这些时tomcat环境变量
ENV CATALINA_HOME /usr/local/tomcat/apache-tomcat-9.0.21
ENV CATALINA_BASE /usr/local/tomcat/apache-tomcat-9.0.21
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin#第四步:tomcat默认端口为8080,需要开放端口
#容器开放8080端口
EXPOSE 8080#第五步:启动tomcat
# tomcat运行需要用bin内置的sh文件,可以用startup.sh 也可以 catalina.sh run 运行
# 就用 catalina.sh run 运行 --- catalina.sh 执行文件 run 给与指令参数
CMD ["/usr/local/tomcat/apache-tomcat-9.0.21/bin/catalina.sh","run"]
3. 使用docker build指令构建镜像
docker build -t ImageName:TagName dir选项-t 给镜像加一个 TagImageName 给镜像起的名称TagName 给镜像的 Tag 名Dir Dockerfile 所在目录