两个Docker映像之间的通信

时间:2019-01-23 12:56:33

标签: docker apache-spark cassandra pyspark

我有一个名为spark spark-docker的spark码头工人镜像和cassandra官方docker镜像cassandra。我想从spark-docker运行一个火花提交作业,它将在cassandra中写入数据。

Dockerfile的{​​{1}}如下:

spark-docker

我正在使用以下命令来做到这一点。

FROM bde2020/spark-python-template:2.4.0-hadoop2.7

MAINTAINER Rafiul

RUN pip install --upgrade pip
RUN pip install pyspark cassandra-driver

这将从docker run -ti --network=dockers_default spark-dcoker:latest /spark/bin/spark-submit --conf spark.cassandra.connection.host=cassandra --packages datastax:spark-cassandra-connector:2.4.0-s_2.11 /app/data_extractor.py -f /app/dataset.tar 中提取数据,并将数据保存在cassandra中。

但是我遇到了以下错误

dataset.tar

在我的python代码中,我这样做:

cassandra.cluster.NoHostAvailable: ('Unable to connect to any servers', {'127.0.0.1': error(111, "Tried connecting to [('127.0.0.1', 9042)]. Last error: Connection refused")})

如何获取运行cassandra的IP地址和端口号并将其放入我的python代码中,以便它可以连接到cassandra?

1 个答案:

答案 0 :(得分:1)

除非您不使用127.0.0.1,否则不能使用network=host从一个容器连接到另一个容器。

因此,您执行以下操作之一:

启动容器时切换到network=host模式(此模式不需要端口暴露)

或者(更好)将两个容器加入网络中,并使用容器名称作为主机名称来在它们之间进行连接:

docker network create foo
docker run --network=foo -d  --name=cassy cassandra
docker run --network=foo -ti --name=spark spark-docker:latest ...

请注意name参数-这允许容器使用易于理解的名称。 现在,您可以从spark使用主机名cassy而不是ip连接到cassandra