Dockerfile是由一行行命令语句组成并且支持以#开头的注释行。一般而言Dockerfile分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时的执行指令。比如:
# This dockerfile uses the ubuntu image
#VERSION 2 - EDITION
#Author:docker_user
#Command format:Instruction [arguments / command] ..
#第一行必须指定基于的基础镜像
FROM ubuntu
# 维护者信息
MAINTAINER docker_user [email protected]
# 镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/raring main unniverse" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemin off;" >> /etc/nginx/nginx.conf
# 容器启动时执行指令
CMD /usr/sbin/nginx
其中,一开始必须指明所基于的镜像名称,接下来一般会说明维护者的信息。后面是镜像的操作指令,例如RUN指令,RUN指令将对镜像执行跟随的命令。每运行一条RUN指令,镜像添加新的一层并提交。最后是CMD指令,来指定运行容器时的操作命令。以下是一些常用指令:
ONBUILD #当构建一个被集成的dockerfile这个时候就会运行ONBUILD出3发指令
COPY #类似add,将我们的文件拷贝到镜像中
EXPOSE # 暴露端口配置,也可以是用-p
ENV # 构建的时候设置环境变量
简单来说:通过这个dockerfile脚本可以生成镜像,镜像是一层一层的,脚本的命令是一行一行的,每个命令对应的都是一层镜像。如下图:
#文件中的内容,指令都是大写
FROM centos
VOLUME ["valume01","volume02"]
CMD echo "....end...."
CMD /bin/bash
# 通过该文件构建镜像
docker build -f dockerfile1 -t test/centos .
# 通过刚才新建的镜像启动容器
docker run -it cb1617765743 /bin/bash
以上可以看到通过dockerfile构建的镜像成功挂载了两个数据卷,这两个数据卷一定有一个同步的目录!在上一篇blog里面我们提到过,没有指定宿主机的挂载目录只指定了容器的目录这个叫匿名挂载,匿名挂载的文件路径在宿主机中:/var/lib/docker/volumns/***/_data目录下
# 通过docker inspect命令可以查看容器的基本信息
docker inspect 59cbcddbfefe
# 通过docker history imageId可以查看该镜像的构建步骤
编写dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,不需要-f指定
#基础镜像为Centos
FROM centos
#维护者
MAINTAINER this is tomcat test image
#创建文件夹/tomcat
RUN mkdir -p /usr/local/tomcat
#复制并解压apache-tomcat-7.0.92.tar.gz包到/tomcat目录下
ADD apache-tomcat-9.0.85.tar.gz /usr/local/tomcat
#复制并解压jdk-8u391-linux-x64.tar.gz包到/tomcat目录下
ADD jdk-8u391-linux-x64.tar.gz /usr/local/tomcat
#添加JAVA环境变量
ENV JAVA_HOME /usr/local/tomcat/jdk1.8.0_391
ENV CLASS_PATH $JAVA_HOME/lib:$JAVA_HOME/jre/lib
ENV PATH $PATH:$JAVA_HOME/bin
#暴露端口
EXPOSE 8080
#启动tomcat并持续输出日志防止容器退出
ENTRYPOINT /usr/local/tomcat/apache-tomcat-9.0.85/bin/startup.sh && /bin/bash && tail -f /usr/local/tomcat/apache-tomcat-9.0.85/logs/catalina.out
构建镜像
[root@VM-4-17-centos tomcat]# docker build -t tomcat:9.0.85 .
[+] Building 84.5s (11/11) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 731B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos 5.3s
=> [1/6] FROM docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a 47.6s
=> => resolve docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5 0.0s
=> => sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487 1.20kB / 1.20kB 0.0s
=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b53 529B / 529B 0.0s
=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16 2.75kB / 2.75kB 0.0s
=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f255373 76.10MB / 76.10MB 42.8s
=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3b 4.4s
=> [internal] load build context 0.0s
=> => transferring context: 303B 0.0s
=> [2/6] COPY readme.txt /usr/local/readme.txt 0.8s
=> [3/6] ADD jdk-8u391-linux-x64.tar.gz /usr/local 4.2s
=> [4/6] ADD apache-tomcat-9.0.85.tar.gz /usr/local 0.3s
=> [5/6] RUN yum -y install vim 24.4s
=> [6/6] WORKDIR /usr/local 0.1s
=> exporting to image 1.6s
=> => exporting layers 1.6s
=> => writing image sha256:b74793dde9bc6f52c7147fb4432639ab14c64eb1408a631db57eda82e299 0.0s
=> => naming to docker.io/library/diytomcat
启动测试
docker run -d -p 3366:8080 --name tomcat985 -v /home/tomcat/build/test:/usr/local/tomcat/apache-tomcat-9.0.85/webapps/test -v /home/tomcat/build/tomcatlogs:/usr/local/tomcat/apache-tomcat-9.0.85/logs tomcat:9.0.85
发布项目(由于做了数据卷挂载,我们在宿主机上的test目录下编写项目就可以发布)
#在挂载的test目录下新建WEB-INF文件夹,新建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
</web-app>
#在挂载test目录下新建index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
Hello World!<br/>
<%
out.println("你的 IP 地址 holle world");
%>
</body>
</html>
访问容器后进入数据卷目录发现我们在宿主机的挂载目录下新建的文件已经同步
外网访问
项目部署成功,可以直接访问!