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

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

更新:

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

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

当前回答

我们发现,对于所有这些网络垃圾,一个更简单的解决方案是仅为服务使用域套接字。如果您无论如何都试图连接到主机,只需将套接字作为卷挂载,就可以了。对于postgresql,这很简单:

docker run -v /var/run/postgresql:/var/run/postgresql

然后,我们只需设置数据库连接以使用套接字而不是网络。就是这么简单。

其他回答

当你“已经”创建了两个docker映像,并且你想让两个容器彼此通信时。

为此,您可以方便地使用自己的——name运行每个容器,并使用——link标志来启用它们之间的通信。但是在docker构建期间你不会得到这个。

当你和我一样身处险境时,那是你的

docker build -t "centos7/someApp" someApp/ 

当你尝试的时候,它就会被打破

curl http://172.17.0.1:localPort/fileIWouldLikeToDownload.tar.gz > dump.tar.gz

你会被“curl/wget”卡住,返回没有“到主机的路由”。

原因是docker设置的安全性,默认情况下禁止容器与主机或主机上运行的其他容器通信。 这让我很惊讶,我必须说,你会期望在本地机器上运行的docker机器的回声系统能够完美地相互访问,没有太多障碍。

对此的解释将在以下文档中详细描述。

http://www.dedoimedo.com/computers/docker-networking.html

本文给出了两个快速解决方案,可以帮助您降低网络安全性。

最简单的选择是关闭防火墙——或者允许所有防火墙。这意味着运行必要的命令,可以是systemctl stop firewall, iptables -F或等效命令。

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

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

我们发现,对于所有这些网络垃圾,一个更简单的解决方案是仅为服务使用域套接字。如果您无论如何都试图连接到主机,只需将套接字作为卷挂载,就可以了。对于postgresql,这很简单:

docker run -v /var/run/postgresql:/var/run/postgresql

然后,我们只需设置数据库连接以使用套接字而不是网络。就是这么简单。

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