如何从docker容器访问主机端口

2024-06-02 04:47:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个docker集装箱在运jenkins。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。有没有一种方法可以将主机web服务器(可以配置为在端口上运行)公开给jenkins容器

编辑:我在Linux机器上本机运行docker

更新:

除了下面的@larsks answer之外,为了从主机获取主机IP的IP地址,我执行以下操作:

ip addr show docker0 | grep -Po 'inet \K[\d.]+'

Tags: 方法端口dockeranswerip服务器机器web
3条回答

docker run命令中使用--net="host",然后docker容器中的localhost将指向docker主机

适用于所有平台

Docker v 20.10及以上(自2020年12月14日起)

在Linux上,将--add-host=host.docker.internal:host-gateway添加到Docker命令以启用此功能。(有关Docker Compose配置,请参见下文。)

使用内部IP地址或连接到特殊DNS名称host.docker.internal,该名称将解析为主机使用的内部IP地址

To enable this in Docker Compose on Linux, add the following lines to the container definition:

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

使用Docker早期版本的MacOS

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

Mac 17.05及以下版本的Docker

要从docker容器访问主机,必须将IP别名附加到网络接口。您可以绑定任何您想要的IP,只要确保您没有将其用于任何其他内容

sudo ifconfig lo0 alias 123.123.123.123/24

然后确保您的服务器正在侦听上述IP或0.0.0.0。如果它正在本地主机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

在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接口上侦听


如果您在MacOSWindows18.03+上使用Docker,则可以连接到神奇主机名host.docker.internal


最后,在Linux下,您可以通过设置--net=host在主机网络名称空间中运行容器;在这种情况下,主机上的localhost与容器中的localhost相同,因此容器化服务的行为类似于非容器化服务,无需任何额外配置即可访问

相关问题 更多 >