摘要:一個(gè)反向代理可以幫助處理這些問(wèn)題,同時(shí)通過(guò)減輕零停機(jī)部署的困難來(lái)提升可用性。生成反向代理配置文件當(dāng)一個(gè)容器被啟動(dòng)和停止的時(shí)候,設(shè)置一個(gè)反向代理配置可能是復(fù)雜的。這些可以被用于自動(dòng)地生成一個(gè)反向代理配置。
自動(dòng)化 Nginx 反向代理 Docker
標(biāo)簽(空格分隔): Docker Nginx Automated
為什么 Docker 要使用反向代理本文作者是 jwilder,原文地址是 Automated Nginx Reverse Proxy for Docker
Docker 容器被分配隨機(jī) IP 和端口,這使得從客戶端角度來(lái)尋址它們是非常復(fù)雜的。默認(rèn),IP 和端口是專用于主機(jī)的,并且不能被外部訪問(wèn)除非它們被綁定到主機(jī)上。
綁定容器到主機(jī)端口可以防止多個(gè)容器在同一個(gè)主機(jī)上運(yùn)行。比如,在同一時(shí)間僅僅只有一個(gè)容器可以被綁定到 80 端口。這也使得新版本的容器無(wú)停機(jī)的推出復(fù)雜化了,因?yàn)槔习姹颈仨氃谛掳姹締?dòng)之前先停止。
一個(gè)反向代理可以幫助處理這些問(wèn)題,同時(shí)通過(guò)減輕零停機(jī)部署的困難來(lái)提升可用性。
生成反向代理配置文件當(dāng)一個(gè)容器被啟動(dòng)和停止的時(shí)候,設(shè)置一個(gè)反向代理配置可能是復(fù)雜的。通常的配置需要手動(dòng)更新,這容易出錯(cuò)并且費(fèi)時(shí)。
幸運(yùn)的是,Docker 提供了一個(gè)遠(yuǎn)程 API 來(lái) inspect containers 和訪問(wèn)他們的 IP,端口和其他配置元數(shù)據(jù)。另外,它也提供一個(gè)實(shí)時(shí)事件 API可以被用于通知什么時(shí)候容器被啟動(dòng)和停止。這些 API 可以被用于自動(dòng)地生成一個(gè)反向代理配置。
docker-gen 是一個(gè)使用這些 API 的小工具,并導(dǎo)出容器的元數(shù)據(jù)到模板中。模板被渲染以及一個(gè)可選的通知命令可以被運(yùn)行來(lái)重起服務(wù)。
使用 docker-gen,我們可以自動(dòng)的生成 Nginx 的配置并重載 Nginx當(dāng)它們改變的時(shí)候。同樣的方法可被用于 Docker 日志管理。
Nginx 反向代理 Docker這個(gè)例子 Nginx 模板可以被用于生成一個(gè) Docker 容器使用虛擬主機(jī)路由的反向代理配置文件。這個(gè)模板是使用 golang text/template package 實(shí)現(xiàn)的。它使用一個(gè)通用的 groupBy 模板函數(shù)通過(guò)它們的 VIRTUAL_HOST 環(huán)境變量來(lái)分組運(yùn)行的容器。這簡(jiǎn)化了遍歷容器來(lái)生成一個(gè)負(fù)載均衡后端以及使得零停機(jī)部署可行。
{{ 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 }}
這個(gè)模板可以使用 docker-gen 來(lái)運(yùn)行:
docker-gen -only-exposed -watch -notify "/etc/init.d/nginx reload" templates/nginx.tmpl /etc/nginx/sites-enabled/default
-only-exposed - 僅僅使用容器已經(jīng)暴露的端口。
-watch - 啟動(dòng)之后,監(jiān)控 docker 容器事件和重新生成模板。
-notify "/etc/init.d/nginx reload" - 在模板生成后重載 nginx 配置。
templates/nginx.tmpl - nginx 模板。
/etc/nginx/sites-enabled/default - 目標(biāo)文件。
這是兩個(gè)容器配置了 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; } }試驗(yàn)
我使用這個(gè)設(shè)置創(chuàng)建了一個(gè)可信任的構(gòu)建來(lái)使得它非常容易試驗(yàn)。
運(yùn)行 nginx-proxy 容器:
$ docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock -t jwilder/nginx-proxy
使用一個(gè) VIRTUAL_HOST 環(huán)境變量啟動(dòng)你的容器:
docker run -e VIRTUAL_HOST=foo.bar.com -t ...總結(jié)
為 docker 容器生成 nginx 反向代理配置可以通過(guò)使用 Docker APIs 和一些基礎(chǔ)的模板自動(dòng)化,這可以簡(jiǎn)化部署同時(shí)提升可用性。
雖然這非常適用于單臺(tái)主機(jī)上運(yùn)行的容器,為遠(yuǎn)程主機(jī)生成配置需要自動(dòng)發(fā)現(xiàn)??匆幌?Docker 自動(dòng)發(fā)現(xiàn) 對(duì)這個(gè)問(wèn)題的解決。
更新:這有一些類(lèi)似觀點(diǎn)和變種的其他文章值得一看:
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
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/39087.html
摘要:一個(gè)反向代理可以幫助處理這些問(wèn)題,同時(shí)通過(guò)減輕零停機(jī)部署的困難來(lái)提升可用性。生成反向代理配置文件當(dāng)一個(gè)容器被啟動(dòng)和停止的時(shí)候,設(shè)置一個(gè)反向代理配置可能是復(fù)雜的。這些可以被用于自動(dòng)地生成一個(gè)反向代理配置。 自動(dòng)化 Nginx 反向代理 Docker 標(biāo)簽(空格分隔): Docker Nginx Automated 本文作者是 jwilder,原文地址是 Automated N...
摘要:一下載鏡像我這里用的是輕量級(jí)的鏡像下載完成后,通過(guò)命令檢查一下鏡像是否下載成功二先以簡(jiǎn)單的方式運(yùn)行鏡像以后臺(tái)方式運(yùn)行鏡像指定容器的名稱為命令執(zhí)行完成后,通過(guò)命令確認(rèn)一下容器是否啟動(dòng)成功。 歡迎關(guān)注個(gè)人微信公眾號(hào): 小哈學(xué)Java, 文末分享阿里 P8 高級(jí)架構(gòu)師吐血總結(jié)的 《Java 核心知識(shí)整理&面試.pdf》資源鏈接??!個(gè)人網(wǎng)站: https://www.exception.sit...
摘要:一下載鏡像我這里用的是輕量級(jí)的鏡像下載完成后,通過(guò)命令檢查一下鏡像是否下載成功二先以簡(jiǎn)單的方式運(yùn)行鏡像以后臺(tái)方式運(yùn)行鏡像指定容器的名稱為命令執(zhí)行完成后,通過(guò)命令確認(rèn)一下容器是否啟動(dòng)成功。 歡迎關(guān)注個(gè)人微信公眾號(hào): 小哈學(xué)Java, 文末分享阿里 P8 高級(jí)架構(gòu)師吐血總結(jié)的 《Java 核心知識(shí)整理&面試.pdf》資源鏈接!!個(gè)人網(wǎng)站: https://www.exception.sit...
摘要:很多人反應(yīng)很難訪問(wèn),所以轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的容器部署。在容器化過(guò)程中,我們并未配置任何等,只是保留服務(wù)所需的配置項(xiàng)而已,而這一部分我們可以放在反向代理層完成。 很多人反應(yīng)很難訪問(wèn) Github Page,所以 ng-alain.com 轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的 Angular 容器部署。 以下我會(huì)闡述 ng-alain 整個(gè)過(guò)程,其中包括 Docke...
摘要:很多人反應(yīng)很難訪問(wèn),所以轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的容器部署。在容器化過(guò)程中,我們并未配置任何等,只是保留服務(wù)所需的配置項(xiàng)而已,而這一部分我們可以放在反向代理層完成。 很多人反應(yīng)很難訪問(wèn) Github Page,所以 ng-alain.com 轉(zhuǎn)移到阿里云服務(wù)器上,因此做了一次完整的 Angular 容器部署。 以下我會(huì)闡述 ng-alain 整個(gè)過(guò)程,其中包括 Docke...
閱讀 1459·2021-09-30 09:57
閱讀 1466·2021-09-09 09:33
閱讀 2219·2021-09-04 16:40
閱讀 1792·2021-09-01 10:50
閱讀 3233·2021-09-01 10:31
閱讀 2539·2019-08-30 15:56
閱讀 2969·2019-08-30 15:44
閱讀 3474·2019-08-29 17:29