我有一个安装了 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/