繁体   English   中英

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

[英]Trying to connect to a python socket inside a docker container from host

我必须在我的分布式系统类中实现Berkeley算法,我选择在带有套接字的python中实现它。 主设备应该在主机和奴隶容器中的从设备中运行。

从主机(作为主设备)连接到容器(作为从设备)的最接近的是使用-p 9000:9000标记暴露端口运行容器,主机成功连接到容器但没有收到或发送任何东西(与容器相同的东西),我得出结论,进程内的python套接字只是没有从端口接收数据包。 我已经尝试过使用-net=host flag但是主机根本找不到容器。 我的一个进步是实例化两个docker容器并使用/etc/hosts提供的主机名相互ping通,但这不是我真正想要的。

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

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

编辑:更多信息

下面的bash脚本用于实例化三个docker容器,然后在每个docker容器中执行一个命令来克隆我的repo,cd进入它并进入一个包含bash的测试文件夹来执行slave,然后在主机上启动master:

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类这是一个slave的标志,127.0.0.1:9000是这个slave要监听的ip和端口(并且master将要连接),其余的是只是配置(这个例子用于第一个奴隶)。

  • 并实例化我使用的主人:
python ./main.py -m 127.0.0.1:8080 185 15 test/slaves.txt test/logs/master_log.txt

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

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

在Docker容器中运行服务器类型进程时,需要将其配置为侦听特殊的“所有接口”地址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

(请仔细考虑构建一个Dockerfile来描述如何构建和启动您的映像。启动一堆空容器, git clone到每个容器,然后手动启动进程是很多手动工作,一旦你docker rm容器就丢失了。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM