多个 docker 容器作为单个 IP 上的 Web 服务器

Multiple docker containers as web server on a single IP

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

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

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

我可以通过我的计算机终端执行此操作:

curl http://hostIP:80/foobar

但是如何处理多个容器和多个 Web 服务器?

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

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

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

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

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

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

更新:

做代理最简单的方法是 link 它到 API 容器,例如有 apache 配置

RewriteRule ^api1/(.*)$ http://api1/ [proxy]
RewriteRule ^api2/(.*)$ http://api2/ [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 容器,因为代理容器也必须重新启动(links 在 docker 时相当静态).如果这成为一个问题,您可能会考虑像 fig or autoupdated proxy configuration : http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/ 这样的方法。后面的 link 也显示了使用 nginx 进行代理。

更新二:

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