Skip to content

部署 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: