【Dockerfile】Dockerfile打包Tomcat及TongWeb应用镜像(工作实践踩坑教学)
文章目录
- 前言
- 准备工作
- 目录结构准备
- 基础镜像准备
- dockerfile开发(TongWeb)
- dockerfile开发(Tomcat)
- dockerfile镜像命令(排查问题基本够用)
更多相关内容可查看
前言
本文仅应用于完成此项工作,后续会补充完整自动化dockfile
准备工作
• Docker
• JDK 8/11(根据应用需求)
• Tomcat 9.x或TongWeb 6.x
• 应用WAR包或EAR包
目录结构准备
建议的项目目录结构(这样的好处是你的dockerfile不用过于麻烦去读取,直接读取当前目录即可):
/work
├── Dockerfile(tomcat)
├── 解压后的jdk文件夹
├── 启动好的tomcat容器文件
├── 启动好的tongweb容器文件
└── Dockerfile(tongweb)
tomcat如图:
tongweb如图:
基础镜像准备
使用基础镜像(例如Red Ha的或者麒麟的等等,工作中可以使用工作提供的基础镜像,为了学习的可以网上随便下载一个基础镜像)
docker hub镜像仓库地址:https://hub.docker.com/
Red Hat镜像仓库:地址:https://catalog.redhat.com/
阿里云镜像仓库地址:https://cr.console.aliyun.com/
华为云镜像仓库地址:https://console.huaweicloud.com/swr/
腾讯云镜像仓库地址:https://ccr.ccs.tencentyun.com/
安全基础镜像(Distroless)地址:https://github.com/GoogleContainerTools/distroless
Windows基础镜像地址:https://hub.docker.com/_/microsoft-windows-base-os-images
麒麟OS:docker pull kylincloud/kylin:V10
统信UOS:docker pull uniontech/uos:20
dockerfile开发(TongWeb)
开发思想:这里没做太多自动化的东西,简单思想就是在本地去部署成功,启动成功,然后通过dockerfile完整的把部署成功的容器放到镜像中,通过入口点去启动即可
这里东方通的部署手册不在这里详细展开,可去主页查找对应的东方通部署文档
# 使用内部基础镜像
FROM kylin# 设置维护者信息
LABEL maintainer="xxx"# 设置工作目录
WORKDIR /Tongweb# 设置 JAVA_HOME 和环境变量
ENV JAVA_HOME=/opt/jdk8
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
ENV TZ="Asia/Shanghai"
ENV TERM=xterm# 暴露端口
EXPOSE 8089 9061# 创建必要目录
RUN mkdir -p /TongWeb# 复制 JDK 压缩包到镜像中
COPY ./openjdk8 /opt/jdk8/# 复制 TongWeb 目录
COPY ./TongWeb7.0/ /TongWeb/# 设置权限(如果需要)
RUN chmod 777 /TongWeb/domains/xxxDomain/bin/startserver.sh# 设置入口点
ENTRYPOINT ["/bin/bash","/TongWeb/domains/xxxDomain/bin/startserver.sh"]
踩坑案例:
1.如果你在自己的服务器上部署完Tongweb,打包到镜像中可能会出现读取war的路径错误,可以修改自己域下(如果是独立域的话)的config/tongweb.xml文件,里面会挂在程序的路径,修改为你的镜像中的路径即可
2.如果改完还是路径错误,需要查看启动脚本中的路径是否错误,Tongweb会自动装载本地加载路径
3.如果你的程序中有有特殊读取文件的需求例如读取当前/域名/bin/xxx文件,打包到镜像中发现路径错误,可以修改对应的启动脚本cd到你的镜像中的地址
dockerfile开发(Tomcat)
# 使用内部基础镜像
FROM kylin# 设置维护者信息
LABEL maintainer="xxx"# 设置工作目录
WORKDIR /Tomcat# 设置 JAVA_HOME 和环境变量
ENV JAVA_HOME=/opt/jdk8
ENV CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
ENV TZ="Asia/Shanghai"
ENV TERM=xterm
ENV CATALINA_OUT=/dev/stdout
# 暴露端口
EXPOSE 8080# 创建必要目录
RUN mkdir -p /Tomcat# 复制 JDK 压缩包到镜像中
COPY ./openjdk8 /opt/jdk8/# 复制 Tomcat 目录
COPY ./apache-tomcat-9.0.99/ /Tomcat/# 输出日志到docker logs
RUN ln -sf /dev/stdout /Tomcat/logs/catalina.out# 设置权限(如果需要)
RUN chmod 777 /Tomcat/bin/startup.sh# 设置入口点
ENTRYPOINT ["/Tomcat/bin/catalina.sh","run"]
踩坑案例:通过上述前置启动,即可在部署完容器后直接docker logs xxx实时查看启动日志,如果你的程序中有有特殊读取文件的需求例如读取当前tomcat/bin/xxx文件,打包到镜像中发现路径错误,可以修改对应的启动脚本cd到你的镜像中的地址,如图
dockerfile镜像命令(排查问题基本够用)
重点:构建镜像,启动容器,日志查看
1. 镜像构建命令
`docker build -f Dockerfile_jdk -t jdktest:1.0.0 .`• 作用:使用 `Dockerfile_jdk` 文件构建一个名为 `jdktest`、标签为 `1.0.0` 的镜像。• 参数解析:• `-f Dockerfile_jdk`:指定使用的 Dockerfile 文件。• `-t jdktest:1.0.0`:指定镜像名称和标签。• `.`:构建上下文路径(当前目录)。`docker build -f Dockerfile_Server -t server_zhongyuan:1.0.0 .`• 作用:使用 `Dockerfile_Server` 构建名为 `server_zhongyuan:1.0.0` 的镜像。
2. 容器运行命令
`docker run -d --name server-zhongyuan-container -p 9022:9022 -p 9522:9522 server_zhongyuan:1.0.0`• 作用:以后台模式 (`-d`) 运行容器,命名为 `server-zhongyuan-container`,并映射端口。• 关键参数:• `-p 9022:9022`:将容器内 9022 端口映射到宿主机 9022。• `-p 9522:9522`:同上,用于第二个服务端口。`docker run -d --name server_zhongyuan-container server_zhongyuan:1.0.0`• 作用:简化版运行命令(无端口映射),仅启动容器。
3. 容器调试与检查命令
`docker exec hke-private-server java -version`• 作用:在运行的容器 `hke-private-server` 中执行 `java -version`,检查 Java 版本。
• 用途:验证容器内 Java 环境是否正确安装。`docker logs hke-private-server`
• 作用:查看容器 `hke-private-server` 的标准输出日志。
• 典型场景:排查应用启动失败原因。`docker logs server_zhongyuan-container`
• 作用:查看容器 `server_zhongyuan-container` 的日志(同上)。`docker inspect --format='{{.Os}}/{{.Architecture}}' kylin`
• 作用:检查镜像 `kylin` 的操作系统和架构信息。• 输出示例:`linux/amd64`。
4. 临时容器诊断命令
`docker run --rm -it --entrypoint /bin/sh server_zhongyuan:1.0.0 -c "java -version"`
• 作用:启动临时容器,覆盖入口点为 `/bin/sh`,执行命令后自动删除容器 (`--rm`)。• 分解:• `--rm`:运行后删除容器。• `-it`:交互式终端。• `-c "java -version"`:在容器内执行的命令。`docker run --rm -it --entrypoint /bin/sh server_zhongyuan:1.0.0 -c "ls -l /xxx/xxx/ServerStart.sh"`
• 作用:检查容器内启动脚本的权限和路径是否存在。• 用途:验证应用启动脚本是否被正确复制到镜像中。
5. 服务健康检查
`curl http://localhost:9544/health`
• 作用:通过 HTTP 请求检查应用健康状态(假设应用暴露了 `/health` 端点)。• 典型场景:验证应用是否正常运行。
命令分类总结
类别 | 命令示例 | 核心用途 |
---|---|---|
镜像构建 | docker build -f Dockerfile -t name:tag . | 根据 Dockerfile 创建镜像 |
容器运行 | docker run -d --name xxx -p host:container image:tag | 启动容器并映射端口 |
日志查看 | docker logs <container> | 调试容器内应用输出 |
容器内诊断 | docker exec <container> cmd 或 docker run --rm -it --entrypoint /bin/sh | 检查环境、文件、进程等 |
元数据检查 | docker inspect --format='{{.Os}}' <image> | 获取镜像/容器的详细信息 |
健康检查 | curl http://localhost:port/health | 验证服务是否可达 |