将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(或其他容器仓库):
- 构建镜像:
docker build -t spring-mysql-poc:v1 .
- 登录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
- 打标签并推送:
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
相关产品推荐
相关产品推荐

