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
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端口,是通的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?