在腾讯轻量应用服务器(Lighthouse)上部署 Spring Boot 应用并使用 Docker 容器化,是一个非常标准且高效的做法。这种方式不仅能简化环境依赖管理,还能实现快速迁移和弹性扩展。
以下是完整的操作指南,涵盖了从购买服务器到最终运行容器的全过程:
1. 准备工作
- 购买/创建实例:登录腾讯云控制台,创建一台“轻量应用服务器”。
- 镜像选择:建议选择 Ubuntu 20.04/22.04 LTS 或 Debian 11/12。这些系统对 Docker 支持良好。
- 配置:根据应用需求选择 CPU 和内存(Spring Boot 建议至少 1GB 内存)。
- 网络:确保开通了对应的端口(如 8080),或者后续通过安全组放行。
- 本地打包:在你的开发电脑上将 Spring Boot 项目打包成独立的 JAR 包(使用
mvn clean package或gradle build)。- 确保项目是“可执行 jar"(即包含内嵌 Tomcat),通常不需要额外配置
spring-boot-maven-plugin的executable属性,默认即可。
- 确保项目是“可执行 jar"(即包含内嵌 Tomcat),通常不需要额外配置
2. 连接服务器并安装 Docker
通过 SSH 工具(如 Xshell、FinalShell、Terminal)登录到你的轻量应用服务器。
2.1 更新系统
sudo apt update && sudo apt upgrade -y
2.2 安装 Docker
腾讯云镜像源通常已经优化过,可以直接安装:
# 安装依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
# 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置仓库
echo
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
2.3 验证安装并赋予权限
docker --version
sudo usermod -aG docker $USER
newgrp docker # 刷新用户组,无需重启服务器
3. 构建与上传镜像方案
这里推荐两种主流方案:方案 A(直接上传 Jar 构建) 适合简单场景;方案 B(本地构建后推送) 适合生产环境规范。
方案 A:直接在服务器上构建镜像(适合测试/小型项目)
如果你不想在本地写复杂的 Dockerfile,可以直接把 JAR 包传上去构建。
-
上传 JAR 包:
scp your-app.jar root@your-server-ip:/root/ -
编写 Dockerfile:
在/root目录下创建文件Dockerfile:# 基于官方 OpenJDK 镜像 (版本需与编译时一致,如 17) FROM openjdk:17-jdk-slim # 设置工作目录 WORKDIR /app # 复制 jar 包 COPY your-app.jar app.jar # 暴露端口 (根据你的 application.yml 配置) EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"] -
构建镜像:
cd /root docker build -t my-springboot-app .
方案 B:本地构建并推送到私有仓库(推荐生产使用)
- 编写本地 Dockerfile(逻辑同上)。
- 构建镜像:
docker build -t my-springboot-app . - 登录腾讯云镜像仓库(如果要用 TCR)或直接打标签:
# 假设没有私有仓库,仅作为本地标签 docker tag my-springboot-app latest - 传输镜像:
由于 Docker 镜像较大,直接scp二进制数据不现实。建议使用docker save导出 tar 包再传输,或者使用docker push/pull(需配置 TCR 私有仓库)。- 导出:
docker save -o app.tar my-springboot-app - 上传:
scp app.tar root@server_ip:/tmp/ - 导入:在服务器上
docker load -i /tmp/app.tar
- 导出:
4. 运行容器
假设你已经有了名为 my-springboot-app 的镜像。
4.1 基础运行命令
docker run -d
--name springboot-container
-p 8080:8080
--restart always
my-springboot-app
-d: 后台运行。-p 8080:8080: 将宿主机的 8080 映射到容器内的 8080。--restart always: 容器崩溃或重启后自动恢复。
4.2 处理数据库连接(重要)
如果你的 Spring Boot 需要连接 MySQL 等数据库,有两种方式:
- 连接公网 IP 的数据库:在云数据库控制台中配置白名单,允许轻量服务器的公网 IP 访问。
- 连接宿主机内部数据库:使用
--network=host模式(慎用,端口冲突风险)或配置 Docker 网络。
进阶:同时启动 MySQL 和 Spring Boot
推荐使用 docker-compose 编排,方便管理多个服务。
在项目根目录创建 docker-compose.yml:
version: '3'
services:
app:
image: my-springboot-app
container_name: springboot-app
ports:
- "8080:8080"
restart: always
environment:
- SPRING_DATASOURCE_URL=jdbc:mysql://db-host:3306/mydb?useSSL=false
- SPRING_DATASOURCE_USERNAME=root
- SPRING_DATASOURCE_PASSWORD=yourpassword
depends_on:
- db
db:
image: mysql:8.0
container_name: mysql-db
environment:
MYSQL_ROOT_PASSWORD: yourpassword
MYSQL_DATABASE: mydb
ports:
- "3306:3306"
volumes:
- ./mysql-data:/var/lib/mysql
restart: always
启动命令:
docker-compose up -d
5. 安全组配置(关键步骤)
仅仅在容器里开了端口是不够的,必须放行腾讯云防火墙。
- 登录腾讯云控制台 -> 轻量应用服务器。
- 点击你的实例 ID,进入详情页。
- 找到 安全组 标签页,点击 修改规则。
- 添加一条 入方向 规则:
- 协议端口:TCP
- 端口范围:8080 (或者你自定义的端口)
- 授权对象:0.0.0.0/0 (允许所有 IP,生产环境建议限制为特定 IP)
- 保存规则。
6. 常见问题排查
- 无法访问应用:
- 检查安全组是否放行了端口。
- 检查 Spring Boot 配置文件 (
application.yml) 中server.address是否为0.0.0.0(Docker 默认监听所有网卡,但显式指定更安全)。 - 查看日志:
docker logs springboot-container。
- 内存不足:
- Spring Boot 启动报错
OutOfMemoryError?在启动命令中增加 JVM 参数:docker run ... -e JAVA_OPTS="-Xms512m -Xmx512m" my-springboot-app或者修改 Dockerfile 中的
ENTRYPOINT加入该参数。
- Spring Boot 启动报错
- 时间不同步:
- 容器内时间可能与服务器不一致,导致 JWT 过期等问题。建议在 Dockerfile 中安装 NTP 或同步时间。
通过以上步骤,你就可以在腾讯轻量应用服务器上成功运行一个基于 Docker 的 Spring Boot 应用了。
云服务器