在容器中利用Nginx-proxy實現多域名的自動反向代理、免費SSL證書

在我的的小項目或者測試環境中,配置反向代理顯得十分繁瑣,而藉助 Nginx-proxy 的鏡像,即便是小白,也能快速實現域名轉發。html

1.域名、IP自動轉發

在開始以前,首先黑進了自家的路由器,將某個域名(甚至不存在),如 dotnet1.nginx-test.com 和 dotnet2.nginx-test.com 指向了局域網內 IP 爲 "192.168.9.10" 的機器上(hosts、iptable等方式)。
接着,假設你已經安裝了 Docker的基礎上,只需再安裝 docker-compose。若是你對這一切一無瞭解的話,可使用daocloud提供的的 一鍵腳本。
回到本文討論的重點,在不寫任何 Nginx 配置的前提下,讓相關的域名指向對應的應用。編寫以下的 docker-compose.yml:nginx

version: '2'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro

  dotnet1:
    image: daocloud.io/koukouge/zhs:master
    container_name: dotnet1
    environment:
      - VIRTUAL_PORT=80 #監聽的端口
      - VIRTUAL_HOST=dotnet1.nginx-test.com,192.168.9.10  #監聽的地址

只須要一句 docker-compose up 就能啓動對應的應用,實現自動轉發。git


 

2.零停機重載域名、IP

在上一節中,咱們已是在後臺啓動了 nginx-proxy 和 dotnet1 的應用,若是咱們在新增或者修改原有的域名呢?假設在原有的 docker-compose.yml 增長一個 2048 的鏡像:github

simple:
    image: alexwhen/docker-2048
    container_name: simple
    environment:
      - VIRTUAL_PORT=80
      - VIRTUAL_HOST=dotnet2.nginx-test.com

這種狀況下,重啓整個 docker-compose 顯然不是最佳的方式。爲了避免影響已經運行中的應用,只需對新增或者須要修改的應用執行以下命令:docker

sudo docker-compose up --build --no-deps -d simple # simple 爲應用的名稱

3. Let's Encrypt 免費證書

隨着網絡安全意識的提升,Https 逐漸成爲互聯網的標配。特別是在國內的網絡環境中,網絡劫持現象愈演愈烈。即便是我的的小博客網站,博主並不接入廣告的狀況下,仍然能夠無心中發現博客中竟然有 "澳門在線賭場" 的廣告,這時候使用 SSL 證書就顯得十分必要了。
Let's Encrypt 是一家致力於推廣 Https 技術的公益組織,其免費證書獲得了幾乎全部瀏覽器的支持,是目前最爲流行、也是最大的免費證書提供者。
一樣的,在咱們以前基礎上,咱們一樣能夠實現對多個域名證書的傻瓜化配置。
在原有的基礎下,咱們將第一節中的 docker-compose.yml 修改成:瀏覽器

version: '2'
services:
  nginx:
    restart: always
    image: nginx
    container_name: nginx
    ports:
    - 80:80
    - 443:443
    volumes:
    - /etc/nginx/conf.d
    - /etc/nginx/vhost.d
    - /usr/share/nginx/html
    - /etc/nginx/certs:/etc/nginx/certs:ro

  dotnet1:
    image: daocloud.io/koukouge/zhs:master
    container_name: dotnet1
    environment:
      - VIRTUAL_PORT=80 #監聽的端口
      - VIRTUAL_HOST=dotnet1.nginx-test.com  #監聽的地址
      - LETSENCRYPT_HOST=dotnet1.nginx-test.com #證書的域名
      - LETSENCRYPT_EMAIL=someone@simple.com #證書全部者的郵箱,快過時時會提醒

  nginx-gen:
    restart: always
    image: jwilder/docker-gen
    container_name: nginx-gen
    volumes:
    - /var/run/docker.sock:/tmp/docker.sock:ro
    - /etc/nginx/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro
    volumes_from:
    - nginx
    entrypoint: /usr/local/bin/docker-gen -notify-sighup nginx -watch -wait 5s:30s
      /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf

  letsencrypt-nginx-proxy-companion:
    restart: always
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: letsencrypt-nginx-proxy-companion
    volumes_from:
    - nginx
    volumes:
    - /var/run/docker.sock:/var/run/docker.sock:ro
    - /etc/nginx/certs:/etc/nginx/certs:rw
    environment:
    - NGINX_DOCKER_GEN_CONTAINER=nginx-gen

先別急着啓動,若是已經啓動了就會發現 nginx-gen應用 缺失了nginx.tmpl 文件。因此咱們須要將其下載並放置在相應的位置:安全

curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > /etc/nginx/nginx.tmpl

最後,只要一聲令下,就能夠發現網站已經成功多了一個綠色的小鎖。網絡


 

4.結語

本文主要是參考 https://github.com/fatk/docker-letsencrypt-nginx-proxy-companion-examplescurl

本文僅僅是針對新手提供的教程,若是你有其餘好的想法或者用法,能夠在評論區點評。測試

相關文章
相關標籤/搜索