在本教程中,探索如何使用NGINX Docker鏡像在Docker等平臺(tái)上構(gòu)建和運(yùn)行web應(yīng)用程序!
Docker是一個(gè)引人注目的平臺(tái),特別適合打包和運(yùn)行Web應(yīng)用程序,尤其是與云平臺(tái)提供的眾多平臺(tái)即服務(wù)(PaaS)方案配對(duì)使用。NGINX一直為DevOps團(tuán)隊(duì)提供Linux上托管Web應(yīng)用程序的能力,并且還提供了官方的Docker鏡像作為自定義Web應(yīng)用程序的基礎(chǔ)。
在本文中,我將解釋DevOps團(tuán)隊(duì)如何使用NGINX Docker鏡像來(lái)構(gòu)建和運(yùn)行Web應(yīng)用程序。
開(kāi)始使用基礎(chǔ)鏡像
NGINX是一個(gè)多功能工具,可用作負(fù)載均衡器、反向代理和網(wǎng)絡(luò)緩存等眾多用途。然而,在Docker容器中運(yùn)行NGINX時(shí),大部分這些高級(jí)功能都被委派給其他專門(mén)的平臺(tái)或其他實(shí)例的NGINX。通常情況下,當(dāng)NGINX在Docker容器中運(yùn)行時(shí),它扮演的是Web服務(wù)器的角色。
要?jiǎng)?chuàng)建一個(gè)帶有默認(rèn)網(wǎng)站的NGINX容器,請(qǐng)運(yùn)行以下命令:
docker run -p 8080:80 nginx
此命令將下載 nginx 鏡像(如果尚未下載)并創(chuàng)建一個(gè)容器,將容器的80端口映射到主機(jī)上的8080端口。然后,您可以打開(kāi) http://localhost:8080/index.html 來(lái)查看默認(rèn)的“Welcome to nginx!”網(wǎng)站。
為了使NGINX容器能夠托管自定義網(wǎng)頁(yè)資源,您可以將本地目錄掛載到Docker容器內(nèi)部。
將以下HTML代碼保存到名為 index.html 的文件中:
<html> <body> Hello from Octopus! </body> </html>
接下來(lái),運(yùn)行以下命令將當(dāng)前目錄以只讀方式掛載到NGINX容器內(nèi)的 /usr/share/nginx/html 目錄下:
docker run -v $(pwd):/usr/share/nginx/html:ro -p 8080:80 nginx
再次打開(kāi) http://localhost:8080/index.html,您將看到顯示自定義HTML頁(yè)面。
Docker鏡像的一個(gè)好處是能夠?qū)⑺邢嚓P(guān)文件捆綁到一個(gè)可分發(fā)的單個(gè)構(gòu)件中。為了實(shí)現(xiàn)這一好處,您必須基于NGINX鏡像創(chuàng)建一個(gè)新的Docker鏡像。
基于NGINX創(chuàng)建自定義鏡像
要?jiǎng)?chuàng)建您自己的 Docker 映像,請(qǐng)將以下文本保存到名為 的文件中 Dockerfile:
FROM nginx COPY index.html /usr/share/nginx/html/index.html
Dockerfile 包含構(gòu)建自定義 Docker 映像的說(shuō)明。這里你使用 FROM 命令將你的鏡像基于NGINX鏡像,然后使用命令COPY將你的 index.html 文件復(fù)制到該 /usr/share/nginx/html 目錄下的新鏡像中。
使用以下命令構(gòu)建新映像:
docker build . -t mynginx
這將構(gòu)建一個(gè)名為 的新圖像 mynginx 。使用以下命令運(yùn)行新映像:
docker run -p 8080:80 mynginx
請(qǐng)注意,這次您沒(méi)有掛載任何目錄。但是,當(dāng)您打開(kāi) http://localhost:8080/index.html 自定義 HTML 頁(yè)面時(shí),會(huì)顯示該頁(yè)面,因?yàn)樗度朐谀淖远x圖像中。
NGINX 的功能遠(yuǎn)不止托管靜態(tài)文件。要解鎖此功能,您必須使用自定義 NGINX 配置文件。
高級(jí) NGINX 配置
NGINX 通過(guò)配置文件公開(kāi)其功能。默認(rèn) NGINX 映像附帶一個(gè)簡(jiǎn)單的默認(rèn)配置文件,旨在托管靜態(tài) Web 內(nèi)容。該文件位于 /etc/nginx/nginx.conf 默認(rèn)映像中,具有以下內(nèi)容:
user nginx; worker_processes auto; error_log /var/log/nginx/error.log notice; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include /etc/nginx/mime.types; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; #tcp_nopush on; keepalive_timeout 65; #gzip on; include /etc/nginx/conf.d/*.conf; }
無(wú)需詳細(xì)了解該配置文件,但有一行有趣的內(nèi)容指示 NGINX 從該 /etc/nginx/conf.d 目錄加載其他配置文件:
include /etc/nginx/conf.d/*.conf;
默認(rèn)/etc/nginx/conf.d文件將 NGINX 配置為 Web 服務(wù)器。具體來(lái)說(shuō),location / 塊加載文件 /usr/share/nginx/html 就是您之前將 HTML 文件安裝到該目錄的原因:
server { listen 80; server_name localhost; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} }
您可以利用說(shuō)明加載任何 *.conf 配置文件來(lái)自 /etc/nginx 定義 NGINX。/nginx-health 在此示例中,您通過(guò)偵聽(tīng)端口 90 的自定義位置添加運(yùn)行狀況檢查,該位置使用 HTTP 200 OK響應(yīng)對(duì)路徑的請(qǐng)求。
將以下文本保存到名為 的文件中 health-check.conf:
server { listen 90; server_name localhost; location /nginx-health { return 200 "healthy\n"; add_header Content-Type text/plain; } }
修改 Dockerfile 將配置文件復(fù)制到 /etc/nginx/conf.d:
FROM nginx COPY index.html /usr/share/nginx/html/index.html COPY health-check.conf /etc/nginx/conf.d/health-check.conf
使用以下命令構(gòu)建圖像:
docker build . -t mynginx
使用命令運(yùn)行新映像。請(qǐng)注意 9090 上公開(kāi)的新端口:
docker run -p 8080:80 -p 9090:90 mynginx
現(xiàn)在開(kāi)放 http://localhost:9090/nginx-health。返回健康檢查響應(yīng)以表明 Web 服務(wù)器已啟動(dòng)并正在運(yùn)行。
上面的示例使您的自定義圖像基于默認(rèn) nginx 圖像。然而,還有其他變體可以提供更小的圖像尺寸而不犧牲任何功能。
選擇 NGINX 變體
默認(rèn) nginx 鏡像基于Debian。不過(guò)NGINX也提供了基于Alpine的鏡像。
NGINX:github.com/nginxinc/docker-nginx/blob/master/Dockerfile-debian.template
Alpine:github.com/nginxinc/docker-nginx/blob/master/Dockerfile-alpine.template
Alpine 經(jīng)常用作 Docker 鏡像的輕量級(jí)基礎(chǔ)。要查看 Docker 鏡像的大小,必須首先將它們拉到本地工作站:
docker pull nginx docker pull nginx:stable-alpine
然后您可以使用以下命令查找圖像尺寸:
docker image ls
由此,您可以看到 Debian 鏡像的大小約為 140 MB,而 Alpine 鏡像的大小約為 24 MB。這大大節(jié)省了圖像尺寸。
要將您的圖像基于 Alpine 變體,您需要更新 Dockerfile:
FROM nginx:stable-alpine COPY index.html /usr/share/nginx/html/index.html COPY health-check.conf /etc/nginx/conf.d/health-check.conf
使用以下命令構(gòu)建并運(yùn)行圖像:
docker build . -t mynginx docker run -p 8080:80 -p 9090:90 mynginx
再次打開(kāi) http://localhost:9090/nginx-health 或 http://localhost:8080/index.html 查看網(wǎng)頁(yè)。一切都像以前一樣繼續(xù)工作,但您的自定義圖像現(xiàn)在小得多。
結(jié)論
NGINX 是一個(gè)功能強(qiáng)大的 Web 服務(wù)器,官方 NGINX Docker 鏡像允許 DevOps 團(tuán)隊(duì)在 Docker 中托管自定義 Web 應(yīng)用程序。NGINX 還支持高級(jí)場(chǎng)景,因?yàn)樗軌蜃x取復(fù)制到自定義 Docker 映像中的配置文件。
在這篇文章中,您學(xué)習(xí)了如何創(chuàng)建托管靜態(tài) Web 應(yīng)用程序的自定義 Docker 映像,添加高級(jí) NGINX 配置文件以提供運(yùn)行狀況檢查端點(diǎn),并比較 Debian 和 Alpine NGINX 映像的大小。
相關(guān)資源
NGINX Docker 鏡像源代碼(github.com/nginxinc/docker-nginx)文章來(lái)源:http://www.zghlxwxcb.cn/article/515.html
Dockerfile 參考(docs.docker.com/engine/reference/builder/)文章來(lái)源地址http://www.zghlxwxcb.cn/article/515.html
到此這篇關(guān)于使用NGINX Docker鏡像構(gòu)建和運(yùn)行Web應(yīng)用程序的教程的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!