我已经了解到,为了将在docker容器中运行的服务器暴露给外部环境,在使用docker run
时,通过添加一些参数,可以将端口转发到主机。 / p>
我的问题有所不同,我有一些应用程序应该都在docker容器内运行,并且应该使用网络之间进行通信,而它们都在容器上运行。
是否可以在docker容器上运行这些内部服务器并使用localhost:PORT
在它们之间进行通信,并参考"容器的IP地址"作为localhost
(或127.0.0.1
)?
答案 0 :(得分:2)
localhost
将解析为此容器的网络堆栈。因此,如果所有服务器都在同一个容器中运行,那么它们将使用相同的网络堆栈,并且能够通过localhost
相互通信。
docker run -it --rm alpine:3.5 sh
/ # apk add --no-cache py-pip
/ # pip install Flask
/ # cat > flask_server.py << EOS
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
EOS
/ # python flask_server.py &
/ # * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
/ # telnet localhost 5000
GET /
127.0.0.1 - - [04/Apr/2017 12:26:04] "GET /" 200 -
Hello World!Connection closed by foreign host
也就是说,如果两个容器不共享网络堆栈 - 通常就是这种情况 - 它们将无法通过localhost
彼此通信。
答案 1 :(得分:1)
如果您打算在一个docker容器中运行所有应用程序,请不要这样做。使用Docker的目的之一是将应用程序彼此隔离,将所有这些应用程序放在一个容器中会带来更多麻烦而不是好处,例如,如果您只是想升级其中一个应用程序,它将会更加困难
如果你真的需要/必须将它们放入一个容器中,然后使用localhost:port
就可以让它们相互通信,就像它们在一台机器上运行一样。
如果你决定在分开的容器中运行它们,甚至可以在多台机器上运行它们,这个问题转到多容器通信,这是一个很大的话题。你有的选择包括:
Docker多主机网络,基本上你需要一些docker网络驱动程序将多个主机上的docker连接在一起,然后容器可以通过容器名称或主机名相互连接,例如。
有很多资源在讨论这个问题,您可以参考以下链接获取更多信息:
跳过docker多主机网络,将服务端口映射到随机主机端口,然后使用一种service discovery
服务来促进通信。实际上在我们公司,我们使用Mesos来管理群集,marathon来部署我们的服务,然后Bamboo作为服务发现和LB,他们一起工作非常好。
这是我的想法的一些分享,希望它对你有帮助。