1. 程式人生 > >nginx-proxy 自動反向代理

nginx-proxy 自動反向代理

docker 使得部署應用非常的方便,真正的讓在單機部署多個應用成為一鍵化操作。然而,如果單機中有多個應用需要對外提供服務,用 docker 有時候感覺並不是那麼優雅。

如果在單機中需要部署多個應用,而這些應用需要佔用同一個埠,比如多個 web 應用同時需要 80/443 埠,或者希望對於來自同一個域名的流量進行 load balance,希望這些流量可以被分發到不同的容器上。這些常見的場景,目前操作起來並不方便。

對於上述場景,常見的做法就是在本地部署一個 nginx,每當有 docker 容器更新的時候,便修改 nginx 的配置檔案,使滿足需求。

方法很簡單,但是繁瑣,如果有工具可以把這些操作自動化,那麼在使用 docker 的時候,是不是可以節省很多精力。在 daocloud hub 裡,的確有這麼一樣工具,即是

nginx-proxy。這是一個會自動獲取容器配置並做好反向代理和負責均衡的 nginx。

部署 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


歡迎到微信裡去當吃瓜群眾