我有一个Nginx在码头集装箱里运行。我在主机系统上运行了MySql。我想从我的容器中连接到MySql。MySql仅绑定到本地主机设备。

是否有任何方法可以从这个docker容器连接到这个MySql或本地主机上的任何其他程序?

这个问题与“如何从docker容器中获取docker主机的IP地址”不同,因为docker主机IP地址可以是网络中的公共IP或私有IP,而这些IP可能在docker容器内无法访问(如果托管在AWS或其他地方,我指的是公共IP)。即使你有docker主机的IP地址,这并不意味着你可以从容器内连接到docker主机,因为你的docker网络可能是overlay、host、bridge、macvlan、none等,这限制了该IP地址的可达性。


当前回答

如果使用--net=host运行,localhost应该可以正常工作。如果您使用默认网络,请使用静态IP 172.17.0.1。

看到这个-https://stackoverflow.com/a/48547074/14120621

其他回答

试试看:

version: '3.5'
services:
  yourservice-here:
    container_name: container_name
    ports:
      - "4000:4000"
    extra_hosts: # <---- here
      - localhost:192.168.1.202
      - or-vitualhost.local:192.168.1.202

要获取192.168.1.202,请使用ifconfig

这对我有用。希望能帮上忙!

主机上的服务器正在监听端口5000;它将从主机发回一个字符串响应作为响应

echo“主机响应”|nc-l-p 5000

docker默认在网桥模式下运行(这比在主机网络模式下运行更安全);docker中的进程获取主机上第一个网络接口的ipv4地址,该地址不是127.0.0.1;这个ipv4地址通过环境变量HOSTIP传递给docker;在docker内部有一个nc命令,该命令连接到主机ip和端口5000上的服务器;该命令还读取服务器的响应。

HOST=$(ifconfig|grep“inet”|grep-v 127.0.0.1|awk“{print$2}”| head-1|sed-n‘s/[^0-9]*\([0-9\.]*\)/\1/p');docker run-e HOSTIP=“${HOST}”--rm-it alpine/bin/sh-c'echo“来自容器的问候语”|nc$HOSTIP 5000-v'

计算第一个列出接口的ipv4地址的表达式在osx和linux上确实有效:

HOST=$(ifconfig|grep“inet”|grep-v 127.0.0.1|awk“{print$2}”| head-1|sed-n‘s/[^0-9]*\([0-9\.]*\)/\1/p')

让它更通用:您可以在另一个docker容器中运行服务器,如下所示:

docker run--expose 5000-p:5000:5000--rm-it alpine/bin/sh-c'echo“来自主机的响应”|nc-l-p 5000'

--暴露5000码头集装箱可以接受端口5000上的连接

-p:5000:5000主机端的docker引擎监听任何接口上的端口5000,并将连接转发到容器网络(nc正在运行)的端口5000。

在修复程序未合并到主分支之前,只需从容器内部运行主机IP即可:

ip -4 route list match 0/0 | cut -d' ' -f3

(正如@Mahoney在这里所建议的)。

在7年的时间里,人们提出了一个问题,要么码头工人变了,要么没有人这样做。因此,我将包括我自己的答案。

我发现所有的答案都使用复杂的方法。今天,我需要这个,并找到了两个非常简单的方法:

在主机上使用ipconfig或ifconfig,并记下所有IP地址。容器至少可以使用其中两个。我在WiFi LAN适配器上有一个固定的本地网络地址:192.168.1.101。这可能是10.0.101。结果会因路由器而异我在windows上使用WSL,它有自己的vEthernet地址:172.19.192.1使用host.docker.internal。根据操作系统的不同,大多数答案都有这种或另一种形式。这个名字表明它现在被docker全球使用。

第三种选择是使用计算机的WAN地址,或者换句话说,使用服务提供商提供的IP地址。然而,如果IP不是静态的,并且需要路由和防火墙设置,则这可能不起作用。

另外一点可能很有用,特别是对于docker容器中的NGINX服务器配置。因此,如果您的主机服务应该出于不同的目的读取客户端的url,则可以对其进行定义,只需稍微修改前面在答案中提到的方法即可:

--add-host brand-A-client.local:host-gateway

或在docker-compose.yml中

extra_hosts:
- brand-B-client.local:host-gateway

并在容器中分别引用它们。适用于Docker Windows/Macos/Linux。