我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的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时,可以通过docker0接口的IP地址访问主机服务。在容器内部,这将是您的默认路由。
例如,在我的系统上:
$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link
valid_lft forever preferred_lft forever
在容器内:
# ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 src 172.17.0.4
使用简单的shell可以很容易地提取这个IP地址 脚本:
#!/bin/sh
hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip
您可能需要修改主机上的iptables规则以允许 Docker容器的连接。像这样的东西会 技巧:
# iptables -A INPUT -i docker0 -j ACCEPT
这将允许从Docker访问主机上的任何端口 容器。注意:
Iptables规则是有序的,这个规则可以做也可以不做 这是正确的,取决于前面还有什么规则。 您将只能访问以下任一主机服务:(a) 监听INADDR_ANY(又名0.0.0.0)或显式的 监听docker0接口。
如果你在MacOS或Windows 18.03+上使用Docker,你可以连接到神奇的主机名host.docker.internal。
最后,在Linux下你可以通过设置——net=host在主机网络命名空间中运行容器;在这种情况下,主机上的localhost与容器内的localhost相同,因此容器化服务将像非容器化服务一样,无需任何额外配置即可访问。
其他回答
目前在Mac和Windows上最简单的方法是使用主机host.docker.internal,它解析为主机的IP地址。不幸的是,它还不能在linux上运行(截至2018年4月)。
对我来说最简单的选择是, 我使用我的机器在本地网络上的IP地址(由路由器分配)
您可以使用ifconfig命令找到这一点
e.g
ifconfig
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether f0:18:98:08:74:d4
inet 192.168.178.63 netmask 0xffffff00 broadcast 192.168.178.255
media: autoselect
status: active
然后使用inet地址。这可以让我连接机器上的任何端口。
对于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 run命令中使用——net="host",那么docker容器中的localhost将指向docker主机。
使用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操作系统