Docker部署SpringBoot+MySql项目

首先spring项目yml配置如下

server:
  port: 8080
spring:
  datasource:
    # MySQL 配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 11111

服务器上使用docker运行了mysql

root@VM-0-15-ubuntu:~# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
942b92d1472b        mysql               "docker-entrypoint.s…"   2 days ago          Up 2 days           0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

这时候我们启动spring项目的时候就遇到第一个问题,众所周知docker运行容器的时候每个容器相互独立互不干扰的,那么怎么让我们的项目使用mysql就是一个问题,当然docker提供了link容器:

#补充docker命令说明:
  -v 主机的目录作为容器的数据卷
  -e 设置启动容器是的环境变量
  -t 分配terminal终端
  --name 设置容器名称
  -p  端口映射,格式为:主机(宿主)端口:容器端口
  -link 添加链接到另一个容器

当我们使用docker run -d --name yourproject --link mysql:mysql -p 8080:8080 yourproject运行我们的项目时会发现日志打印com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure,数据库连接失败从而项目启动失败。

在使用localhost:3306或者127.0.0.1:3306在docker容器中出现上面的错误:这是由于docker容器随机映射导致。 使用–link之后,docker会在子容器(这里的spring boot容器)的/etc/hosts中将父容器(这里的mysql容器)与父容器的ip地址绑定,所以我们要使用mysql:3306来访问数据库。 把application.properties中数据库url改为如下配置就能正常启动了:

server:
  port: 8080
spring:
  datasource:
    # MySQL 配置
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://mysql:3306/db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root
    password: 11111

需要注意的是通过这种方式启动打包时可能会因为测试类的原因导致打包失败,这时候我们只需要运行maven打包时添加`-Dmaven.test.skip=true`屏蔽测试类就行了。

编辑于 2021-11-05 10:46