docker集装箱内部服务器应用程序

我了解到,为了将运行在Docker容器中的服务器公开到外部环境中,使用docker run ,通过添加一些参数,可以将端口转发到主机。

我的问题是不同的,我有一些应该都应该在docker集装箱内运行,并应使用networking之间进行通信 ,而他们都在容器上运行。

是否有可能在docker容器上运行这些内部服务器,并使用localhost:PORT ,指的是“容器的IP地址” localhost (或127.0.0.1 )之间进行通信?

容器内的localhost将parsing为该容器的networking堆栈。 所以,如果你所有的服务器运行在同一个容器中,他们使用相同的networking堆栈,并且能够通过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 

也就是说,如果两个容器不共享networking堆栈(通常是这种情况),他们将无法通过localhost与另一个进行通信。

如果您计划在一个docker集装箱内运行所有应用程序,请不要这样做。 使用Docker的目的之一就是将应用程序彼此隔离,将所有应用程序放在一个容器中将带来更多的麻烦而不是好处,例如,如果您只想升级其中一个应用程序,则会更困难。

如果你真的需要/必须把它们放到一个容器中,然后使用localhost:port就可以让它们相互通信,就像它们在一台机器上运行一样。

如果你决定在分开的容器中运行它们,甚至可能在多台机器上运行它们,这个问题将发生在多容器通信上,这是一个很大的话题。 您拥有的选项包括:

  • Docker多主机networking,基本上你需要一些dockernetworking驱动程序将多个主机上的docker连接在一起,然后容器可以通过容器名称或主机名称相互连接

    有很多资源在谈论这个,你可以参考以下链接获取更多信息:

    • 覆盖networking
    • 了解dockernetworking驱动程序和用例
    • 编织司机
    • 绒布
  • 跳过Docker多主机联网,将您的服务端口映射到随机主机端口,然后使用一种service discovery服务来促进通信。 实际上在我们公司,我们使用Mesos来pipe理集群, 马拉松来部署我们的服务,然后使用Bamboo作为服务发现和LB,他们一起工作得很好。

这是我的想法的一些分享,希望它可以帮助你。