无法从Docker容器连接到数据库

时间:2019-06-29 23:48:16

标签: mysql docker

我在服务器和dockerized项目上安装了MySQL服务器,该数据库是不公开访问的,只能从服务器内部访问。本地非dockerized应用也使用它。 我想从docker内部连接到它,并且保持不公开访问,我尝试了172.17.0.1,但连接被拒绝。 当前的bind_address是127.0.0.1,您建议bind_address是??

2 个答案:

答案 0 :(得分:0)

您可以通过host网络模式运行该应用程序,这将使容器能够连接到主服务器(docker主机)的本地主机,同时保持bind-address指向{{1 }}。

因此,如果您使用的是docker cli,则需要像这样运行应用程序:

127.0.0.1

如果使用docker run --network=host myappimage ,则将在您的服务中使用

docker-compose

答案 1 :(得分:0)

尝试更好地描述我对您的问题的理解:

  
      
  1. 您有一个安装了mysql的主机(未进行dockerized,但直接   在您的主机上)

  2.   
  3. 您的主机中有一些客户端应用程序连接到该MySQL   使用您的 localhost IP和mysql端口(假设:   默认为127.0.0.1:3306)

  4.   
  5. 现在,您使用另一个应用程序(   容器),您希望将其与MySQL服务器连接,   它仍在您的主机中运行,可以在本地访问,但 out   您的新容器(或其他任何容器)

  6.   
  7. 您希望使您的dockerized服务保持隔离,不要与容器外部的其他任何东西(当然是MySQL服务器)保持联系

  8.   

Trying to connect a containerized client with an external mysql server running in the host


⚠️好吧,我将首先排除使用 --net=host 的选项(即使在类似情况下也可以使您的服务“活”在您的计算机中)主机网络),因为您不希望其他主机的进程也可以使用您的容器,也不希望访问其他任何容器(host networking会发生这种情况)


连接到主机中的[非dockerized]服务

✔️在这种情况下,您真正​​需要做的(从容器内的应用程序中)是连接到Docker主机的IP

但不是您的常规本地网络(例如192.168.1.5)或公共/局域网中的IP,而是docker分配给docker网络本身内的主机(docker创建的网络)的IP。与容器之间以及容器之间进行通信

默认情况下(如果您未为容器指定任何其他网络设置),您的容器应使用Docker的 bridge network ,该容器是在主机中设置的(而不是在主机内部容器),俗称 docker0

因此,这很简单,例如找到与您的主机相对应的IP,然后将其用作mysql客户端的 bind_address (例如:jdbc:mysql://172.X.XX.XX:3306$dbhost = "172.X.XX.XX";等)。


我的Docker主机IP地址是什么?

好吧...以及如何找到docker分配给我的主机的IP(用于docker桥接网络的IP)?

手动地

您可以只列出所有当前分配的IP地址,以找到与该 docker0 网络相对应的IP地址:

ip -4 addr

或者通过直接过滤所需的内容更好:

ip -4 addr show docker0

您将获得类似以下的输出:

  

3:docker0:mtu 1500 qdisc noqueue

     

inet 172.17.0.1/16 brd 172.17.255.255作用域全局docker0

     

永远有效_lft永远永久_pft

并复制inet

之后显示的IP
自动地

我喜欢使用此脚本直接获取当前泊坞窗的主机IP(在跨多个主机进行测试时特别有用):

ip -4 addr show docker0 | awk '$1=="inet" {print $2}' | cut -d/ -f1

只需将其放在分配给某些环境变量的方便位置(例如,放在您的/.bashrc中)

export DOCKER_HOST_IP="$(ip -4 addr show docker0 | awk '$1=="inet" {print $2}' | cut -d/ -f1 )"

希望它可能有用!