在 Docker 中部署SpringBoot 程序
docker 国内镜像源
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://mirrors.tuna.tsinghua.edu.cn",
"http://mirrors.sohu.com",
"https://ustc-edu-cn.mirror.aliyuncs.com",
"https://ccr.ccs.tencentyun.com",
"https://docker.m.daocloud.io",
"https://docker.awsl9527.cn"
]
单独部署
首先我们需要搭建一个网段,让 java程序能够通向 mysql
# 创建网段
docker network create java-mysql-network
# 查看网络中的容器
docker network inspect java-mysql-network
# 已存在容器加入网段
docker network connect java-mysql-network jarSS
创建 mysql
docker run --name MyMysql -e MYSQL_ROOT_PASSWORD=1234 -e TZ=Asia/Shanghai -p 3306:3306 --network java-mysql-network -d mysql
创建 SpringBoot 程序
创建 dockerfile 文件构建
由于我部署的这个java程序,用到了 hutool 的验证码,所以需要安装字体。
# 使用OpenJDK 17作为基础镜像
FROM openjdk:17-jdk-alpine
# 设置工作目录
WORKDIR /app
# 安装字体
# run apk update && apk add --no-cache ttf-dejavu
# 安装时区
# run apk add --no-cache tzdata
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 将JAR文件复制到容器中
COPY demo-0.0.1-SNAPSHOT.jar app.jar
# 暴露Spring Boot应用运行的端口
EXPOSE 7777
# 启动Spring Boot应用
ENTRYPOINT ["java", "-jar", "app.jar"]
构建
docker build -t 镜像名 .
运行容器
docker run --name 容器名 -p 82:7777 --network java-mysql-network -d 镜像名
SpringBoot 程序配置 mysql 地址
spring:
datasource:
type: com.mysql.cj.jdbc.MysqlDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://MyMysql/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: 1234
compose 部署
容器不存在会重新创建新的容器。
version: '3.8'
services:
work:
image: work # java 程序的 Docker 镜像
container_name: MyWork # 指定容器名称为 'MyWork'
depends_on:
- mysql # 依赖于 MySQL 服务,确保 MySQL 服务先启动
- redis # 依赖于 Redis 服务,确保 Redis 服务先启动
restart: always # 无论退出代码是什么,始终重新启动容器
mysql:
image: mysql # 使用官方 MySQL Docker 镜像
container_name: MyMysql
environment:
MYSQL_ROOT_PASSWORD: 1234 # 设置 MySQL root 用户的密码
ports:
- "3306:3306" # 映射本地主机的 3306 端口到容器的 3306 端口
volumes:
- ./mysql/data:/var/lib/mysql # 数据
- ./mysql/my.cnf:/etc/my.cnf # 配置
- ./mysql/logs:/var/log # 日志
- ./mysql/init:/docker-entrypoint-initdb.d # 初始化数据
restart: always
redis:
image: redis # 使用官方 Redis Docker 镜像
container_name: MyRedis # 指定容器名称为 'MyRedis'
ports:
- "6379:6379" # 映射本地主机的 6379 端口到容器的 6379 端口
environment:
REDIS_PASSWORD: 1234 # 设置 Redis 的密码
volumes:
- ./redis/data:/data
- ./redis/redis.conf:/usr/local/etc/redis/redis.conf
command: ["redis-server", "/usr/local/etc/redis/redis.conf"]
restart: always
nginx:
image: nginx # 使用官方 Nginx Docker 镜像
container_name: MyNginx # 指定容器名称为 'MyNginx'
ports:
- "82:82" # 映射本地主机的 82 端口到容器的 82 端口
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf # 挂载自定义 Nginx 配置文件到容器内
- ./nginx/html:/usr/share/nginx/html # 挂载自定义 HTML 文件到容器内
depends_on:
- work # 依赖于 'work' 服务,确保 'work' 服务先启动
restart: always # 始终重新启动容器
相关命令
数据卷相关,什么是数据卷,存放在宿主机的数据卷,和目录挂载很像,但是意义不一样,由docker创建。