基於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
docker build -t nginx_test:v2 -f dockerfile-nginx01 .
docker run --name nginx01 -d nginx_test:v2

