本文档将指导您如何构建 qyxr/tomcat8
Docker 镜像,并在 Docker Compose 中使用该镜像运行 Tomcat 服务。
0. Dockerfile
# 定义构建时变量
ARG TOMCAT_MAJOR=8
ARG TOMCAT_VERSION=8.5.99
# 多阶段构建:第一阶段用于下载和解压 Tomcat
FROM openjdk:8-jre AS tomcat-base
LABEL maintainer="Ivan Zhang"
# 在该阶段使用构建时变量,需要显式声明
ARG TOMCAT_MAJOR
ARG TOMCAT_VERSION
# 定义解压后的 Tomcat 目录路径
ENV TOMCAT_HOME /usr/local/apache-tomcat-${TOMCAT_VERSION}
WORKDIR /usr/local
# 使用构建时变量
RUN apt-get update && \
apt-get install -y curl && \
curl -L https://archive.apache.org/dist/tomcat/tomcat-${TOMCAT_MAJOR}/v${TOMCAT_VERSION}/bin/apache-tomcat-${TOMCAT_VERSION}.tar.gz \
-o apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
tar xz -f apache-tomcat-${TOMCAT_VERSION}.tar.gz && \
rm apache-tomcat-${TOMCAT_VERSION}.tar.gz
# 创建 entrypoint.sh 脚本,重命名 webapps 为 webapps.dist,并创建一个空的 webapps 目录
RUN mv ${TOMCAT_HOME}/webapps ${TOMCAT_HOME}/webapps.dist && \
mkdir ${TOMCAT_HOME}/webapps && \
echo '#!/bin/bash' > ${TOMCAT_HOME}/entrypoint.sh && \
echo 'if [ -z "$(ls -A /usr/local/tomcat/webapps)" ]; then' >> ${TOMCAT_HOME}/entrypoint.sh && \
echo ' cp -r /usr/local/tomcat/webapps.dist/* /usr/local/tomcat/webapps/' >> ${TOMCAT_HOME}/entrypoint.sh && \
echo 'fi' >> ${TOMCAT_HOME}/entrypoint.sh && \
echo 'exec ${CATALINA_HOME}/bin/catalina.sh run' >> ${TOMCAT_HOME}/entrypoint.sh && \
chmod +x ${TOMCAT_HOME}/entrypoint.sh
# 多阶段构建:最终镜像
FROM openjdk:8-jre
LABEL maintainer="Ivan Zhang"
# 使用构建时变量(需要重复定义以便在此阶段使用)
ARG TOMCAT_VERSION
ENV CATALINA_HOME /usr/local/tomcat
WORKDIR ${CATALINA_HOME}
# 从第一阶段复制解压后的 Tomcat 目录,包括 entrypoint.sh 脚本和 webapps.dist
COPY --from=tomcat-base /usr/local/apache-tomcat-${TOMCAT_VERSION} ${CATALINA_HOME}
# 设置二进制文件的执行权限
RUN chmod +x ${CATALINA_HOME}/bin/*.sh
EXPOSE 8080
ENTRYPOINT ["./entrypoint.sh"]
1. 构建 qyxr/tomcat8 镜像
1.1 Dockerfile 分析
Dockerfile 使用了多阶段构建来优化镜像大小和构建过程。以下是 Dockerfile 的主要步骤:
-
定义构建时变量:
TOMCAT_MAJOR=8
:指定 Tomcat 的主版本号。TOMCAT_VERSION=8.5.99
:指定 Tomcat 的具体版本号。
-
第一阶段:下载和解压 Tomcat:
- 使用
openjdk:8-jre
作为基础镜像。 - 安装
curl
工具以下载 Tomcat。 - 下载指定版本的 Tomcat 并解压到
/usr/local/apache-tomcat-${TOMCAT_VERSION}
目录。 - 创建
entrypoint.sh
脚本,用于在容器启动时初始化 Tomcat 的webapps
目录。
- 使用
-
第二阶段:构建最终镜像:
- 再次使用
openjdk:8-jre
作为基础镜像。 - 从第一阶段复制解压后的 Tomcat 目录和
entrypoint.sh
脚本。 - 设置 Tomcat 二进制文件的执行权限。
- 暴露 8080 端口,并设置
entrypoint.sh
为容器的入口点。
- 再次使用
1.2 构建镜像
在包含 Dockerfile 的目录中运行以下命令来构建镜像:
docker build -t qyxr/tomcat8 .
这将构建一个名为 qyxr/tomcat8
的 Docker 镜像。
2. 使用 qyxr/tomcat8 镜像
2.1 Docker Compose 配置
以下是一个使用 qyxr/tomcat8
镜像的 Docker Compose 配置示例:
services:
tomcat:
image: qyxr/tomcat8
ports:
- "8080:8080"
volumes:
- ./webapps:/usr/local/tomcat/webapps
environment:
- JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom
restart: unless-stopped
2.2 配置说明
- image: 指定使用的镜像为
qyxr/tomcat8
。 - ports: 将宿主机的 8080 端口映射到容器的 8080 端口,以便访问 Tomcat。
- volumes: 将宿主机的
./webapps
目录挂载到容器的/usr/local/tomcat/webapps
目录,以便持久化或自定义 web 应用程序。 - environment: 设置
JAVA_OPTS
环境变量,用于配置 JVM 参数。 - restart: 设置容器在意外停止时自动重启。
2.3 启动服务
在包含 docker-compose.yml
文件的目录中运行以下命令来启动服务:
docker compose up -d
这将启动 Tomcat 服务,并在后台运行。
2.4 访问 Tomcat
在浏览器中访问 http://localhost:8080
,您将看到 Tomcat 的默认欢迎页面。
3. 其他注意事项
- 自定义 webapps:通过挂载
./webapps
目录,您可以将自定义的 web 应用程序部署到 Tomcat 中。 - 日志查看:可以使用
docker compose logs -f tomcat
命令查看 Tomcat 的日志输出。 - 停止服务:使用
docker compose down
命令停止并删除服务。
通过以上步骤,您可以成功构建并使用 qyxr/tomcat8
镜像来运行 Tomcat 服务。
评论区