我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?
我在Linux机器上本机运行docker。
更新:
除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
我有个码头集装箱在运行詹金斯。作为构建过程的一部分,我需要访问在主机上本地运行的web服务器。是否有一种方法可以将主机web服务器(可以配置为在端口上运行)暴露给jenkins容器?
我在Linux机器上本机运行docker。
更新:
除了下面的@larsks答案,要从主机上获取主机IP的IP地址,我做了以下操作:
ip addr show docker0 | grep -Po 'inet \K[\d.]+'
当前回答
当你“已经”创建了两个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映像,并且你想让两个容器彼此通信时。
为此,您可以方便地使用自己的——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或等效命令。
对我来说(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
我探索了各种解决方案,我发现这是最简单的解决方案:
定义网桥网关的静态IP地址。 在extra_hosts指令中添加网关IP作为额外的条目。
唯一的缺点是,如果你有多个网络或项目这样做,你必须确保它们的IP地址范围不冲突。
下面是一个Docker Compose的例子:
version: '2.3'
services:
redis:
image: "redis"
extra_hosts:
- "dockerhost:172.20.0.1"
networks:
default:
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
gateway: 172.20.0.1
然后,您可以使用主机名“dockerhost”从容器内部访问主机上的端口。
在近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:虽然和这里的这个问题很像,我把这个答案贴在那里,但我是先找到这个帖子的,所以我也贴在这里,以免忘记我自己的答案。
这是一个老问题,有很多答案,但没有一个足够适合我的背景。在我的例子中,容器非常精简,不包含从容器中提取主机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中使用它。