0%

docker实践14:负载均衡容器

NGINX Proxy

这个场景中,我们需要运行一个Nginx服务器,当有新的容器被加载的时候,他会自动发现并更新负载均衡配置。很幸运的是,这些已经被nginx-proxy完成了。

nginx-proxy接收HTTP请求,然后基于Host名代理到合适的容器。这个处理对于用户是透明的,不会产生额外的消耗。

属性配置

当运行代理容器的时候有3个主要的属性必须要配置。

第一个:使用*-p 80:80*把容器绑定到主机的80端口。这会确保所有的HTTP请求会通过代理处理。

第二个:挂载docker.sock文件。连接到主机上运行的Docker后台进程(daemon),并且允许容器通过API的方式访问元数据。ngxin-proxy以此监听事件,并基于容器的IP地址来更新nginx配置。挂载文件与挂载目录的方式相同,*/var/run/docker.sock:/tmp/docker.sock:ro*。指定 :ro 来将文件设置为只读。

最后一个:设置选项-e DEFAULT*HOST=*。当请求进入后,并且请求没有指定的host,那么这个容器就是处理请求的容器。这样就可以在一台机器上运行不同的域名的多个web服务了。

任务

使用下面的语句来启动nginx-proxy。

1
docker run -d -p 80:80 -e DEFAULT_HOST=proxy.example -v /var/run/docker.sock:/tmp/docker.sock:ro --name nginx jwilder/nginx-proxy

因为使用了DEFAULT_HOST,进来的所有请求都会被定向到指定了Host是proxy.example的容器。

请求

使用下面的语句访问web服务器,因为还没有容器,会返回503错误。

1
curl http://docker

单主机

Nginx-proxy 现在正在监听Docker的事件。这里假设已经建立了一个叫katacoda/docker-http-server的示例web服务器,它会返回机器名。可以用这个测试代理是否正常运行。它内部其实是一个运行在80端口上的PHP和Apache2的应用程序。

启动容器

设定容器的环境变量VIRTUAL_HOST ,Nginx-proxy就可以向容器发送请求了。这个变量定义请求来源的host,然后容器就可以处理请求了。

这个场景中,我们设置和DEFAULT_HOST相同的Host,来处理所有的请求。

1
docker run -d -p 80 -e VIRTUAL_HOST=proxy.example katacoda/docker-http-server

测试

Nginx有时需要一些时间来重新加载。

发送请求,就会发现请求被我们的容器处理了。

集群

现在已经建立了一个容器来处理请求。如果再建立一个容器并使用相同的VIRTUAL_HOST,那么nginx-proxy就会配置成round-robin的负载均衡模式。第一个请求由第一个容器处理,第二个请求由第二个容器处理。循环往复。节点数量没有限制。

任务

用之前相同的命令启动另一个容器。

1
docker run -d -p 80 -e VIRTUAL_HOST=proxy.example katacoda/docker-http-server

测试

如果请求到代理,那么第一次会被第一个容器处理,第二次会被第二个容器处理。

生成的Nginx配置

nginx-proxy已经自动的创建和配置好了nginx。如果想查看最后生成的配置是什么样的话,可以使用下面的命令查看。

1
docker exec nginx cat /etc/nginx/conf.d/default.conf

关于它重载配置的其他详细信息可以使用logs命令。

1
docker logs nginx

欢迎关注我的其它发布渠道