【发布时间】:2016-09-11 08:02:20
【问题描述】:
我有一个在覆盖网络上运行的 docker 容器。我的要求是从不同的主机外部访问此容器中运行的服务。服务绑定到容器的内部 IP 地址,在这种情况下,将端口绑定到主机不是解决方案。
实际场景:
在容器内运行的服务是 spark driver 配置有 yarn-client。火花驱动程序绑定到容器内部 IP(10.x.x.x)。当 spark 驱动程序与运行在不同集群上的 hadoop yarn 通信时,yarn 上的应用程序主控 尝试与驱动程序容器内部 ip 上的 spark 驱动程序进行通信,但由于明显的原因它无法连接内部 IP 上的驱动程序.
请告诉我是否有办法实现从应用程序主机(纱线)到火花驱动程序(docker 容器)的成功通信。
Swarm 版本:1.2.5
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>']
【问题讨论】:
-
我不知道您使用的是什么版本的 swarm。发布您的
docker info。同时发布您用于创建容器和服务的代码。 -
好的,所以您使用的是旧版 Swarm,而不是新的“swarm 模式”。 “network_mode:”设置为什么?此外,“链接:”条目也是不适用于覆盖网络的遗留内容,假设您使用
version: "2"作为撰写文件(我无法从您发布的内容中判断,因为它只是一个 sn-p而不是整个文件)。 -
@Alkaline:network_mode 设置为用户创建的覆盖网络。此处链接的目的是确保应用程序的所有容器的启动顺序。如果我们可以在撰写文件中以其他方式定义序列,我不需要链接。你是对的,我使用的是版本:2。
-
depends_on可用于依赖项。links在带有网络的版本 2 配置中仍然有效,它们只是不做他们习惯做的事情。 -
@Matt 我应该写的是链接现在已经过时了。除非用于定义别名(据我所见,很少有人这样做),否则他们根本不做任何事情。
depends_on可用于依赖项,但请记住它们非常有限。他们只检查容器是否正在运行,而不是容器内的应用程序是否准备就绪。
标签: hadoop apache-spark docker hadoop-yarn