python - 无法在 docker 内创建套接字

标签 python docker

我有一个安装了 python(2.7) 的 ubuntu docker 镜像。我正在尝试在图像中创建一个 python 套接字服务器。我在启动容器时将主机的 IP 作为环境变量传递。这就是我启动容器的方式:

docker run -it -e host_ip=`hostname -I | awk '{ print $1 }'` ubuntu

进入我的容器后,我运行这个 python 脚本:
import socket
import os
host_ip = os.environ['host_ip']
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host_ip, 9876))
s.listen(10)
while 1:
    conn, addr = s.accept()
    data = conn.recv(1024)
    print data
    conn.send(str.encode('hello world\nbye world'))
    conn.close()
    if data == "EOF":
        break
s.close()

运行脚本时,这是我得到的错误:

Traceback (most recent call last): File "SocketServer.py", line 5, in s.bind((host_ip, 9876)) File "/usr/lib/python2.7/socket.py", line 228, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 99] Cannot assign requested address



我在做什么错?

最佳答案

默认情况下,容器与主机网络堆栈隔离。分配给主机网络接口(interface)的地址对容器不可用。这是使其成为容器的部分原因。

您应该绑定(bind)到容器的地址并安排将端口从主机转发到容器,或者您应该使容器共享主机网络。

例如,告诉应用程序绑定(bind)到 127.0.0.1,然后转发端口:

docker run -it -e host_ip=127.0.0.1 -p 9876:9876 ...

或者让容器使用宿主网络:
docker run -it -e host_ip=127.0.0.1 --network=host ...

关于python - 无法在 docker 内创建套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57809997/

相关文章:

python - Django order_by字段总和

python - 更改菜单名称 openerp

mysql - NodeJS和Sequelize在docker compose中无法连接到MySQL

docker - 在hadoop-3.1.3中运行一个mapper和reducer程序

python - 通过python中的自定义比较器对元组列表进行排序

python - Python 何时检查 ABC 的具体子类是否实现了所需的方法?

Python 和 Pandas : Find a dict within a list according to a key's value

Postgresql docker 卷在 Windows 上失败

clojure - 从另一个容器连接到在 Docker 容器中运行的 headless nREPL

docker - “docker container rm <CONTAINER-ID>”和“docker rm <CONTAINER-ID>”