我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的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
其他回答
答案是……
将http://127.0.0.1或http://localhost替换为http://host.docker.internal。
Why?
Docker文档中的源代码。
我的谷歌搜索把我带到了这里,在挖掘评论后,我发现它是从Docker容器内部复制的,我如何连接到机器的本地主机?我投票认为这是重复的,但由于人们(包括我自己!)经常向下滚动答案,而不是仔细阅读评论,这里是一个简短的答案。
对于使用桥接网络在容器之间创建专用网络的docker-compose,使用docker0的公认解决方案不起作用,因为容器的出口接口不是docker0,而是一个随机生成的接口id,例如:
$ ifconfig
br-02d7f5ba5a51: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.32.1 netmask 255.255.240.0 broadcast 192.168.47.255
不幸的是,随机id是不可预测的,并且每次compose必须重新创建网络时(例如在主机重新启动时)都会改变。我的解决方案是在一个已知的子网中创建私有网络,并配置iptables以接受该范围:
撰写文件片段:
version: "3.7"
services:
mongodb:
image: mongo:4.2.2
networks:
- mynet
# rest of service config and other services removed for clarity
networks:
mynet:
name: mynet
ipam:
driver: default
config:
- subnet: "192.168.32.0/20"
如果您的环境需要,您可以更改子网。我使用docker network inspect任意选择了192.168.32.0/20,以查看默认创建的内容。
在主机上配置iptables,允许私有子网作为源:
$ iptables -I INPUT 1 -s 192.168.32.0/20 -j ACCEPT
这是最简单的iptables规则。您可能希望添加其他限制,例如按目的端口。当你对iptables的工作感到满意时,不要忘记坚持你的规则。
这种方法的优点是可重复的,因此是可自动化的。我使用ansible的模板模块使用变量替换来部署我的compose文件,然后使用iptables和shell模块分别配置和持久化防火墙规则。
在docker run命令中使用——net="host",那么docker容器中的localhost将指向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容器https://github.com/qoomon/docker-host
然后,您可以简单地使用容器名称dns访问主机系统。 curl http://dockerhost: 9200