当前位置: 首页 > 知识库问答 >
问题:

如何从docker容器访问主机端口[重复]

南门建章
2023-03-14

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

我在Linux机器上运行docker。

更新:

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

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

共有3个答案

欧阳嘉
2023-03-14

在您的docker run命令中使用--net=“host”,然后docker容器中的localhost将指向您的docker主机。

祁烨
2023-03-14

在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相同,因此容器化服务将像非容器化服务一样,无需任何额外配置即可访问。

  • 彭华皓
    2023-03-14

    在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的作用相反)? 问题答案: 关于如何以一致的,易于理解的和可移植的方式执行此操作的问题已有很长时间的讨论。尚无完整的解决方案,但我会将您链接到下面的讨论。 无论如何,您都想尝