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

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

更新:

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

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

当前回答

为此我创建了一个docker容器https://github.com/qoomon/docker-host

然后,您可以简单地使用容器名称dns访问主机系统。 curl http://dockerhost: 9200

其他回答

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

对于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

我探索了各种解决方案,我发现这是最简单的解决方案:

定义网桥网关的静态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”从容器内部访问主机上的端口。

使用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操作系统

为此我创建了一个docker容器https://github.com/qoomon/docker-host

然后,您可以简单地使用容器名称dns访问主机系统。 curl http://dockerhost: 9200