首先尝试更好地描述我从您的问题中理解的内容:
你有一个安装了 mysql 的主机(不是 dockerized,而是直接
在您的主机上)
您有一些客户端应用程序连接到您的主机中的那个 MySQL
使用您的 localhost IP 和 mysql 端口(假设:
默认为 127.0.0.1:3306)
现在您创建了一个带有另一个应用程序的 docker 容器(在
容器)你想与你的 MySQL 服务器连接,
它仍在您的主机中运行,可在本地访问,但 out
您的新容器(或任何其他容器)
您希望您的 dockerized 服务保持隔离,与容器之外的其他任何东西(当然是 MySQL 服务器)没有其他联系
⚠️ 好吧,我将首先排除使用 --net=host 的选项(即使它可以在类似情况下工作以允许您的服务“存在”在主机的网络中) ) 因为您不希望您的容器可以从其他主机的进程中使用,也不能访问其他任何内容(host networking 会发生这种情况)
连接到主机中的 [non-dockerized] 服务
✔️ 在这种情况下,您实际需要做的(从容器内的应用程序)连接到 Docker 主机的 IP
但不是常规本地网络中的 IP(例如:192.168.1.5)或公共/wlan 网络中的 IP,而是 docker 分配给 docker 网络本身中的主机的 IP(docker 创建的网络)在您的容器之间进行通信)
默认情况下(如果您没有为容器指定任何其他网络设置),您的容器应该使用 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 -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
valid_lft 永远首选_lft 永远
并复制inet之后出现的ip
自动地
我喜欢使用这个脚本直接获取我当前 docker 的主机 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 )"
希望它有用!