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

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

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

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

这样我可以从我的电脑terminal做到:

 curl http://hostIP:80/foobar 

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

你可以暴露多个端口,例如

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

或者在你的API容器前放置一个代理( nginx ,apache,varnish等)。

更新

做一个代理的最简单的方法是将其链接到API容器,例如具有apacheconfiguration

 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相当静态)。 如果这成为一个问题,你可以看看像无花果或autoupdated代理configuration的方法: http : //jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/ 。 后面的链接也显示用nginx代理。

更新II:

在更现代的docker版本中,可以使用用户定义的networking来代替上面显示的链接,以克服不赞成使用的链接机制的一些不便之处。

一次只允许一个进程绑定到一个端口。 所以运行多个容器意味着每个将暴露在不同的端口号。 Docker可以通过使用“-P”属性为你自动完成。

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

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