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

t21*_*573 5 mysql docker

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

Mos*_*ein 16

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

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

docker run --network=host myappimage
Run Code Online (Sandbox Code Playgroud)

如果docker-compose您将使用 is in your service:

network_mode: host
Run Code Online (Sandbox Code Playgroud)


Sal*_*Ops 6

首先试图更好地描述我从你的问题中理解的内容:

  1. 你有一个安装了 mysql 的主机(不是 dockerized,而是直接在你的主机上)

  2. 您有一些客户端应用程序使用您的本地主机IP 和 mysql 端口连接到您主机中的那个 MySQL (假设:默认情况下为 127.0.0.1:3306)

  3. 现在,您使用另一个应用程序(在容器内)创建了一个 docker 容器,该应用程序希望与您的 MySQL 服务器连接,该服务器仍在您的主机中运行,可在本地访问,但不在 您的新容器(或任何其他容器)中

  4. 您希望您的 dockerized 服务保持隔离,不与容器外的其他任何东西接触(当然,除了 MySQL 服务器)

尝试将容器化客户端与主机中运行的外部 mysql 服务器连接


?? 好吧,我将首先排除使用--net=host的选项(即使它可以在类似情况下工作以允许您的服务“存在”在您主机的网络中),因为您不想要您的容器可从您的其他主机的进程访问,也无法访问其他任何内容(主机网络会发生这种情况)


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

?? 在这种情况下,您实际需要做的(从容器内的应用程序)是连接到 Docker 主机的 IP

但不是在您的常规本地网络中的 IP(例如:192.168.1.5),也不是在您的公共/wlan 网络中,而是 docker 分配给您的 docker 网络本身内的主机的 IP(docker 创建的用于通信和通信的网络)在您的容器之间)

默认情况下(如果你没有为你的容器指定任何其他网络设置)你的容器应该使用 docker's bridge network,它设置在主机中(不在容器内)并且通常命名为docker0

因此,就像找到与您的主机相对应的 IP 并使用该 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
Run Code Online (Sandbox Code Playgroud)

或者通过直接过滤你想要的更好:

ip -4 addr show docker0
Run Code Online (Sandbox Code Playgroud)

你会得到类似这样的输出:

3: docker0: mtu 1500 qdisc noqueue

inet 172.17.0.1/16 brd 172.17.255.255 范围全局 docker0

valid_lft 永远首选_lft 永远

然后复制出现在那里的ip inet


自动地

我喜欢使用这个脚本直接获取我当前 docker 的主机 IP(在跨多个主机测试时特别有用):

ip -4 addr show docker0 | awk '$1=="inet" {print $2}' | cut -d/ -f1
Run Code Online (Sandbox Code Playgroud)

只需将它放在/.bashrc分配给某个环境变量的某个方便的地方(例如在您的)中:

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

希望它可以有用!