nginx-proxy 自動反向代理
docker 使得部署應用非常的方便,真正的讓在單機部署多個應用成為一鍵化操作。然而,如果單機中有多個應用需要對外提供服務,用 docker 有時候感覺並不是那麼優雅。
如果在單機中需要部署多個應用,而這些應用需要佔用同一個埠,比如多個 web 應用同時需要 80/443 埠,或者希望對於來自同一個域名的流量進行 load balance,希望這些流量可以被分發到不同的容器上。這些常見的場景,目前操作起來並不方便。
對於上述場景,常見的做法就是在本地部署一個 nginx,每當有 docker 容器更新的時候,便修改 nginx 的配置檔案,使滿足需求。
方法很簡單,但是繁瑣,如果有工具可以把這些操作自動化,那麼在使用 docker 的時候,是不是可以節省很多精力。在 daocloud hub 裡,的確有這麼一樣工具,即是
部署 nginx-proxy
首先需要把共享使用的埠預留給 proxy,比如 80、443 埠,這樣,就可以讓打在這兩個埠上的流量由 proxy 來分配。其次,因為 proxy 需要獲取 docker 容器的配置進行對 nginx 的配置檔案修改,因此,需要把 docker.sock
對映到容器中。
docker 啟動命令
docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro daocloud.io/daocloud/nginx-proxy
建議使用 compose 來配置,yml檔案如下:
proxy:
image: daocloud.io/daocloud/nginx-proxy:0.3.6
privileged: false
restart: always
ports:
- 443:443
- 80:80
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
反向代理
對於配置好 proxy 的主機,每當在主機上啟動一個容器的時候,proxy 都會自動檢查該容器是否含有 VIRTUAL_HOST
這個環境變數,當檢查到某個剛啟動的容器含有這個環境變數時,便會自動修改配置檔案,使得這個來自 環境變數描述的域名
那麼,在啟動容器的時候,只需要新增一個環境變數,比如:
hypo_blog:
image: daocloud.io/cmss/hypo-blog:master-796038f
privileged: false
restart: always
ports:
- '4000'
environment:
- VIRTUAL_HOST=blog.ihypo.net
負載均衡
當有多個容器含有相同的 VIRTUAL_HOST
的時候,proxy 便會自動做好負載均衡,如果使用 daocloud 的話:
只需要在容器介面調整容器個數,proxy 會自動做好 load balance。
如果進入 proxy 容器中檢視的話,也可以看到生成的配置檔案:
upstream blog.ihypo.net {
# dao_hypo_blog_2
server 192.168.0.6:4000;
# dao_hypo_blog_1
server 192.168.0.4:4000;
}
其他
nginx-proxy 的使用非常簡單,還支援多域名,多埠,https 等,可以參考映象的 README
歡迎到微信裡去當吃瓜群眾