我在服务器和dockerized项目上安装了MySQL服务器,该数据库是不公开访问的,只能从服务器内部访问。本地非dockerized应用也使用它。 我想从docker内部连接到它,并且保持不公开访问,我尝试了172.17.0.1,但连接被拒绝。 当前的bind_address是127.0.0.1,您建议bind_address是??
答案 0 :(得分:0)
您可以通过host
网络模式运行该应用程序,这将使容器能够连接到主服务器(docker主机)的本地主机,同时保持bind-address
指向{{1 }}。
因此,如果您使用的是docker cli,则需要像这样运行应用程序:
127.0.0.1
如果使用docker run --network=host myappimage
,则将在您的服务中使用
docker-compose
答案 1 :(得分:0)
尝试更好地描述我对您的问题的理解:
您有一个安装了mysql的主机(未进行dockerized,但直接 在您的主机上)
您的主机中有一些客户端应用程序连接到该MySQL 使用您的 localhost IP和mysql端口(假设: 默认为127.0.0.1:3306)
现在,您使用另一个应用程序( 容器),您希望将其与MySQL服务器连接, 它仍在您的主机中运行,可以在本地访问,但 out 您的新容器(或其他任何容器)
您希望使您的dockerized服务保持隔离,不要与容器外部的其他任何东西(当然是MySQL服务器)保持联系
⚠️好吧,我将首先排除使用 --net=host 的选项(即使在类似情况下也可以使您的服务“活”在您的计算机中)主机网络),因为您不希望其他主机的进程也可以使用您的容器,也不希望访问其他任何容器(host networking会发生这种情况)
✔️在这种情况下,您真正需要做的(从容器内的应用程序中)是连接到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)?
手动地您可以只列出所有当前分配的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 -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 )"
希望它可能有用!