本文目录导读:

我来详细介绍Java容器(Docker容器)的启动方法:
基础Java容器启动案例
单文件Java应用
# Dockerfile FROM openjdk:11-jre-slim COPY HelloWorld.java /app/ WORKDIR /app RUN javac HelloWorld.java CMD ["java", "HelloWorld"]
# 构建和启动 docker build -t java-hello . docker run java-hello
Spring Boot应用
# Dockerfile FROM openjdk:11-jre-slim COPY target/myapp.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]
# 构建镜像 docker build -t my-spring-app . # 启动容器 docker run -d -p 8080:8080 --name my-app my-spring-app
交互式运行
运行Java交互shell
# 以交互模式运行 docker run -it openjdk:11-jre-slim /bin/bash # 在容器内执行Java命令 $ java -version $ jshell
运行带参数的Java程序
# 传递JVM参数 docker run -e JAVA_OPTS="-Xmx512m -Xms256m" -p 8080:8080 my-java-app # 传递应用参数 docker run my-java-app --server.port=9090 --spring.profiles.active=prod
完整项目案例
多阶段构建
# 第一阶段:编译 FROM maven:3.8-openjdk-11 AS build COPY pom.xml /app/ COPY src /app/src/ RUN mvn clean package -DskipTests # 第二阶段:运行 FROM openjdk:11-jre-slim COPY --from=build /app/target/*.jar /app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "/app.jar"]
docker-compose启动
# docker-compose.yml
version: '3.8'
services:
java-app:
build: .
ports:
- "8080:8080"
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
- JAVA_OPTS=-Xmx512m
volumes:
- ./logs:/app/logs
depends_on:
- db
restart: unless-stopped
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: mydb
# 使用docker-compose启动 docker-compose up -d # 查看日志 docker-compose logs -f java-app
调试模式启动
开启远程调试
# Dockerfile FROM openjdk:11-jre-slim COPY app.jar /app.jar EXPOSE 8080 5005 ENTRYPOINT ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005", "-jar", "/app.jar"]
# 启动调试 docker run -d -p 8080:8080 -p 5005:5005 debug-java-app
使用Volume热部署
# 开发环境使用Volume挂载 docker run -d \ -p 8080:8080 \ -v $(pwd)/target:/app \ -e SPRING_DEVTOOLS_REMOTE_SECRET=mysecret \ java-app:dev
生产环境启动优化
资源限制
# 限制CPU和内存 docker run -d \ --cpus="1.5" \ --memory="1g" \ --memory-swap="2g" \ -p 8080:8080 \ --restart=always \ my-java-app
健康检查
# Dockerfile中添加健康检查 HEALTHCHECK --interval=30s --timeout=3s --retries=3 \ CMD curl -f http://localhost:8080/actuator/health || exit 1
快速启动脚本
#!/bin/bash
# start-java-container.sh
APP_NAME="myapp"
APP_VERSION="1.0.0"
JAR_FILE="target/${APP_NAME}-${APP_VERSION}.jar"
# 构建镜像
docker build -t ${APP_NAME}:${APP_VERSION} .
# 停止旧容器
docker stop ${APP_NAME} 2>/dev/null || true
docker rm ${APP_NAME} 2>/dev/null || true
# 启动新容器
docker run -d \
--name ${APP_NAME} \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e JAVA_OPTS="-Xms256m -Xmx512m" \
-v /var/log/${APP_NAME}:/app/logs \
--restart=always \
${APP_NAME}:${APP_VERSION}
# 查看日志
docker logs -f ${APP_NAME}
常见问题排查
# 查看容器日志 docker logs -f <container_id> # 进入容器内部 docker exec -it <container_id> /bin/bash # 检查进程 docker exec <container_id> ps aux | grep java # 查看内存使用 docker stats <container_id> # 查看JVM信息 docker exec <container_id> jcmd 1 VM.info
启动命令汇总
| 场景 | 命令 |
|---|---|
| 前台运行 | docker run my-java-app |
| 后台运行 | docker run -d my-java-app |
| 端口映射 | docker run -p 8080:8080 my-java-app |
| 带环境变量 | docker run -e KEY=VALUE my-java-app |
| 限制资源 | docker run --memory="512m" --cpus="1" my-java-app |
| 自动重启 | docker run --restart=unless-stopped my-java-app |
| 交互模式 | docker run -it openjdk:11 /bin/bash |
根据你的具体需求选择合适的启动方式即可。