我有一个ubuntu对接映像,其中安装了python(2.7)。我正试图在映像中创建一个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()
在运行脚本时,我会得到以下错误:
回溯(最近一次调用):文件"SocketServer.py",第5行,在s.bind((host_ip,9876) File "/usr/lib/python2.7/socket.py“中,第228行,在meth返回getattr(self._sock,name)(*args) socket.error: Errno 99不能指定请求的地址
我犯了什么错?
发布于 2019-09-05 09:00:49
默认情况下,容器与主机网络堆栈隔离。分配给主机网络接口的地址对容器不可用。这是使它成为一个容器的部分原因。
您应该绑定到容器的地址,并安排将端口从主机转发到容器,或者让容器共享主机网络。
例如,告诉应用程序绑定到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 ...
https://stackoverflow.com/questions/57809997
复制相似问题