在個人的小項目或者測試環境中,配置反向代理顯得十分繁瑣,而借助 Nginx-proxy 的鏡像,即使是小白,也能快速實現域名轉發。
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:
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
就能啟動對應的應用,實現自動轉發。
2.零停機重載域名、IP
在上一節中,我們已經是在后臺啟動了 nginx-proxy
和 dotnet1
的應用,如果我們在新增或者修改原有的域名呢?假設在原有的 docker-compose.yml 增加一個 2048 的鏡像:
simple:
image: alexwhen/docker-2048
container_name: simple
environment:
- VIRTUAL_PORT=80
- VIRTUAL_HOST=dotnet2.nginx-test.com
這種情況下,重啟整個 docker-compose 顯然不是最佳的方式。為了不影響已經運行中的應用,只需對新增或者需要修改的應用執行如下命令:
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-examples ***
本文僅僅是針對新手提供的教程,如果你有其他好的想法或者用法,可以在評論區點評。
本文采用 知識共享署名-非商業性使用-相同方式共享 3.0 中國大陸許可協議
轉載請注明:作者 張蘅水