当前位置: 首页 > 知识库问答 >
问题:

如何从不同主机外部到达运行在docker容器(覆盖)中的服务

赫连坚
2023-03-14

实际情况:

运行在容器内部的服务是配置了YARN-Client的spark驱动程序。spark驱动程序绑定到容器内部IP(10.x.x.x)。当spark驱动程序与运行在不同集群上的hadoop yarn通信时,yarn上的应用程序主程序试图在驱动程序容器的内部ip上与spark驱动程序通信,但由于明显的原因,它无法在内部ip上连接驱动程序。

请让我知道是否有一种方法来实现从应用程序大师(纱线)到火花驱动程序(docker容器)的成功沟通。

docker info:

Containers: 3
 Running: 2
 Paused: 0
 Stopped: 1
Images: 42
Server Version: swarm/1.2.5
Role: primary
Strategy: spread
Filters: health, port, containerslots, dependency, affinity, constraint
Nodes: 1
 ip-172-30-0-175: 172.30.0.175:2375
  └ ID: YQ4O:WGSA:TGQL:3U5F:ONL6:YTJ2:TCZJ:UJBN:T5XA:LSGL:BNGA:UGZW
  └ Status: Healthy
  └ Containers: 3 (2 Running, 0 Paused, 1 Stopped)
  └ Reserved CPUs: 0 / 16
  └ Reserved Memory: 0 B / 66.06 GiB
  └ Labels: kernelversion=3.13.0-91-generic, operatingsystem=Ubuntu 14.04.4 LTS, storagedriver=aufs
  └ UpdatedAt: 2016-09-10T05:01:32Z
  └ ServerVersion: 1.12.1
Plugins:
 Volume: 
 Network: 
Swarm: 
 NodeID: 
 Is Manager: false
 Node Address: 
Security Options:
Kernel Version: 3.13.0-91-generic
Operating System: linux
Architecture: amd64
CPUs: 16
Total Memory: 66.06 GiB
Name: 945b4af662a4
Docker Root Dir: 
Debug Mode (client): false
Debug Mode (server): false

运行容器的命令:我正在使用docker-compose运行它:

zeppelin:
    container_name: "${DATARPM_ZEPPELIN_CONTAINER_NAME}"
    image: "${DOCKER_REGISTRY}/zeppelin:${DATARPM_ZEPPELIN_TAG}"
    network_mode: "${CONTAINER_NETWORK}"
    mem_limit: "${DATARPM_ZEPPELIN_MEM_LIMIT}"
    env_file: datarpm-etc.env
    links:
      - "xyz"
      - "abc"
    environment:
      - "VOL1=${VOL1}"
      - "constraint:node==${DATARPM_ZEPPELIN_HOST}"
    volumes:
      - "${VOL1}:${VOL1}:rw"
    entrypoint: ["/bin/bash", "-c", '<some command here>']

共有1个答案

南门焱
2023-03-14

似乎纱线和火花需要能够在网络上直接看到对方。如果你能把它们放在同一个覆盖网络上,所有的东西都能直接交流,如果不能...

可以通过所有覆盖容器都连接到的docker_gwbridge将数据直接路由到Docker节点上的覆盖网络中,but,这是一个很大的but,只有在容器运行的Docker节点上才起作用。

因此,在2个节点的非群模式覆盖10.0.9.0/24网络上运行2个容器······

