我在服务器和 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)
首先试图更好地描述我从你的问题中理解的内容:
你有一个安装了 mysql 的主机(不是 dockerized,而是直接在你的主机上)
您有一些客户端应用程序使用您的本地主机IP 和 mysql 端口连接到您主机中的那个 MySQL (假设:默认情况下为 127.0.0.1:3306)
现在,您使用另一个应用程序(在容器内)创建了一个 docker 容器,该应用程序希望与您的 MySQL 服务器连接,该服务器仍在您的主机中运行,可在本地访问,但不在 您的新容器(或任何其他容器)中
您希望您的 dockerized 服务保持隔离,不与容器外的其他任何东西接触(当然,除了 MySQL 服务器)
?? 好吧,我将首先排除使用--net=host的选项(即使它可以在类似情况下工作以允许您的服务“存在”在您主机的网络中),因为您不想要您的容器可从您的其他主机的进程访问,也无法访问其他任何内容(主机网络会发生这种情况)
?? 在这种情况下,您实际需要做的(从容器内的应用程序)是连接到 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)?
手动您可以列出所有当前分配的 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)
希望它可以有用!
| 归档时间: |
|
| 查看次数: |
17934 次 |
| 最近记录: |