尝试从主机连接到 docker 容器内的 python 套接字

Trying to connect to a python socket inside a docker container from host

我必须在我的分布式系统 class 中实施 Berkeley 算法,我选择在 python 中使用套接字来实现。主人应该 运行 在主机和 docker 容器中的奴隶。

我从主机(作为主机)连接到容器(作为从机)最接近的是使用 -p 9000:9000 标志公开端口 运行 连接容器,主机成功连接到容器但不接收或发送任何东西(对于容器也是如此)我得出的结论是进程内的 python 套接字根本没有从端口接收数据包。我已经尝试使用 -net=host 标志,但主机根本找不到容器。我取得的一个进步是实例化两个 docker 容器并使用 /etc/hosts 中提供的主机名从另一个容器 ping 一个,但这不是我真正想要的。

如果您需要源代码,我在 github 中有完整的代码。代码以英文注释,但文档以葡萄牙语

总结一下我想做的就是在docker容器中打开一个带有python的套接字并且能够到达主机,我需要做什么样的网络配置能做到吗?

编辑:更多信息

以下 bash 脚本用于实例化三个 docker 容器,然后对每个容器执行命令以克隆我的存储库,cd 到其中并进入包含 bash 执行从机然后在主机启动主机:

docker run -it -d -p 127.0.0.1:9000:9000/tcp --name slave1 python bash
docker run -it -d -p 127.0.0.1:9001:9001/tcp --name slave2 python bash
docker run -it -d -p 127.0.0.1:9002:9002/tcp --name slave3 python bash

docker exec -t -d slave1 bash -c 'git clone https://github.com/guilhermePaciulli/BerkeleyAlgorithm.git;cd BerkeleyAlgorithm;git pull;cd test;bash slave_1.sh'
sleep 1
docker exec -t -d slave2 bash -c 'git clone https://github.com/guilhermePaciulli/BerkeleyAlgorithm.git;cd BerkeleyAlgorithm;git pull;cd test;bash slave_2.sh'
sleep 1
docker exec -t -d slave3 bash -c 'git clone https://github.com/guilhermePaciulli/BerkeleyAlgorithm.git;cd BerkeleyAlgorithm;git pull;cd test;bash slave_3.sh'
sleep 1

bash test/master.sh

为了启动每个实例,我使用另一个 bash 命令

python ../main.py -s 127.0.0.1:9000 175 logs/slave_log_1.txt

-s 是一个标志,告诉 main.py class 这是一个从站,127.0.0.1:9000 是这个从站要监听的 ip 和端口(和master 将要连接),其余只是配置(此示例用于第一个 slave)。

python ./main.py -m 127.0.0.1:8080 185 15 test/slaves.txt test/logs/master_log.txt

就像slave一样-m告诉main这是一个master,127.0.0.1:8080是master要连接到slave的ip和端口,其余的只是配置。

我查看了您的代码,发现您创建了服务器套接字并将其绑定到端口并进行监听,但我找不到您调用 socket.accept() 方法的位置?

当您在 Docker 容器内 运行 一个 server-type 进程时,需要将其配置为侦听特殊的 "all interfaces" 地址 0.0.0.0。每个容器都有自己的 localhost 或 127.0.0.1 的概念,如果您将进程设置为侦听或绑定到 127.0.0.1,则只能从其自己的 localhost 访问它,这与所有容器都不同其他容器的 localhost 和主机的 localhost.

在您显示的服务器命令中,您运行类似于

python ../main.py -s 0.0.0.0:9000 175 logs/slave_log_1.txt

(严格考虑构建一个 Docker 文件来描述如何构建和启动你的镜像。启动一堆空容器,git clone 放入每个容器,然后手动启动进程是很多一旦你 docker rm 容器,手动工作就会丢失。)