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=
任务
使用下面的语句来启动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 |