You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将Spring Boot+MySQL从Docker Compose转为单镜像部署至EKS测试环境

把Spring Boot + MySQL的Docker Compose配置转为单Dockerfile并部署到EKS(POC环境)

前置说明

虽然POC环境可以尝试单镜像运行两个服务,但容器最佳实践要求一个容器对应一个进程,生产环境绝对不建议这么做。以下方案仅针对你的POC需求实现。


步骤1:编写单镜像Dockerfile

基于带Java的Ubuntu基础镜像,安装MySQL服务,复制Spring Boot应用与启动脚本,实现两个服务的协同启动。

示例Dockerfile

# 选择Ubuntu+OpenJDK 17作为基础镜像
FROM ubuntu:22.04

# 设置环境变量,避免交互安装提示,同时配置数据库和Spring Boot参数
ENV DEBIAN_FRONTEND=noninteractive
ENV MYSQL_ROOT_PASSWORD=poc-root-pass
ENV MYSQL_DATABASE=spring_poc_db
ENV MYSQL_USER=poc_db_user
ENV MYSQL_PASSWORD=poc_db_pass
ENV SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/spring_poc_db?useSSL=false&serverTimezone=UTC
ENV SPRING_DATASOURCE_USERNAME=poc_db_user
ENV SPRING_DATASOURCE_PASSWORD=poc_db_pass

# 安装MySQL、OpenJDK及必要工具
RUN apt-get update && \
    apt-get install -y mysql-server openjdk-17-jdk && \
    # 清理缓存减小镜像体积
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# 复制Spring Boot应用jar包(请替换为你的实际jar路径)
COPY target/spring-boot-poc.jar /app/spring-boot-poc.jar

# 复制自定义启动脚本
COPY start-services.sh /app/start-services.sh
RUN chmod +x /app/start-services.sh

# 暴露应用和数据库端口
EXPOSE 8080 3306

# 执行启动脚本
CMD ["/app/start-services.sh"]

配套启动脚本start-services.sh

#!/bin/bash

# 启动MySQL服务
service mysql start

# 等待MySQL完成初始化(POC环境简单延迟,生产环境建议用脚本检查端口连通性)
sleep 10

# 初始化数据库与用户(避免重复创建)
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DATABASE;"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "CREATE USER IF NOT EXISTS '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD';"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* TO '$MYSQL_USER'@'%';"
mysql -u root -p"$MYSQL_ROOT_PASSWORD" -e "FLUSH PRIVILEGES;"

# 启动Spring Boot应用
java -jar /app/spring-boot-poc.jar

步骤2:构建并推送镜像到ECR

因为要部署到EKS,需要将镜像推送到AWS ECR(或其他容器仓库):

  1. 构建镜像:
docker build -t spring-mysql-poc:v1 .
  1. 登录AWS ECR(替换为你的区域和账号ID):
aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com
  1. 打标签并推送:
docker tag spring-mysql-poc:v1 123456789012.dkr.ecr.us-east-1.amazonaws.com/spring-mysql-poc:v1
docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/spring-mysql-poc:v1

步骤3:部署到EKS

编写Kubernetes部署配置文件poc-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-mysql-poc
  labels:
    app: spring-mysql-poc
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-mysql-poc
  template:
    metadata:
      labels:
        app: spring-mysql-poc
    spec:
      containers:
      - name: spring-mysql-poc
        image: 123456789012.dkr.ecr.us-east-1.amazonaws.com/spring-mysql-poc:v1
        ports:
        - containerPort: 8080
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "poc-root-pass"
        - name: MYSQL_DATABASE
          value: "spring_poc_db"
        - name: MYSQL_USER
          value: "poc_db_user"
        - name: MYSQL_PASSWORD
          value: "poc_db_pass"
        # POC环境资源配置,可根据实际调整
        resources:
          requests:
            cpu: "500m"
            memory: "1Gi"
          limits:
            cpu: "1"
            memory: "2Gi"
---
apiVersion: v1
kind: Service
metadata:
  name: spring-mysql-poc-service
spec:
  type: LoadBalancer
  selector:
    app: spring-mysql-poc
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

执行部署命令:

kubectl apply -f poc-deployment.yaml

查看应用外部访问地址:

kubectl get service spring-mysql-poc-service

使用返回的EXTERNAL-IP即可访问Spring Boot应用。


POC环境注意点

  • 单镜像内两个服务的日志会混合输出,排查问题时需自行过滤
  • MySQL数据存储在容器内部,容器销毁后数据会丢失,若需持久化需添加Kubernetes PersistentVolume
  • 需确保Pod分配的资源足够支撑两个服务运行,避免资源抢占导致崩溃

内容的提问来源于stack exchange,提问作者gowthamiviswa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 04:35:55