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脚本内容如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
##########################################
通过Dockerfile发布应用服务(使用jdk镜像源,对java服务生成镜像并发布到容器)
Dockerfile与services目录都位于当前目录/data2下
1.编辑Dockerfile:
FROM shd/app/jdk:8u121 LABEL maintainer="lya@yx.com" COPY services /data1/services #将当前目录下的services目录拷贝到容器的/data1下,/data1目录会自动创建 EXPOSE 8469 #要开放的端口 CMD ["/bin/bash", "/data1/services/sync-tool-web-up/bin/startup.sh", "start"] #要运行的脚本及参数
2.生成镜像:
docker build -t wepwd:v5 .
3.创建容器:
docker run -itd -p 8469:8469 --name wepwd05 wepwd:v5
完成后telnet 8469端口,是通的