Appearance
部署 Tomcat
快速启动
bash
docker run -d \
--name tomcat \
--restart unless-stopped \
-p 8080:8080 \
tomcat:10-jre17-temurin-jammy
# 访问
curl http://localhost:8080部署 WAR 包
bash
# 方式一:挂载 webapps 目录
docker run -d \
--name tomcat \
-p 8080:8080 \
-v $(pwd)/webapps:/usr/local/tomcat/webapps \
tomcat:10-jre17
# 方式二:将 WAR 包复制到运行中的容器
docker cp myapp.war tomcat:/usr/local/tomcat/webapps/
# 方式三:在 Dockerfile 中包含 WAR 包Dockerfile(含 WAR 包)
dockerfile
FROM tomcat:10-jre17-temurin-alpine
# 清除默认应用
RUN rm -rf /usr/local/tomcat/webapps/*
# 添加 WAR 包(部署为 ROOT 即根路径)
COPY target/myapp.war /usr/local/tomcat/webapps/ROOT.war
# 自定义配置
COPY server.xml /usr/local/tomcat/conf/server.xml
EXPOSE 8080
CMD ["catalina.sh", "run"]server.xml 配置
xml
<!-- server.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
maxThreads="200"
minSpareThreads="10"
URIEncoding="UTF-8"
redirectPort="8443"/>
<Engine name="Catalina" defaultHost="localhost">
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
</Host>
</Engine>
</Service>
</Server>Spring Boot 应用(推荐方式)
Spring Boot 内嵌 Tomcat,直接运行 JAR 包即可,不需要单独部署 Tomcat:
dockerfile
# 多阶段构建
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /build
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:17-jre-alpine AS runtime
RUN addgroup -S spring && adduser -S spring -G spring
WORKDIR /app
COPY --from=builder /build/target/app.jar app.jar
USER spring
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD wget -qO- http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", \
"-Xms256m", \
"-Xmx512m", \
"-Djava.security.egd=file:/dev/./urandom", \
"-jar", "app.jar"]Docker Compose
yaml
services:
app:
build: .
restart: unless-stopped
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/mydb
SPRING_DATASOURCE_USERNAME: myuser
SPRING_DATASOURCE_PASSWORD: mypassword
SPRING_PROFILES_ACTIVE: production
depends_on:
mysql:
condition: service_healthy
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: mydb
MYSQL_USER: myuser
MYSQL_PASSWORD: mypassword
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping"]
interval: 10s
retries: 5
volumes:
mysql-data: