无法从 docker 容器连接到 Localhost Mysql

Posted

技术标签:

【中文标题】无法从 docker 容器连接到 Localhost Mysql【英文标题】:Not able to connect to Localhost Mysql from docker container 【发布时间】:2019-04-01 17:52:18 【问题描述】:

我已经使用 docker 工具箱在 Windows 机器上安装了 docker。 我还在我的 Windows 机器上安装了 mysql,并且服务器在端口 3306 上运行(localhost - 127.0.0.1 - 在 docker 机器之外) 我在名为“micra-network”的docker网络中运行名为“micra-workq-svc”的docker容器内的sprint启动应用程序 我希望在 docker 内运行的应用程序连接到这个本地主机。 我花了几个小时在谷歌上搜索,但没有一个链接可以帮助我解决这个问题。 我尝试使用以下命令运行 mysql 映像:

docker run  --name micra-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<pass> -e MYSQL_DATABASE=<db name> -e MYSQL_USER=<roo user> -e MYSQL_PASSWORD=<root password >--net=micra-network mysql:latest

我正在使用以下命令来运行我的容器:

docker run -e "SPRING_PROFILES_ACTIVE=dev" --network micra-network --env "eureka.client.enabled=true"  --env "eureka.host=micra-eureka-server"  --env "eureka.instance.preferIpAddress: true"  --env "eureka.client.serviceUrl.defaultZone=http://micra-eureka-server:8761/eureka"  --env DATABASE_HOST=127.0.0.1 --env DATABASE_PORT=3306 --env DATABASE_NAME=<db name> --env DATABASE_USER=<db user> --env DATABASE_PASSWORD=<db password> --expose 8083 -p 8083:8083 --name micra-workq-svc --link micra-mysql  -t  <my docker service image>

这是 application.properties 在 Spring Boot 中的样子:

spring:
 datasource:
  password: $DATABASE_PASSWORD
  url: jdbc:mysql://$DATABASE_HOST:$DATABASE_PORT/$DATABASE_NAME
  username: $DATABASE_USER

当我运行我的服务时,出现以下错误:

Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

我的docker机器ip是192.168.99.100.

【问题讨论】:

用你机器的ip试试(192.168.xxx.xxx),你还需要更新你的mysql conf,绑定地址0.0.0.0 @Bughunter - 不,它不起作用。我将环境属性 DATABASE_HOST 更改为 192.168.99.100(我的 docker 机器 ip)。 如果您在容器中同时运行 Java 和 DB,则可以通过它们的名称访问它们。本地主机不会工作,因为它是相对于容器而言的。 @Arman - 我尝试使用上述命令在容器内运行 mysql,并将 DATABASE_HOST 更改为容器名称“micra-mysql”,但出现未知主机异常。另请注意,应用程序正在 docker 网络 'mira-network' 中运行。 在第二个视图中,在您的第一个运行命令中,您使用了“--net=micra-network”,在第二个视图中使用了“--network micra-network”。确定他们在同一个网络上吗?使用 docker-compose 首先摆脱了这些问题,但似乎并不能解决您的用例。 【参考方案1】:

只需以管理员身份清理您的容器和映像,执行此命令 docker prune -a ,输入 DATABASE_HOST=micra-mysql 并再次运行。

【讨论】:

伙计,这对本地主机有用吗? DATABASE_HOST=本地主机 它可以在 docker-compose 上运行吗?在 docker 环境中的内部网络上。 @Miltex 由于您使用docker compose 意味着您需要指定name container,那么这将适用于docker 上的容器上下文。在您的环境中将采用localhost 内部。 我有 mysql 和一个在 docker 上运行的应用程序。我希望应用程序连接到 docker 内的 mysql localhost。 你告诉我,如果我把 docker-compose 放入 container_name: localhost 属性将起作用。

以上是关于无法从 docker 容器连接到 Localhost Mysql的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Django 应用程序从容器连接到 MySQL docker 容器

无法从 docker 容器连接到数据库 [重复]

无法从 docker 容器连接到 Localhost Mysql

无法从 golang 连接到 docker postgres 容器

无法从 docker 容器内的 Spring Boot 连接到 Redis

无法从 docker 容器连接到 SQL Server