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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM