通过dockerfile 构建一个Tomcat 7镜像
一、简介
docker 构建镜像有两种方式:
- 先通过docker pull 拉取一个基础镜像,然后在基础镜像中添加新内容,最后通过docker commit 成一个新的镜像
- 通过dockerfile 文件构建镜像
这里就采用第二种方式来构建一个Tomcat 7 的镜像文件
二、dockerfile 文件简介
2.1、什么是dockerfile?
Dockerfile is nothing but the source code for building Docker images
- Docker can build images automatically by reading the instructions from a Dockerfile
- A Dockerfile is a text document that contains all the commands a user could call on the command line
to assemble an image- Using docker build users can create an automated build that executes several command-line
instructions in succession
2.2、Dockerfile的基础结构
Dockerfile 是一行行命令语句组成,并且支持以 # 号开头的注释行;一般的Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行的指令。Dockerfile约定其内部指令部分要求全部大写
- FROM :所有Dockerfile都必须以FROM开始,FROM命令会指定镜像基于那个基础镜像;FROM命令可以多次使用,表示会创建多个镜像,例如:FROM centos 用来告诉我们,新的镜像将基于centos的镜像来构建
- MAINTAINER:设置该镜像的作者,此语法即将被摒弃所以不建议使用此指令,docker已经有了一个替代命令LABEL
- LABEL:给镜像指定各种元数据,也可以实现“MAINTAINER”的功能,例如:LABEL maintainer "Semon_boy@sina.com"
LABEL 的语法为:LABEL <key>=<value> <key>=<value> <key>=<value>...
,也可以是LABEL <key> <value>
通过空格代替“=” - RUN:在shell或者exec的环境下执行的命令。RUN指令会在新创建的镜像上添加新的层面,接下来提交的结果用在Dockerfile的下一条指令中。
RUN 的语法为:RUN command
- CMD:容器启动时的命令。语法如下:
CMD 的语法为:CMD <command>|CMD ["<executable>","<param1>","<param2>"]|CMD ["<param1>","<param2>"]
,其中,第一、二中语法和RUN相同,第三种语法为ENTRYPOINT指令提供默认参数 - ADD:复制文件指令。它有两个参数
<source>
和<destination>
;其中前者可以是一个URL或者是启动配置上下文中的一个文件,后者是容器内的路径。ADD命令会把复制的压缩包自动解压,COPY则不会有解压操作,这是两者的区别
ADD 的语法为:ADD src destination
- COPY:用于从宿主机复制文件到创建的新镜像中,语法如下:
COPY 的语法为:COPY <src>...<dest>
- EXPOSE:指定容器在运行时监听的端口。语法如下:
EXPOSE 的语法为:EXPOSE port
- ENTRYPOING:配置给容器的一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。Docker只允许一个ENTERPOINT,存在多个只有最后一个生效。语法如下:
ENTRYPOINT 的语法为:ENTRYPOINT ['executable','param1','param2']
<推荐使用这种数组模式> - WORKDIR:指定RUN、CMD与ENTRYPOINT命令的工作目录。语法如下:
WORKDIR 的语法为:WORKDIR /path/to/workdir
- ENV:设置环境变量。他们使用键值对,增加运行程序的灵活性。语法如下:
ENV的语法为 :<key> <value>
- VALUME:用来创建挂载点,可以挂载宿主机的卷或者其他容器上的卷。但是不能指定宿主机当中的目录,因为宿主机挂载的目录是自动生成的。语法如下:
VALUME 的语法为:VOLUME ['/data']
注: 在Dockerfile中,RUN和CMD的区别如下:
- RUN指令运行与镜像文件构建过程中,CMD则运行于基于Dockerfile构建出的新镜像文件启动为一个容器的时候
- CMD指令的主要目的在于给启动容器指定默认要运行的程序,且在运行结束后,容器也将终止;不过,CMD命令也可以被docker run的命令行选项给覆盖
- Dockerfile中可以存在多个CMD指令,但是只有最后一个会生效
- Dockerfile中如果既有CMD又有ENTRYPOINT,并且CMD是一个完整可执行命令,那么谁在最后谁生效
2.3、构建Tomcat 7
2.3.1 准备工作
因为要Tomcat 7 需要JDK和Tomcat 7,并且需要为JDK 配置环境变量,所以我们先把JDK和Tomcat 7下载到本地
所以本次我的目录结果如下:
当前目录为根目录,下载好的Tomcat 7和JDK 放在和Dockerfile同一目录下
2.3.2、编写Dockerfile文件
因为有一些解释性的东西要说明,所以这里我就直接贴一张Dockerfile的图片
截图如下:
说明如下:
- ADD :后面我们可以直接录入下载地址,然后dockerfile运行到ADD时就会去指定的网址下载软件包且自动拷贝并解压到指定的路径,所以dockerfile 中拷贝tomcat 7 的ADD 也可以写成:
另一种写法:ADD https://www-eu.apache.org/dist/tomcat/tomcat-7/v7.0.96/bin/apache-tomcat-7.0.96.tar.gz /usr/local
- WORKDIR:指定指令的执行目录,就是CMD、ENTRYPOINT这些命令的执行目录
2.3.4 构建dockerfile
通如下命令构建编写好的dockerfile文件
docker build -t mytomcat --build-arg myname=Semon .
注意后面的那个点,代表执行dockerfile所在目录下的文件
2.3.5、运行docker 镜像
通过如下命令运行docker
docker run --name t1 -d -p 80:8080 mytomcat
可以通过docker ps 查看是否启动成功
2.3.6、最后的验证
启动后就可以通过虚拟机加上端口映射的ip访问到tomcat,你会看到可爱的画面如下:
验证成功