为了便于部署,使用了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使用。