【问题标题】:Multiple docker containers as web server on a single IP多个 docker 容器作为单个 IP 上的 Web 服务器
【发布时间】:2017-01-23 13:32:16
【问题描述】:

我在一台机器上有多个 docker 容器。每个容器上都运行着一个进程和一个为该进程提供 API 的 Web 服务器。

我的问题是,当默认端口为 80 时,如何从浏览器访问 API?为了能够访问 docker 容器内的 Web 服务器,我执行以下操作:

sudo docker run -p 80:80 -t -i <yourname>/<imagename>

这样我可以在我的电脑终端上做:

curl http://hostIP:80/foobar

但是如何使用多个容器和多个 Web 服务器来处理这个问题?

【问题讨论】:

    标签: docker


    【解决方案1】:

    您可以公开多个端口,例如

    docker run -p 8080:80 -t -i <yourname>/<imagename>
    docker run -p 8081:80 -t -i <yourname1>/<imagename1>
    

    或在您的 API 容器前面放置一个代理(nginx、apache、varnish 等)。

    更新

    进行代理的最简单方法是将其链接到 API 容器,例如有 apache 配置

    RewriteRule ^api1/(.*)$ http://api1/$1 [proxy]
    RewriteRule ^api2/(.*)$ http://api2/$1 [proxy]
    

    你可以像这样运行你的容器:

    docker run --name api1 <yourname>/<imagename>
    docker run --name api2 <yourname1>/<imagename1>
    docker run --link api1:api1 --link api2:api2 -p 80:80 <my_proxy_container>
    

    这可能有点麻烦,但如果您需要重新启动 api 容器,因为代理容器也必须重新启动(链接在 docker 上是相当静态的)。如果这成为问题,您可能会查看 fig 或自动更新代理配置之类的方法:http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/。后面的链接还显示了使用 nginx 进行代理。

    更新二:

    在更现代的 docker 版本中,可以使用 user defined network 代替上面显示的链接来克服已弃用链接机制的一些不便。

    【讨论】:

      【解决方案2】:

      一次只允许一个进程绑定到一个端口。因此运行多个容器意味着每个容器都将暴露在不同的端口号上。 Docker 可以通过使用“-P”属性自动为您执行此操作。

      sudo docker run -P -t -i <yourname>/<imagename>
      

      您可以使用“docker port”和“docker inspect”命令查看分配给每个容器的实际端口号。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-22
        • 1970-01-01
        • 2017-11-25
        • 2016-09-30
        • 2015-06-11
        • 2023-02-03
        • 1970-01-01
        • 2021-10-26
        相关资源
        最近更新 更多