Automated Nginx Reverse Proxy for Docker

現在的維運人員實在太幸福了,甚至是開發人員也是,在以前必須要設置一堆東西才能做到 Reverse Proxy,現在就有非常簡易且自動的方式完成,這邊就要介紹一下,如何讓 docker 可以自動做到 Reverse Proxy。

相關細節請參考下面連結:

附上 docker compose 設定方式

docker compose

web_01:  
  container_name: hmi-web-01
  image: node:4
  command: "/bin/bash -l -c 'npm start'"
  expose:
    - "3000"
  working_dir: /app
  volumes:
    - ./:/app

  environment:
    - "VIRTUAL_HOST=192.168.99.119"
    - "APP_NAME=hmi-web-01"

  restart: always

web_02:  
  container_name: hmi-web-02
  image: node:4
  command: "/bin/bash -l -c 'npm start'"
  expose:
    - "3000"
  working_dir: /app
  volumes:
    - ./:/app

  environment:
    - "VIRTUAL_HOST=192.168.99.119"
    - "APP_NAME=hmi-web-02"

  restart: always

nginx-proxy:  
  container_name: nginx-proxy
  image: jwilder/nginx-proxy
  ports:
    - "80:80"
  volumes:
    - /var/run/docker.sock:/tmp/docker.sock

  restart: always

其中,跟一般使用 docker ports 的設置不同,我們只要讓 docker container expose port 就好,nginx-proxy 將會自動解析 docker container 的相關資訊進行 port forwarding,而每個實體 server 只要設置環境變數 VIRTUAL_HOST=192.168.99.119 將會自動記行 mapping,就是這麼簡單。

運行範例

docker-compose up -d web-01  
docker-compose up -d web-02  
docker-compose up -d nginx-proxy  

如此就可以自動完成相關設置

執行驗證

我在 sample 中輸出 server 的識別,就如同 docker compose 中所設置,可以看到,我對同一個 ip 進行 reload 將會顯示不同名稱。

如此,一旦其中一個 docker 掛掉,系統將會保持 online,我們只要在 restart 就可以確保系統不會斷線。

實在是太棒了!感謝撰寫這套件的先進!

結論

還記得去年(2015)葉大在 JCConf 中所分享的,

Immutable infrastructure:觀念與實作

其中一張簡報

這件事情,將可以更輕易地做到,一旦有了第一個循環,接著就是不停個改善優化,盡可能地做到長生不敗,與大家分享!

同場加映

Raspberry Pi 用 nginx-proxy

https://hub.docker.com/r/bestlibre/rpi-nginx-proxy/

參考資料

http://www.informaticslab.co.uk/infrastructure/2015/12/09/raspberry-pi-docker-cluster.html

https://github.com/jwilder/nginx-proxy

http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/