我有一个docker集装箱在运jenkins。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。有没有办法将主机web服务器(可以配置为在端口上运行)公开给jenkins容器?
我在Linux机器上运行docker。
更新:
除了下面的@larsks answer之外,为了从主机获取主机IP的IP地址,我执行以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
在您的docker run
命令中使用--net=“host”
,然后docker容器中的localhost
将指向您的docker主机。
在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,您可以连接到magic hostname主机。码头工人。内部
。
最后,在Linux下,通过设置--net=host
,可以在主机网络名称空间中运行容器;在这种情况下,主机上的localhost
与容器中的localhost
相同,因此容器化服务将像非容器化服务一样,无需任何额外配置即可访问。
在Linux上,添加--add host=host。码头工人。内部:将主机网关
连接到Docker命令以启用此功能。(有关Docker Compose配置,请参见下文。)
使用您的内部IP地址或连接到特殊的DNS名称host.docker.internal
,该名称将解析为主机使用的内部IP地址。
要在Linux上的Docker Compose中启用此功能,请在容器定义中添加以下行:
extra_hosts:
- "host.docker.internal:host-gateway"
使用您的内部IP地址或连接到特殊的DNS名称host.docker.internal
,该名称将解析为主机使用的内部IP地址。
Linux支助待https://github.com/docker/for-linux/issues/264
与上面相同,但使用docker.for.mac.host.internal
代替。
同上,但使用docker。对于雨衣。本地主机
。
要从docker容器访问主机,必须将IP别名附加到网络接口。你可以绑定任何你想要的IP,只需确保你没有将其用于其他任何东西。
sudo ifconfig lo0别名123.123.123.123/24
然后确保服务器正在监听上述IP或0.0.0.0
。如果它正在本地主机127.0.0.1
上监听,它将不接受连接。
然后把你的docker容器指向这个IP,你就可以访问主机了!
要进行测试,可以在容器内运行类似于curl-X GET123.123.123.123:3000的内容。
别名将在每次重新启动时重置,因此在必要时创建启动脚本。
解决方案和更多文档如下:https://docs.docker.com/docker-for-mac/networking/#use-案例和解决办法
问题内容: 我有一个运行詹金斯的码头集装箱。作为构建过程的一部分,我需要访问在主机上本地运行的Web服务器。是否可以将主机Web服务器(可以配置为在端口上运行)暴露给jenkins容器? 编辑:我正在Linux机器上本地运行docker。 更新: 除了下面的@larsks答案之外,要从主机获取主机IP的IP地址,我还要执行以下操作: 问题答案: 在Linux上本地运行Docker时,您可以使用接口
我有一个docker容器在运行Jenkins。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。有没有一种方法可以将主机web服务器(可以配置为在端口上运行)公开给jenkins容器? 编辑:我正在Linux机器上原生运行docker。 更新: 除了@larsks下面的答案之外,要从主机获取主机IP的IP地址,我还做了以下操作:
我有一个docker应用程序,我使用以下docker compose。yml运行它: 我有一个没有docker化的服务器在我的机器上运行,我可以通过访问它。我希望我的服务能够访问它。 我发现有人建议在我的服务配置中添加以下内容: 但是当我添加这个时,并尝试,我得到。当我尝试<code>curl时,也会出现同样的错误http://host.docker.internal:3000。 我拼命地尝试将端
问题内容: 我正在boot2docker 1.3.1下运行。 我有一个Docker容器通过运行Web服务器。 如果我连接到该容器,则可以使用浏览该网站,以便知道服务器正在运行。 我用以下容器运行容器: 它具有以下详细信息: 我以为可以访问,从托管人访问该网站。 这是行不通的。我只是在Chrome中看到“正在连接…”,却一无所获。 我究竟做错了什么? 问题答案: 好吧,愚蠢的我,我在boot2doc
我在本地机器(Mac)上工作,其中有一个名为sqlvm的遗留虚拟机(这意味着我可以通过http://sqlvm:从本地主机访问这个虚拟机)。现在,我在应该连接到vm的同一个本地主机(我的Mac)中设置了几个docker容器(使用docker-compose)。< code>pymysql会引发一个异常: 如何将外部的“sqlvm”公开给内部 Docker 网络? 编辑:我尝试在yml文件中为相关容
问题内容: 如果我在某个主机上运行mysql数据库,并且该主机也正在运行docker容器:我如何从主机上运行的docker容器中访问mysql数据库? 例如,是否有一种方法可以将主机端口发布到容器(与docker run -p的作用相反)? 问题答案: 关于如何以一致的,易于理解的和可移植的方式执行此操作的问题已有很长时间的讨论。尚无完整的解决方案,但我会将您链接到下面的讨论。 无论如何,您都想尝