我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的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
其他回答
适用于所有平台
Docker v 20.10及以上版本(自2020年12月14日起)
在Linux上,在Docker命令中添加——add-host=host.docker.internal:host-gateway来启用该功能。(Docker Compose配置见下文)
使用您的内部IP地址或连接到特殊的DNS名称host.docker.internal,它将解析为主机使用的内部IP地址。
要在Linux上的Docker Compose中启用此功能,请在容器定义中添加以下行: extra_hosts: ——“host.docker.internal: host-gateway”
适用于macOS和Windows
Docker v 18.03及以上版本(自2018年3月21日起)
使用您的内部IP地址或连接到特殊的DNS名称host.docker.internal,它将解析为主机使用的内部IP地址。
Linux支持未决https://github.com/docker/for-linux/issues/264
MacOS和早期版本的Docker
Mac v 17.12到v 18.02的Docker
与上述相同,但使用docker.for.mac.host.internal代替。
Mac v 17.06到v 17.11的Docker
与上述相同,但使用docker.for.mac.localhost代替。
Docker适用于Mac 17.05及以下版本
要从docker容器访问主机,必须为网络接口附加一个IP别名。你可以绑定任何你想要的IP,只要确保你没有使用它到其他任何东西。
sudo ifconfig lo0又名123,123,123 /24
然后确保您的服务器正在侦听上面提到的IP或0.0.0.0。如果它正在监听localhost 127.0.0.1,它将不接受连接。
然后只需将docker容器指向这个IP,就可以访问主机了!
为了测试,可以在容器内运行curl -X GET 123.123.123.123:3000。
别名将在每次重新启动时重置,因此如果需要,创建一个启动脚本。
解决方案和更多文档请访问:https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
在docker run命令中使用——net="host",那么docker容器中的localhost将指向docker主机。
答案是……
将http://127.0.0.1或http://localhost替换为http://host.docker.internal。
Why?
Docker文档中的源代码。
我的谷歌搜索把我带到了这里,在挖掘评论后,我发现它是从Docker容器内部复制的,我如何连接到机器的本地主机?我投票认为这是重复的,但由于人们(包括我自己!)经常向下滚动答案,而不是仔细阅读评论,这里是一个简短的答案。
这是一个老问题,有很多答案,但没有一个足够适合我的背景。在我的例子中,容器非常精简,不包含从容器中提取主机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中使用它。
使用docker-compose的解决方案: 要访问基于主机的服务,可以使用network_mode参数 https://docs.docker.com/compose/compose-file/#network_mode
version: '3'
services:
jenkins:
network_mode: host
EDIT 2020-04-27:建议仅在本地开发环境中使用。
编辑2021-09-21:ihavehandedinmyresign写道,它不适用于Mac和Windows。选项仅支持Linux操作系统