一、什么是DockerFile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明,有了Dockerfile,就可以很轻松通过docker bulid构建出自己的一个镜像。
二、DockerFile基础知识
- 每个保留关键字(指令)都是必须大写字母
- 执行从上到下顺序执行
#
表示注释- 每个指令都会创建提交一个新的镜像层,并提交!
常用命令
FROM # 基础镜像,一切从这里开始构建
MAINTAINER # 镜像是谁写的, 姓名+邮箱
RUN # 镜像构建的时候需要运行的命令
ADD # 步骤, tomcat镜像, 这个tomcat压缩包!添加内容
WORKDIR # 镜像的工作目录
VOLUME # 挂载的目录
EXPOSE # 保留端口配置
CMD # 指定这个容器启动的时候要运行的命令,只有最后一个会生效可被替代
ENTRYPOINT # 指定这个容器启动的时候要运行的命令, 可以追加命令ONBUILD #是一个特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而这些指令,在当前镜像构建时并不会被执行。只有当以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。Dockerfile 中的其它指令都是为了定制当前镜像而准备的,唯有 ONBUILD 是为了帮助别人定制自己而准备的。
COPY # 类似ADD, 将我们文件拷贝到镜像中
ENV # 构建的时候设置环境变量!
三、构建自己的镜像
1、构建一个自己的centos,创建一个Dockerfile(touch Dockerfile)
#基础镜像
FROM centos:7
#作者信息 后续MAINTAINER废除建议使用label
MAINTAINER dotaer<xxx@qq.com>
#设置环境变量
ENV MYPATH /usr/local
#镜像的工作目录
WORKDIR $MYPATH#镜像构建时候下载vi(官方镜像中没有vi)
RUN yum -y install vi
#镜像构建时候下载net-tools
RUN yum -y install net-tools#暴露的端口
EXPOSE 80#docker 构建完成打印的输出
RUN echo "镜像构建完成"
RUN echo $MYPATH
# .表示当前目录
docker build -t mycentos .
注意注释不要放在命令的末尾,如果把注释放在 EXPOSE 80 后面 会报Invalid containerPort错误
2、构建一个自己的tomcat(踩坑会在末尾记录)
#1、基础镜像
FROM centos:7
#2、作者信息
MAINTAINER dotaer<xxxx@qq.com>
#3、拷贝文件到容器/usr/local/
COPY readme.txt /usr/local/readme.txt
#4、将压缩文件 ,解压并添加到容器/usr/local/目录下
ADD apache-tomcat-9.0.63.tar.gz /usr/local/
ADD jdk1.8.0_201.tar.gz /usr/local/
#5、构建时容器下载vim
RUN yum -y install vim
#6、设置MYPATH环境变量,可通过env查看当前系统环境变量
ENV MYPATH /usr/local#7、容器默认进入目录
WORKDIR $MYPATH
#7、设置JAVA和Tomcat环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_201
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.63
ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.63
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#8、暴露端口号
EXPOSE 8080
#9、容器运行后执行的命令(启动tomcat,并且打开日志文件)
CMD /usr/local/apache-tomcat-9.0.63/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.63/logs/catalina.out
(1)构建
# .表示当前目录,如果文件名为官方的Dockerfile,build的时候就无需通过-f指定Dockerfile的文件名
docker build -t mytomcat .
(2)运行
# -v会自动创建不存在的目录
docker run -d -p 8080:8080 --name mytomcat01 -v /home/dotaer/build/tomcat/test:/usr/local/apache-tomcat-9.0.63/webapps/test -v /home/dotaer/build/tomcat/tomcatlogs/:/usr/local/apache-tomcat-9.0.63/logs mytomcat
运行前创建index.jsp和/WEB-INF/web.xml文件,/home/dotaer/build/tomcat/test由于启动的时候会挂载到webapps目录下,所以我们在宿主机添加这些文件即可。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>hello. xiaofan</title>
</head>
<body>
Hello World!<br/>
<%
System.out.println("-----my test web logs------");
%>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
</web-app>
(3)测试
#宿主机执行
curl localhost:8080/test/
即可看到Hello World
打开/home/dotaer/build/tomcat/tomcatlogs/catalina.out文件即可看到日志打印
踩坑记录:
1、编写Dockerfile时候,需From centos:7,因为centos 8 linux已经停止了维护,镜像中移除了该源
2、 通过docker run -d ....运行过后,通过docker ps发现容器没有启动起来,这里应该是容器启动报错了,先通过-it启动查看报错,再具体解决报错。( 狂神视频中,tail -F /usr/local/apache-tomcat-9.0.63/bin/logs/catalina.out,有个bin目录,启动后发现文件找不到,应该是没有这个bin目录的,不知道他怎么启动的。。)
3、web.xml文件中首行不能有空格