Docker制作tomcat镜像之Dockerfile

基于CentOS7、Tomcat1.7、JDK1.8制作Tomcat镜像

1.拉取centos7镜像

docker pull centos:centos7

2.将jdk1.8和tomcat1.7解压到 /data1/software目录下

   

3.编写Dockerfile,命名为dockerfile-tomcat,内容如下:

FROM centos:centos7
MAINTAINER m01
#RUN mkdir /usr/local/java && \
# mkdir /usr/local/tomcat #将tomcat和jdk下的所有文件拷贝到镜像中,目标目录不存在会自动创建。COPY源目录不能使用/data1/sofotware/apache-,无法识别 COPY apache
-tomcat-7.0.64 /usr/local/tomcat COPY jdk1.8.0_73 /usr/local/java
#ADD apache-tomcat-7.0.64.tar.gz /usr/local/tomcat/ #会将其自动解压到镜像的/usr/local/tomcat/apache-tomcat-7.0.64目录下,.sh没有执行权限
#拷贝过去的文件没有可执行权限 RUN
chmod a+x /usr/local/tomcat/bin/*.sh #添加环境变量 ENV JAVA_HOME /usr/local/java ENV CATALINA_HOME /usr/local/tomcat ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin ENV CLASSPATH .:$JAVA_HOME/lib:$JAVA_HOME/jre/lib EXPOSE 8080 CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
#Dockerfile设置多个环境变量
ENV JAVA_HOME=/usr/local/java  \
    CATALINA_HOME=/usr/local/tomcat
#因为下面要调用上面生成的环境变量,所以必须要分开写,写一起后面无法生效
ENV PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin  CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

4.运行docker build生成镜像

docker build -t centos7_tomcat7:v1 -f dockerfile-tomcat ..  # 最后的..指定工作目录,使其能够找到COPY的源目录

 5.查看新生成的Tomcat镜像

 6.启动容器:

docker container run  -d -p 8080:8080 --name tomcat01 -d centos7_tomcat7:v1

部署jenkins

从jenkins官网下载jenkins.war放到宿主/data1/software/下

编辑dockerfile-tomcat-jenkins,基于前面的tomcat镜像生成新的jenkins镜像,内容如下:

FROM centos7_tomcat7:v1
COPY jenkins.war /usr/local/tomcat/webapps/jenkins.war

docker build -t jenkins:v1 -f dockerfile-tomcat-jenkins ..    #生成jenkins镜像

docker run -d -p 8090:8080 --name jenkins01 jenkins:v1  #启动jenkins容器

访问:http://宿主IP:8090/jenkins可以正常打开jenkins页面

#将容器中的tomcat log映射到宿主机/data1/logs/tomcat05,容器启动后可以在/data1/logs/tomcat05目录下看到tomcat日志

docker run -d -p 8091:8080 --name jenkins05 --mount type=bind,source=/data1/logs/tomcat05,target=/usr/local/tomcat/logs -d jenkins:v1

====================================================================================================================

docker container run  -d -p 8080:8080 --name tomcat01 -d centos7_tomcat7:v1

docker cp jenkins.war tomcat01:/usr/local/tomcat/webapps/jenkins.war  #借助前面已生成的容器,将jenkins.war包拷贝进去也可以正常使用

重新启动容器tomcat01,访问http://宿主IP:8080/jenkins可以正常打开jenkins页面

=================================================================================

编写高效Dockerfile:https://blog.fundebug.com/2017/05/15/write-excellent-dockerfile/

#dockerfile拷贝多个文件到./
COPY ["filea", "fileb", "filec", "filed", "./"]

COPY ["dira", "dirb", "./"] #只会将目录a和目录b下的所有文件都拷贝到./,不会包含目录a和目录b本身

Dockerfile中的ARG参数只在构建docker镜像时有效,在镜像创建了并用该镜像启动容器后则无效。但可以配合ENV指令使用使其在创建后的容器也可以生效

FROM ubuntu
ARG TEST   #ARG TEST=deault_value
ENV ENV_TEST=$TEST

docker build --build-arg TEST=1 -t ubuntu:test-build -f ./dockerfile .

docker run --rm -it ubuntu:test-build
env|grep "TEST"

 Dockerfile VOLUME应用:

FROM alpine
VOLUME ["/data1","/data2"] #创建两个挂载点,但无法指定宿主具体目录,创建容器的时候自动生成

docker build -t alpine01 -f df01 .

docker container run -it --name alpine03 -d alpine01 /bin/sh

docker inspect alpine03:

  效果等同于 docker run --name test1 -it -v /data1 ubuntu /bin/bash

 Dockerfile HEALTHCHECK应用:

HEALTHCHECK只是用来检查容器健康状态,应用场景:容器还在运行中,监控服务是否已经假死

如果容器已停止,需要自启动,则使用docker run --restart always参数

编写dockerfile-nginx,内容如下:

FROM nginx
#延迟5s才开始检查,留给容器一个启动时间;每10s检查一次;检查命令超时时间为3s,重试3次都失败,则认为容器是unhealthy状态
HEALTHCHECK --start-period=5s --interval=10s --timeout=3s --retries=3 \
#检查80端口,如果失败则返回1,返回非零状态码Docker就会认为当前容器的状态是不健康的
CMD curl -sS 'http://localhost:80' || exit 1   #使用脚本检查:CMD /bin/bash /opt/check80.sh

check80.sh脚本内容如下:

curl -sS 'http://localhost:80' > /dev/null
if [ $? == 0 ];then
  exit 0
else
  exit 1
fi
View Code

docker build -t nginx_test:v2 -f dockerfile-nginx01 .

docker run --name nginx01 -d nginx_test:v2

原文地址:https://www.cnblogs.com/dreamer-fish/p/15745608.html