摘要:一個反向代理可以幫助處理這些問題,同時通過減輕零停機部署的困難來提升可用性。生成反向代理配置文件當一個容器被啟動和停止的時候,設置一個反向代理配置可能是復雜的。這些可以被用于自動地生成一個反向代理配置。
自動化 Nginx 反向代理 Docker
標簽(空格分隔): Docker Nginx Automated
為什么 Docker 要使用反向代理本文作者是 jwilder,原文地址是 Automated Nginx Reverse Proxy for Docker
Docker 容器被分配隨機 IP 和端口,這使得從客戶端角度來尋址它們是非常復雜的。默認,IP 和端口是專用于主機的,并且不能被外部訪問除非它們被綁定到主機上。
綁定容器到主機端口可以防止多個容器在同一個主機上運行。比如,在同一時間僅僅只有一個容器可以被綁定到 80 端口。這也使得新版本的容器無停機的推出復雜化了,因為老版本必須在新版本啟動之前先停止。
一個反向代理可以幫助處理這些問題,同時通過減輕零停機部署的困難來提升可用性。
生成反向代理配置文件當一個容器被啟動和停止的時候,設置一個反向代理配置可能是復雜的。通常的配置需要手動更新,這容易出錯并且費時。
幸運的是,Docker 提供了一個遠程 API 來 inspect containers 和訪問他們的 IP,端口和其他配置元數據。另外,它也提供一個實時事件 API可以被用于通知什么時候容器被啟動和停止。這些 API 可以被用于自動地生成一個反向代理配置。
docker-gen 是一個使用這些 API 的小工具,并導出容器的元數據到模板中。模板被渲染以及一個可選的通知命令可以被運行來重起服務。
使用 docker-gen,我們可以自動的生成 Nginx 的配置并重載 Nginx當它們改變的時候。同樣的方法可被用于 Docker 日志管理。
Nginx 反向代理 Docker這個例子 Nginx 模板可以被用于生成一個 Docker 容器使用虛擬主機路由的反向代理配置文件。這個模板是使用 golang text/template package 實現的。它使用一個通用的 groupBy 模板函數通過它們的 VIRTUAL_HOST 環境變量來分組運行的容器。這簡化了遍歷容器來生成一個負載均衡后端以及使得零停機部署可行。
{{ range $host, $containers := groupBy $ "Env.VIRTUAL_HOST" }} upstream {{ $host }} { {{ range $index, $value := $containers }} {{ with $address := index $value.Addresses 0 }} server {{ $address.IP }}:{{ $address.Port }}; {{ end }} {{ end }} } server { #ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name {{ $host }}; location / { proxy_pass http://{{ $host }}; include /etc/nginx/proxy_params; } } {{ end }}
這個模板可以使用 docker-gen 來運行:
docker-gen -only-exposed -watch -notify "/etc/init.d/nginx reload" templates/nginx.tmpl /etc/nginx/sites-enabled/default
-only-exposed - 僅僅使用容器已經暴露的端口。
-watch - 啟動之后,監控 docker 容器事件和重新生成模板。
-notify "/etc/init.d/nginx reload" - 在模板生成后重載 nginx 配置。
templates/nginx.tmpl - nginx 模板。
/etc/nginx/sites-enabled/default - 目標文件。
這是兩個容器配置了 VIRTUAL_HOST=demo1.localhost 和 VIRTUAL_HOST=demo2.localhost 的渲染模板。
upstream demo1.localhost { server 172.17.0.4:5000; server 172.17.0.3:5000; } server { #ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name demo1.localhost; location / { proxy_pass http://demo.localhost; include /etc/nginx/proxy_params; } } upstream demo2.localhost { server 172.17.0.5:5000; } server { #ssl_certificate /etc/nginx/certs/demo.pem; #ssl_certificate_key /etc/nginx/certs/demo.key; gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name demo2.localhost; location / { proxy_pass http://demo2.localhost; include /etc/nginx/proxy_params; } }試驗
我使用這個設置創建了一個可信任的構建來使得它非常容易試驗。
運行 nginx-proxy 容器:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t jwilder/nginx-proxy
使用一個 VIRTUAL_HOST 環境變量啟動你的容器:
docker run -e VIRTUAL_HOST=foo.bar.com -t ...總結
為 docker 容器生成 nginx 反向代理配置可以通過使用 Docker APIs 和一些基礎的模板自動化,這可以簡化部署同時提升可用性。
雖然這非常適用于單臺主機上運行的容器,為遠程主機生成配置需要自動發現。看一下 Docker 自動發現 對這個問題的解決。
更新:這有一些類似觀點和變種的其他文章值得一看:
Using Nginx, Confd, and Docker for Zero-Downtime Web Update - Brian Ketelsen
Docker Events - Michael Crosby
Haproxy As A Static Reverse Proxy for Docker Containers - Oskar Hane
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26354.html
摘要:一個反向代理可以幫助處理這些問題,同時通過減輕零停機部署的困難來提升可用性。生成反向代理配置文件當一個容器被啟動和停止的時候,設置一個反向代理配置可能是復雜的。這些可以被用于自動地生成一個反向代理配置。 自動化 Nginx 反向代理 Docker 標簽(空格分隔): Docker Nginx Automated 本文作者是 jwilder,原文地址是 Automated N...
摘要:一下載鏡像我這里用的是輕量級的鏡像下載完成后,通過命令檢查一下鏡像是否下載成功二先以簡單的方式運行鏡像以后臺方式運行鏡像指定容器的名稱為命令執行完成后,通過命令確認一下容器是否啟動成功。 歡迎關注個人微信公眾號: 小哈學Java, 文末分享阿里 P8 高級架構師吐血總結的 《Java 核心知識整理&面試.pdf》資源鏈接!!個人網站: https://www.exception.sit...
摘要:一下載鏡像我這里用的是輕量級的鏡像下載完成后,通過命令檢查一下鏡像是否下載成功二先以簡單的方式運行鏡像以后臺方式運行鏡像指定容器的名稱為命令執行完成后,通過命令確認一下容器是否啟動成功。 歡迎關注個人微信公眾號: 小哈學Java, 文末分享阿里 P8 高級架構師吐血總結的 《Java 核心知識整理&面試.pdf》資源鏈接!!個人網站: https://www.exception.sit...
摘要:很多人反應很難訪問,所以轉移到阿里云服務器上,因此做了一次完整的容器部署。在容器化過程中,我們并未配置任何等,只是保留服務所需的配置項而已,而這一部分我們可以放在反向代理層完成。 很多人反應很難訪問 Github Page,所以 ng-alain.com 轉移到阿里云服務器上,因此做了一次完整的 Angular 容器部署。 以下我會闡述 ng-alain 整個過程,其中包括 Docke...
摘要:很多人反應很難訪問,所以轉移到阿里云服務器上,因此做了一次完整的容器部署。在容器化過程中,我們并未配置任何等,只是保留服務所需的配置項而已,而這一部分我們可以放在反向代理層完成。 很多人反應很難訪問 Github Page,所以 ng-alain.com 轉移到阿里云服務器上,因此做了一次完整的 Angular 容器部署。 以下我會闡述 ng-alain 整個過程,其中包括 Docke...
閱讀 1330·2019-08-30 15:44
閱讀 1380·2019-08-29 18:42
閱讀 432·2019-08-29 13:59
閱讀 769·2019-08-28 17:58
閱讀 2810·2019-08-26 12:02
閱讀 2414·2019-08-23 18:40
閱讀 2405·2019-08-23 18:13
閱讀 3106·2019-08-23 16:27