使用Docker Compose运行Springboot遇到的问题

        为了便于部署,使用了docker去打包了redis,mysql,emqx.es和业务服务的镜像,在此期间遇到了一系列问题,做个记录。

1. SpringBoot服务yml修改:

        对于本地应用,可以用127.0.0.1访问本地docker,但是使用docker compose打包后的应用,需要修改一下yml的配置,比如mysql在yml中的配置为:

    host: mysql
    url: jdbc:mysql://${spring.datasource.host}:3306/protocol?useSSL=false&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource

这里的host会在docker compose中进行配置,相当于拿到了容器的ip:

services:
  mysql:
    container_name: mysql
    image: mikuneko/mysql:3.0
    restart: unless-stopped
    tty: true
    ports:
      - "3320:3306"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: 123456
      MYSQL_DATABASE: protocol
    volumes:
      - mysql:/var/lib/mysql/
    healthcheck:
      test: mysql ${MYSQL_DATABASE} --user='root' --password='${MYSQL_ROOT_PASSWORD}' --silent --execute "SELECT 1;"
      interval: 30s
      timeout: 10s
      retries: 5

服务访问3306,与映射到外部的3320无关,相当于内网访问.

2. SpringBoot服务docekr打包:

 对于springboot的模块化应用,使用dockerfile打包成镜像,并上传到自己的docker源。

docker file如下:

## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
FROM eclipse-temurin:8-jre

## 创建目录,并使用它作为工作目录
RUN mkdir -p /protocol
WORKDIR /protocol-center
## 将后端项目的 Jar 文件,复制到镜像中
COPY ./target/protocol-center-1.0.0-SNAPSHOT.jar app.jar

ENV AUTO_RUN_DIR /sql
ENV INSTALL_DB_SQL protocol.sql

## 设置 TZ 时区
ENV TZ=Asia/Shanghais
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV JAVA_OPTS="-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom"

## 应用参数
ENV ARGS=""

## 暴露后端项目的 48080 端口
EXPOSE 8089

## 启动后端项目
CMD java ${JAVA_OPTS} -jar app.jar $ARGS

然后将dockerfile放在springboot启动类的文件夹下,并且使用maven打包插件对项目进行打包。

使用命令:

// 后面有空格加. 必要
docker build -t Docker用户名/镜像名:版本号 .

打包成功后通过:

docker images

查看镜像是否成功打包。

通过:

docker push Docker用户名/镜像名:版本号

上传镜像到个人服务器。

3.Docker Compose连接和启动顺序:

docekr compose会自动将yml文件下的服务连接到同一个虚拟网卡来实现服务通信。 

  server:
    container_name: protocol
    image: mikuneko/repo:4.0
    restart: unless-stopped
    ports:
      - "8089:8089"
    environment:
      SPRING_PROFILES_ACTIVE: prod
    links:
      - mysql
      - redis
      - emqx
      - elasticsearch
    depends_on:
      - mysql
      - redis
      - emqx
      - elasticsearch

使用links做服务连接,depends_on 来做服务的先后加载。

4. mysql数据库实现自动导入:

使用navicat做一个需要导入的数据库的sql文件,并且编写mysql的dockerfile:

#基础镜像使用 mysql:latest
FROM mysql:8.0.38
 
#把要执行的sql文件放到/docker-entrypoint-initdb.d/目录下,容器会自动执行这个sql
COPY protocol.sql /docker-entrypoint-initdb.d/protocol.sql
COPY protocol.sql /mysql/protocol.sql

        为了保险放了两个地方,放在/docker-entrypoint-initdb.d/目录下的sql一般来说会在创建mysql容器的时候自动执行,如果没有就在mql下去手动导入数据,然后通过docker创建自己的mysql image使用。

5. redis实现外部访问:

当需要redis实现外部访问的话,需要去创建一个redis的config文件,然后使用dockerfile去打包起来:

#基础镜像使用 mysql:latest
FROM redis:7.4.0
 
#把要执行的conf文件放到/usr/local/etc/redis/redis.conf目录下
COPY redis.conf /usr/local/etc/redis/redis.conf

然后通过docker创建自己的redis image使用。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PigeonEssence

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值