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

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

更新:

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

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

当前回答

您可以通过两种方式访问运行在主机上的本地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

其他回答

对我来说(Windows 10, Docker Engine v19.03.8),它是https://stackoverflow.com/a/43541732/7924573和https://stackoverflow.com/a/50866007/7924573的组合。

change the host/ip to host.docker.internal e.g.: LOGGER_URL = "http://host.docker.internal:8085/log" set the network_mode to bridge (if you want to maintain the port forwarding; if not use host): version: '3.7' services: server: build: . ports: - "5000:5000" network_mode: bridge or alternatively: Use --net="bridge" if you are not using docker-compose (similar to https://stackoverflow.com/a/48806927/7924573) As pointed out in previous answers: This should only be used in a local development environment. For more information read: https://docs.docker.com/compose/compose-file/#network_mode and https://docs.docker.com/docker-for-windows/networking/#use-cases-and-workarounds

对于linux系统,从docker引擎的主版本20.04开始,您现在也可以通过host.docker.internal与主机通信。这不会自动工作,但你需要提供以下运行标志:

--add-host=host.docker.internal:host-gateway

See

https://github.com/moby/moby/pull/40007#issuecomment-578729356 https://github.com/docker/for-linux/issues/264#issuecomment-598864064

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

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

在近7年的时间里,这个问题被提出了,要么docker已经改变了,要么没有人尝试过这种方法。所以我会给出我自己的答案。

我发现所有的答案都使用了复杂的方法。今天,我需要这些,并找到了两种非常简单的方法:

在主机上使用ipconfig或ifconfig,并记录所有的IP地址。容器至少可以使用其中的两个。 我有一个固定的本地网络地址在WiFi局域网适配器:192.168.1.101。这可能是10.0.1.101。结果会根据你的路由器而改变 我在windows上使用WSL,它有自己的vEthernet地址:172.19.192.1 使用host.docker.internal。大多数答案都有这样或那样的形式,这取决于操作系统。从这个名字可以看出,docker现在在全球范围内使用它。

第三种选择是使用计算机的WAN地址,或者换句话说,由服务提供者提供的IP地址。然而,如果IP不是静态的,并且需要路由和防火墙设置,这可能不起作用。


PS:虽然和这里的这个问题很像,我把这个答案贴在那里,但我是先找到这个帖子的,所以我也贴在这里,以免忘记我自己的答案。