DockerFile的应用及说明
编写DockerFile
应用DockerFile构建镜像
个人理解:DockerFile为创建私人定制的docker镜像,方便多次创建该类型容器使用
1.创建存放Dockerfile的文件夹
- 建议创建单独的文件夹,其中只存放Dockerfile文件
mkdir dockerfile
2.编写Dockerfile文件
- 本文以创建jdk+tomcat镜像为例,注意Dockerfile文件名首字母D大写,DockerFile文件如下:
vim Dockerfile
#创建版本信息
FROM ubuntu:latest
MAINTAINER xzj "xzj_73@163.com"
#更新ubuntu环境
RUN apt-get update
#安装jak
RUN mkdir /var/tmp/jdk
ADD jdk-8u181-linux-x64.tar.gz /var/tmp/jdk
# 安装tomcat
RUN mkdir /var/tmp/tomcat
ADD apache-tomcat-8.5.32.tar.gz /var/tmp/tomcat
#设置环境变量
ENV JAVA_HOME /var/tmp/jdk/jdk1.8.0_181
ENV CATALINA_HOME /var/tmp/tomcat/apache-tomcat-8.5.32
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#开启内部服务端口
EXPOSE 8080
#启动tomcat服务器
CMD ["./var/tmp/tomcat/apache-tomcat-8.5.32/bin/catalina.sh","run"] && tail -f /var/tmp/tomcat/apache-tomcat-8.5.32/logs/catalina.out
- 本Dockerfile文件 其中的jdk与tomcat压缩包为本地获取,可采用wget的命令进行下载,其实ADD命令可以对url进行下载,不推荐本方法在线下载的文件内容如下:
#创建版本信息
FROM ubuntu:latest
MAINTAINER xzj "xzj_73@163.com"
#更新ubuntu环境
RUN apt-get update
RUN yum install -y wget
#安装jak
RUN mkdir /var/tmp/jdk
RUN wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" -P /var/tmp/jdk http://download.oracle.com/otn-pub/java/jdk/8u172-b11/a58eab1ec242421181065cdc37240b08/jdk-8u172-linux-x64.tar.gz
RUN tar xzf /var/tmp/jdk/jdk-8u172-linux-x64.tar.gz -C /var/tmp/jdk && rm -rf /var/tmp/jdk/jdk-8u172-linux-x64.tar.gz
# 安装tomcat
RUN mkdir /var/tmp/tomcat
RUN wget -P /var/tmp/tomcat http://archive.apache.org/dist/tomcat/tomcat-8/v8.5.8/bin/apache-tomcat-8.5.8.tar.gz
RUN tar xzf /var/tmp/tomcat/apache-tomcat-8.5.8.tar.gz -C /var/tmp/tomcat && rm -rf /var/tmp/tomcat/apache-tomcat-8.5.8.tar.gz
#设置环境变量
ENV JAVA_HOME /var/tmp/jdk/jdk1.8.0_172
ENV CATALINA_HOME /var/tmp/tomcat/apache-tomcat-8.5.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin
#开启内部服务端口
EXPOSE 8080
#启动tomcat服务器
CMD ["./var/tmp/tomcat/apache-tomcat-8.5.8/bin/catalina.sh","run"] && tail -f /var/tmp/tomcat/apache-tomcat-8.5.8/logs/catalina.out
3.根据所写Dockerfile文件构建镜像
- 在Dockerfile所在文件夹下构建镜像
docker build -t="jak/tomcat" .
4.运行镜像,启动容器
- 将容器的8080端口映射为本地的8081端口启动容器
docker run -d -t -i -p 8081:8080 redstarofsleep/javaweb
5.Dockerfile文件的命令详细说明
1. FROM
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
- FROM指定构建镜像的基础源镜像,如果本地没有指定的镜像,则会自动从 Docker 的公共库 pull 镜像下来,如果不以任何镜像为基础,那么写法为:FROM scratch。
FROM必须是 Dockerfile 中非注释行的第一个指令,即一个 Dockerfile 从FROM语句开始。
如果FROM语句其中和 是可选项,没有指定镜像标签,则默认使用latest标签。
FROM可以在一个 Dockerfile 中出现多次,如果有需求在一个 Dockerfile 中创建多个镜像。
2. MAINTAINER
MAINTAINER <name> <"email">
- 指定创建镜像的用户
3. RUN
1. RUN <command>
2. RUN ["executable", "param1", "param2"]
- 每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像,后续的RUN都在之前RUN提交后的镜像为基础,镜像是分层的,可以通过一个镜像的任何一个历史提交点来创建
第一种后边直接跟shell命令
在linux操作系统上默认 /bin/sh -c
在windows操作系统上默认 cmd /S /C
第二种是类似于函数调用。
可将executable理解成为可执行文件,后面就是两个参数。
两种写法比对:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层.
多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。
RUN书写时的换行符是\
4. ADD
1. ADD <src>... <dest>
2. ADD ["<src>",... "<dest>"]
- ADD复制本地主机文件、目录到目标容器的文件系统中。
如果源是一个URL,该URL的内容将被下载并复制到目标容器中。
路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径
可以是一个本地文件或者是一个本地压缩文件,还可以是一个url
如果把写成一个url,那么ADD就类似于wget命令
5. ENV
1. ENV <key> <value>
2. ENV <key>=<value> ...
- 功能为设置环境变量,两者的区别就是第一种是一次设置一个,第二种是一次设置多个
6.EXPOSE
EXPOSE <port> [<port>...]
- 功能为暴漏容器运行时的监听端口给外部
但是EXPOSE并不会使容器访问主机的端口
如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -P参数
7. CMD
1. CMD ["executable","param1","param2"]
2. CMD ["param1","param2"]
3. CMD command param1 param2
- 功能为容器启动时要运行的命令
第三种比较好理解了,就时shell这种执行方式和写法
第一种和第二种其实都是可执行文件加上参数的形式
举例说明两种写法:
CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]
补充细节:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号。
原因是参数传递后,docker解析的是一个JSON array
像歌里唱的那样

浙公网安备 33010602011771号