Docker 部署 SpringBoot + mysql 程序

114 阅读2分钟

在 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创建。

image.png