我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?

我在Linux机器上本机运行docker。

更新:

除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:

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

当前回答

使用docker-compose的解决方案: 要访问基于主机的服务,可以使用network_mode参数 https://docs.docker.com/compose/compose-file/#network_mode

version: '3'
services:
  jenkins:
    network_mode: host

EDIT 2020-04-27:建议仅在本地开发环境中使用。

编辑2021-09-21:ihavehandedinmyresign写道,它不适用于Mac和Windows。选项仅支持Linux操作系统

其他回答

目前在Mac和Windows上最简单的方法是使用主机host.docker.internal,它解析为主机的IP地址。不幸的是,它还不能在linux上运行(截至2018年4月)。

这是一个老问题,有很多答案,但没有一个足够适合我的背景。在我的例子中,容器非常精简,不包含从容器中提取主机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中使用它。

答案是……

将http://127.0.0.1或http://localhost替换为http://host.docker.internal。

Why?

Docker文档中的源代码。

我的谷歌搜索把我带到了这里,在挖掘评论后,我发现它是从Docker容器内部复制的,我如何连接到机器的本地主机?我投票认为这是重复的,但由于人们(包括我自己!)经常向下滚动答案,而不是仔细阅读评论,这里是一个简短的答案。

您可以通过两种方式访问运行在主机上的本地web服务器。

使用公网IP的方法1 使用主机公网IP地址访问Jenkins docker容器中的webserver。 与主机网络的方法2 使用"——net host"将Jenkins docker容器添加到主机的网络堆栈上。部署在主机堆栈上的容器具有对主机接口的全部访问权。您可以使用主机的私有IP地址访问docker容器中的本地web服务器。

NETWORK ID          NAME                      DRIVER              SCOPE
b3554ea51ca3        bridge                    bridge              local
2f0d6d6fdd88        host                      host                local
b9c2a4bc23b2        none                      null                local

启动带有主机网络的容器 例如:docker运行——net host -it ubuntu并运行ifconfig来列出所有可从docker容器访问的可用网络IP地址。

我在我的本地主机上启动了一个nginx服务器,我能够从Ubuntu docker容器访问nginx网站的url。

Docker运行——net主机- ubuntu

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
a604f7af5e36        ubuntu              "/bin/bash"         22 seconds ago      Up 20 seconds                           ubuntu_server

使用私有网络IP地址从Ubuntu docker容器访问Nginx web服务器(运行在本地主机上)。

root@linuxkit-025000000001:/# curl 192.168.x.x -I
HTTP/1.1 200 OK
Server: nginx/1.15.10
Date: Tue, 09 Apr 2019 05:12:12 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 26 Mar 2019 14:04:38 GMT
Connection: keep-alive
ETag: "5c9a3176-264"
Accept-Ranges: bytes

在docker run命令中使用——net="host",那么docker容器中的localhost将指向docker主机。