我是Docker的新手,我正在尝试在容器中运行我的python程序。
我的程序需要通过套接字连接到服务器才能正常工作。 我已经创建了我的程序的docker镜像及其各自的容器,但是当它到达以下行时它会失败,我不知道为什么。
sock.connect((host, port))
显示以下错误消息:
[Errno -2]名称或服务未知
它在容器外运行得很好。我可能错过了一些非常明显但我无法看到它的东西。
提前致谢。
答案 0 :(得分:4)
除非您已在泊坞广告容器的/etc/hosts
文件中进行设置,否则您不太可能设置正确的主机名。
幸运的是,Docker提供了一种在两个容器之间公开这种信息的好方法 - 环境变量。当您链接两个容器时,它们会自动暴露。
在一个终端:
$ docker run --name camelot -it -p 5000 --rm python
Python 3.5.2 (default, Jul 8 2016, 19:17:03)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import socketserver
>>>
>>> class MyHandler(socketserver.BaseRequestHandler):
... def handle(self):
... self.data = self.request.recv(2048).strip()
... print('{} wrote: '.format(self.client_address[0]))
... print(self.data)
... self.request.sendall(self.data.upper())
...
>>>
>>> server = socketserver.TCPServer(('0.0.0.0', 5000), MyHandler)
>>> server.serve_forever()
在第二个:
$ docker run --rm -it --link camelot python
Python 3.5.2 (default, Jul 8 2016, 19:17:03)
[GCC 4.9.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> import socket
>>>
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> s.connect((os.environ['CAMELOT_PORT_5000_TCP_ADDR'],
... int(os.environ['CAMELOT_PORT_5000_TCP_PORT'])))
>>> s.send(b'Hey dude!')
9
>>> print(s.recv(2048))
b'HEY DUDE!'
>>> s.close()