我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?
我在Linux机器上本机运行docker。
更新:
除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?
我在Linux机器上本机运行docker。
更新:
除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
当前回答
对于linux系统,从docker引擎的主版本20.04开始,您现在也可以通过host.docker.internal与主机通信。这不会自动工作,但你需要提供以下运行标志:
--add-host=host.docker.internal:host-gateway
See
https://github.com/moby/moby/pull/40007#issuecomment-578729356 https://github.com/docker/for-linux/issues/264#issuecomment-598864064
其他回答
目前在Mac和Windows上最简单的方法是使用主机host.docker.internal,它解析为主机的IP地址。不幸的是,它还不能在linux上运行(截至2018年4月)。
我们发现,对于所有这些网络垃圾,一个更简单的解决方案是仅为服务使用域套接字。如果您无论如何都试图连接到主机,只需将套接字作为卷挂载,就可以了。对于postgresql,这很简单:
docker run -v /var/run/postgresql:/var/run/postgresql
然后,我们只需设置数据库连接以使用套接字而不是网络。就是这么简单。
这是一个老问题,有很多答案,但没有一个足够适合我的背景。在我的例子中,容器非常精简,不包含从容器中提取主机ip地址所需的任何网络工具。
此外,使用——net="host"方法是一种非常粗略的方法,当人们希望使用多个容器进行良好隔离的网络配置时,这种方法并不适用。
因此,我的方法是在主机侧提取主机的地址,然后用——add-host参数将其传递给容器:
$ docker run --add-host=docker-host:`ip addr show docker0 | grep -Po 'inet \K[\d.]+'` image_name
或者,将主机的IP地址保存在一个环境变量中,以后再使用:
$ DOCKERIP=`ip addr show docker0 | grep -Po 'inet \K[\d.]+'`
$ docker run --add-host=docker-host:$DOCKERIP image_name
然后docker-host被添加到容器的hosts文件中,你可以在你的数据库连接字符串或API url中使用它。
在近7年的时间里,这个问题被提出了,要么docker已经改变了,要么没有人尝试过这种方法。所以我会给出我自己的答案。
我发现所有的答案都使用了复杂的方法。今天,我需要这些,并找到了两种非常简单的方法:
在主机上使用ipconfig或ifconfig,并记录所有的IP地址。容器至少可以使用其中的两个。 我有一个固定的本地网络地址在WiFi局域网适配器:192.168.1.101。这可能是10.0.1.101。结果会根据你的路由器而改变 我在windows上使用WSL,它有自己的vEthernet地址:172.19.192.1 使用host.docker.internal。大多数答案都有这样或那样的形式,这取决于操作系统。从这个名字可以看出,docker现在在全球范围内使用它。
第三种选择是使用计算机的WAN地址,或者换句话说,由服务提供者提供的IP地址。然而,如果IP不是静态的,并且需要路由和防火墙设置,这可能不起作用。
PS:虽然和这里的这个问题很像,我把这个答案贴在那里,但我是先找到这个帖子的,所以我也贴在这里,以免忘记我自己的答案。
答案是……
将http://127.0.0.1或http://localhost替换为http://host.docker.internal。
Why?
Docker文档中的源代码。
我的谷歌搜索把我带到了这里,在挖掘评论后,我发现它是从Docker容器内部复制的,我如何连接到机器的本地主机?我投票认为这是重复的,但由于人们(包括我自己!)经常向下滚动答案,而不是仔细阅读评论,这里是一个简短的答案。