Docker容器化Spring Boot:从构建到部署的完整实战
<h2>前言</h2><p>容器化部署已经成为现代Java应用的标准配置。本文用完整的实战案例,带你从零构建Spring Boot应用的Docker镜像,并实现生产级部署。</p>
<h2>一、环境准备</h2>
<ul>
<li>Docker Desktop (Windows/Mac) 或 Docker Engine (Linux)</li>
<li>Spring Boot 3.x 项目</li>
<li>JDK 17+</li>
</ul>
<h2>二、项目结构</h2>
<pre><code>my-springboot-app/
├── src/
├── Dockerfile # Docker配置文件
├── docker-compose.yml # 编排文件
└── .dockerignore # 忽略文件</code></pre>
<h2>三、编写Dockerfile</h2>
<pre><code># 多阶段构建:构建阶段
FROM maven:3.9-eclipse-temurin-17 AS builder
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests
# 运行阶段
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
# 创建非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 复制jar包
COPY --from=builder /app/target/*.jar app.jar
# 设置权限
RUN chown -R appuser:appgroup /app
USER appuser
# 环境变量
ENV JAVA_OPTS="-Xms256m -Xmx512m"
ENV SPRING_PROFILES_ACTIVE=prod
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s \
CMD wget --quiet --tries=1 --spider http://localhost:8080/actuator/health || exit 1
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]</code></pre>
<h2>四、.dockerignore文件</h2>
<pre><code>.git
.gitignore
target/
*.md
Dockerfile
docker-compose.yml
*.log
.idea/
*.iml</code></pre>
<h2>五、构建镜像</h2>
<pre><code># 构建镜像
docker build -t myapp:latest .
# 查看镜像
docker images | grep myapp
# 运行容器
docker run -d -p 8080:8080 --name myapp myapp:latest
# 查看日志
docker logs -f myapp
# 进入容器
docker exec -it myapp sh</code></pre>
<h2>六、使用docker-compose编排</h2>
<pre><code>version: '3.8'
services:
app:
build: .
container_name: my-springboot-app
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=secret
depends_on:
db:
condition: service_healthy
restart: unless-stopped
networks:
- app-network
db:
image: mysql:8.0
container_name: mysql8
environment:
MYSQL_ROOT_PASSWORD: secret
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
volumes:
mysql-data:
networks:
app-network:
driver: bridge</code></pre>
<h2>七、优化技巧</h2>
<h3>1. 使用阿里云镜像加速</h3>
<pre><code># /etc/docker/daemon.json
{
"registry-mirrors": ["https://mirror.ccs.tencentyun.com"]
}</code></pre>
<h3>2. 缩小镜像体积</h3>
<ul>
<li>使用 alpine 基础镜像</li>
<li>多阶段构建分离编译和运行环境</li>
<li>使用 .dockerignore 排除无关文件</li>
</ul>
<h3>3. 安全加固</h3>
<ul>
<li>使用非root用户运行</li>
<li>只暴露必要端口</li>
<li>敏感信息使用Docker Secret</li>
</ul>
<h2>八、常见问题解决</h2>
<p><strong>Q: 容器内无法连接宿主机数据库?</strong></p>
<p>使用 host.docker.internal 代替 localhost</p>
<pre><code>jdbc:mysql://host.docker.internal:3306/mydb</code></pre>
<p><strong>Q: 内存溢出?</strong></p>
<p>在Dockerfile中设置JVM堆内存限制</p>
<pre><code>ENV JAVA_OPTS="-Xms256m -Xmx512m -XX:+UseG1GC"</code></pre>
<h2>总结</h2>
<p>通过本文,你已经掌握了Spring Boot应用Docker容器化的完整流程。关键点:多阶段构建减少镜像体积、非root用户提升安全性、docker-compose实现服务编排。</p>
<p><em>本文由AI辅助创作。</em></p>
</div>
<div id="MySignature" role="contentinfo">
---
📌 **如果觉得文章对你有帮助,欢迎点赞👍收藏⭐!**
💬 有问题或建议?欢迎在评论区留言讨论~
🔗 更多技术干货请关注作者:弥烟袅绕
📚 本文地址:https://www.cnblogs.com/czlws/p/19775959<br><br>
来源:https://www.cnblogs.com/czlws/p/19775959
頁:
[1]