docker@mhs-demo0:~$ sudo ip ro add 10.0.9.0/24 dev docker_gwbridge
docker@mhs-demo0:~$ ping -c 1 10.0.9.2
PING 10.0.9.2 (10.0.9.2): 56 data bytes
64 bytes from 10.0.9.2: seq=0 ttl=64 time=0.086 ms
docker@mhs-demo0:~$  ping -c 1 10.0.9.3
PING 10.0.9.3 (10.0.9.3): 56 data bytes
^C
--- 10.0.9.3 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
docker@mhs-demo1:~$ sudo ip ro add 10.0.9.0/24 dev docker_gwbridge
docker@mhs-demo1:~$ ping 10.0.9.2
PING 10.0.9.2 (10.0.9.2): 56 data bytes
^C
--- 10.0.9.2 ping statistics ---
2 packets transmitted, 0 packets received, 100% packet loss
docker@mhs-demo1:~$  ping 10.0.9.3
PING 10.0.9.3 (10.0.9.3): 56 data bytes
64 bytes from 10.0.9.3: seq=0 ttl=64 time=0.094 ms
64 bytes from 10.0.9.3: seq=1 ttl=64 time=0.068 ms

因此,最大的问题是网络需要知道容器在哪里运行,并相应地路由数据包。如果网络能够实现这样的路由,那么您可能一开始就不需要覆盖网络。

另一种可能是在每个带有可路由IP的Docker节点上使用普通桥网络。因此,每个网桥都有一个指定的IP范围,您的网络可以从任何地方路由到该范围。

192.168.9.0/24        10.10.2.0/24
Yarn                  DockerC

             router

10.10.0.0/24          10.10.1.0/24     
DockerA               DockerB          

将把一个网络连接到每个节点。

DockerA:$ docker network create --subnet 10.10.0.0/24 sparknet
DockerB:$ docker network create --subnet 10.10.1.0/24 sparknet
DockerC:$ docker network create --subnet 192.168.2.0/24 sparknet
 类似资料:
  • 问题内容: 我创建了我的第一个Docker容器,它使用Go运行服务器,但是无法从主机外部访问它。我刚开始使用docker,所以在这里有点迷路了。 因此,我有一个非常简单的Go代码来启动服务器,我构建了Docker映像,该映像安装了Go并在Linux基本映像中构建了代码。我在端口8080上运行服务器,因此我将该端口暴露给运行容器的主机,如下所示: 那行得通, 我可以通过docker的机器IP ( 启

  • 问题内容: 我看到很多人都在为此苦苦挣扎,好像在redis容器映像中可能有一个错误,而其他人似乎在追寻类似的问题。 我在DockerHub上使用标准Redis映像。(https://github.com/dockerfile/redis) 像这样运行它: 进入服务器后,就可以启动服务器,并从容器映像进行Redis ping了。 不幸的是,我无法从主机连接到Redis容器。 我已经尝试设置,例如下面

  • 我在用“docker外面的docker”和jenkins运行一个容器。我的docker是: 所以所有从“jenkins容器”启动的容器都在主机中运行。 但是,当我试图在需要卷的作业中运行“jenkins容器”中的docker compose时,它采用的是来自主机的路径,而不是jenkins的路径。我是说,当我和docker合作时 它安装在主机的/var/jenkins_home/workspace

  • 问题内容: 我建立了一个kafka docker容器并使用docker-compose对其进行编排。 打电话给我下面的putput: 我可以从docker容器内部运行生产者和使用者,但是不能在docker网络外部运行。 例如 : 我在本地主机上运行kafka生产者,出现以下错误: 这是我在github上的kafka docker示例,其中包含上述问题。 那么,有人遇到同样的问题并且可以以任何方式帮

  • 环境详细信息 Windows 10 Docker桌面 Spring Boot(在容器内使用) RabbitMQ(作为服务安装在我的windows机器上) 我想从Spring Boot Container访问RabbitMQ服务。我在里面提供了下面的属性application.properties 我正在运行我的Spring启动应用程序 docker run-p 8083:8083 dockerde

  • 我的主机是Windows 10 安装了运行Ubuntu的虚拟机 启动VM后,我为Ubuntu安装了docker Pull images(odoo和postgres),并通过localhost:8069成功启动了odoo应用程序。我切换回我的主机Windows 10。 如何从Windows 10连接我的odoo应用程序 此外,我的同事如何在同一网络上访问我的odoo应用程序 希望你能帮助我,谢谢:)