背景

最近在弄dockers的集成部署,平常我们用到数据库都是远程的,部署在阿里云或者其他云上
最近接到的需求是需要完整的跟项目一起部署在docker 上面,并且通过读取env配置的方式进行yml的配置
但是今天遇到了一个问题,springboot 项目与MySQL同时部署后,访问不到数据库,并且通过本机的链接工具却能连上,

0RdEz4.png

解决方案

其实这里的错误重点是 Caused by: java.net.NoRouteToHostException: No route to host (Host unreachable)

这句 主机不可达
这就知道了其实就是springboot 无法访问到mysql
然后通过百度知道了docker容器之间的网咯是相互独立的,如果要联通必须通过link 去链接
我的项目是通过docker compose启动的,所以在yml中可以这样写

version: '3.1'

services:
  mysql:
    container_name: mysql
    image: mysql/mysql-server:5.7
    ports:
      - "3306:3306"
    environment:
      MYSQL_DATABASE: ${MYSQL_DATABASE}
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_ROOT_HOST: '%'
    restart: always
    volumes:
      - "./data/dialog-console-data/mysql:/var/lib/mysql"
      - "./data/mysql/config/my.cnf:/etc/my.cnf"
      - "./data/mysql/init:/docker-entrypoint-initdb.d/"
   
  dsconsole:
    container_name:xxxxx
    image: xxxxx
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "8888:8888"
    environment:
    ## 读取 env配置 
      MYSQL_URL: ${MYSQL_URL}
      MYSQL_USERNAME: ${MYSQL_USERNAME}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
      MINIO_OOS_URL: ${MINIO_OOS_URL}
      MINIO_OOS_PORT: ${MINIO_OOS_PORT}
      MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
      MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
      MINIO_BUCKET_NAME: ${MINIO_BUCKET_NAME}
    restart: always
    depends_on:
      - mysql
    ## 建立连接
    links:
      - mysql
      

成功启动后可以试试 springboot 容易能不能ping通MySQL

 docker exec -it xxxx ping mysql

0RBkJf.png

然后,最重要的一点,application.yml 中的配置我最开始填的是ip,但结果是访问不了的,按理来说是可以的,后面我将ip替换成了容器名称,这就就能访问

0RBR0A.png

最终解决