如何从搬运工容器访问主机端口如何从搬运工容器访问主机端口(How to access host po

2019-05-10 13:58发布

我有运行詹金斯码头工人的容器。 作为构建过程的一部分,我需要访问的主机上本地运行的Web服务器。 有没有办法在主机Web服务器(可配置为一个端口上运行)可以被暴露在詹金斯容器?

编辑:我在Linux机器上运行的泊坞窗本身。

更新:

除了@larsks回答以下,从主机获得主机IP的IP地址,我做到以下几点:

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

Answer 1:

当本地运行在Linux上泊坞窗,则可以使用的IP地址来访问主机服务docker0接口。 从容器内,这将是你的默认路由。

例如,我的系统上:

$ ip addr show docker0
7: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::f4d2:49ff:fedd:28a0/64 scope link 
       valid_lft forever preferred_lft forever

和容器内:

# ip route show
default via 172.17.0.1 dev eth0 
172.17.0.0/16 dev eth0  src 172.17.0.4 

这也很容易使用简单的shell脚本来提取这个IP地址:

#!/bin/sh

hostip=$(ip route show | awk '/default/ {print $3}')
echo $hostip

您可能需要修改iptables主机上的规则,允许从Docker容器连接。 这样的事情会做的伎俩:

# iptables -A INPUT -i docker0 -j ACCEPT

这将允许访问任何端口从Docker容器在主机上。 注意:

  • iptables规则是有序的,而这个规则可能会或可能不会做取决于其他规则来之前什么它正确的事情。

  • 您将只能够访问或者为(a)侦听主机服务INADDR_ANY (又名0.0.0.0)或本上明确地听docker0接口。



Answer 2:

适用于MacOS和Windows

泊坞窗v 18.03及以上(自2018年3月21日)

使用您的内部IP地址或连接到特殊的DNS名称host.docker.internal这将解决由主机使用的内部IP地址。

Linux支持挂起https://github.com/docker/for-linux/issues/264

与早期版本的泊坞窗的MacOS

码头工人的Mac v 17.12至v 18.02

同上,但使用docker.for.mac.host.internal代替。

码头工人的Mac v 17.06至v 17.11

同上,但使用docker.for.mac.localhost代替。

码头工人的Mac 17.05及以下

从泊坞窗容器访问主机必须连接的IP别名到您的网络接口。 你可以绑定任何你想要的IP,只是确保你不会用它来别的。

sudo ifconfig lo0 alias 123.123.123.123/24

然后确保你的服务器是听上面或提到的IP 0.0.0.0 。 如果它监听在localhost 127.0.0.1也不会接受连接。

然后,只需将您的码头工人,容器到这个IP,您可以访问的主机!

为了测试你可以运行像curl -X GET 123.123.123.123:3000容器内。

别名将重置每次重新启动,以便在必要时创建一个启动脚本。

解决方案在这里更多的文档: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds



Answer 3:

使用--net="host"docker run命令,然后localhost在你的搬运工容器将指向您的码头工人的主机。



Answer 4:

解决方案有搬运工人,撰写:用于访问基于主机的服务,您可以使用network_mode参数https://docs.docker.com/compose/compose-file/#network_mode

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


Answer 5:

目前最简单的方式做到这一点在Mac和Windows正在使用的主机host.docker.internal ,解析为主机的IP地址。 遗憾的是它并没有工作在Linux上还没有 (为2018年4月的)。



Answer 6:

我创建了一个码头工人容器正是这样做https://github.com/qoomon/docker-host

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



Answer 7:

当你有两个搬运工图像“已经”创建并要放在两个容器用一个相互通信。

对于这一点,你可以方便地与自己的--name运行每个容器,并使用--link标志,使它们之间的通信。 搬运工构建过程中,您没有得到这个虽然。

当你在像我这样的情况下,它是你的

docker build -t "centos7/someApp" someApp/ 

这打破了当您尝试

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

你停留在“卷曲/ wget的”没有返回“到主机的路由”。

其原因是,在地方由搬运工,默认情况下是从向主机或主机上运行的其它容器的容器禁止通信设置安全性。 这是相当令人惊讶的对我来说,我必须说,你会期望在本地机器上运行完美只是可以互相访问没有太多障碍泊坞窗机的echosystem。

对此的解释中详细下列文档中描述。

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

两个快速的解决方法,给出能够帮助您获得通过降低下来的网络安全移动。

最简单的方法是只需关闭防火墙 - 或允许所有。 这意味着在运行必要的命令,它可以是systemctl停止firewalld,iptables的-F或等同物。

希望这信息帮助你。



Answer 8:

我已经探讨了各种解决方案,我觉得这是最哈克解决方案:

  1. 限定了桥接网关IP静态IP地址。
  2. 添加网关IP作为主机文件的额外条目。

唯一的缺点是,如果你有多个网络或项目,这样做,你必须确保他们的IP地址范围不冲突。

这里是一个码头工人撰写例如:

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”访问端口的主机上从容器内。



Answer 9:

您可以访问它在你的主机上运行的两种方式在本地网络服务器。

  1. 方法1公网IP

    使用主机的公网IP地址,詹金斯搬运工容器来访问Web服务器。

  2. 方法2与主机网络

    使用“--net主机”添加主机的网络堆栈上的詹金斯泊坞窗容器。 这是部署在主机的栈容器必须主机接口整个访问。 您可以在泊坞窗容器访问本地网络服务器与主机的私有IP地址。

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

与主机网络启动的容器Eg: docker run --net host -it ubuntu和运行ifconfig要列出从搬运工集装箱到达的所有可用的网络IP地址。

例如:我在本地主机开始nginx的服务器,我可以从Ubuntu的泊坞窗容器访问nginx的网站网址。

docker run --net host -it ubuntu

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

访问从Ubuntu的泊坞窗容器Nginx的网络服务器(在本地主机上运行)与私网IP地址。

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


文章来源: How to access host port from docker container