尝试从主机连接到 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)。
- 并实例化我使用的 master:
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
容器,手动工作就会丢失。)
我必须在我的分布式系统 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)。
- 并实例化我使用的 master:
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
容器,手动工作就会丢失。)