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

2024-04-23 06:47:21 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

如果您需要源代码,我已经在github中保存了整个代码。代码是用英语注释的,但是文档是葡萄牙语的

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

编辑:更多信息

下面的bash脚本用于实例化三个docker容器,然后在每个容器中执行一个命令,将my repo、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命令

  • 要实例化slave,我使用:
^{pr2}$

s是一个标志,用来告诉主.py类表示这是一个从机,127.0.0.1:9000是这个从机将要侦听的ip和端口(主机将要连接),其余的只是配置(此示例用于第一个从机)。在

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

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


Tags: 实例端口dockerruntestgitgithubbash
2条回答

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

在Docker容器中运行服务器类型的进程时,需要将其配置为监听特殊的“所有接口”地址0.0.0.0。每个容器都有自己的localhost或127.0.0.1的概念,如果您将一个进程设置为侦听或绑定到127.0.0.1,则只能从它自己的localhost访问它,这与所有其他容器localhost和主机的{}不同。在

在您展示的服务器命令中,您可以运行类似

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

(严格考虑构建一个Dockerfile来描述如何构建和启动您的映像。启动一堆空容器,git clone到每个容器中,然后手动启动进程,这是一项大量的手动工作,一旦您docker rm容器就会丢失。)

相关问题 更多 >