小编典典

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

all

我有一个运行 jenkins 的 docker 容器。作为构建过程的一部分,我需要访问在主机上本地运行的 Web 服务器。有没有办法可以将主机 Web
服务器(可以配置为在端口上运行)暴露给 jenkins 容器?

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

更新:

除了下面的@larsks 回答,要从主机获取主机 IP 的 IP 地址,我执行以下操作:

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

阅读 1010

收藏
2022-03-09

共1个答案

小编典典

在 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接口的主机服务。


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


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

2022-03-09