首先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