?前置博文
Windows VMWare Centos環境下安裝Docker并配置MySql
https://blog.csdn.net/u013224722/article/details/148928081
Windows VMWare Centos Docker部署Springboot應用
https://blog.csdn.net/u013224722/article/details/148958480
# 將已存在的容器設置為宿主機重啟后自動運行
$sudo docker update --restart always dapi
一、Docker中安裝使用Nginx
1、拉取Nginx鏡像
sudo docker pull nginx:latest
2、創建目錄用于存儲拷貝出的nginx配置文件
? ? ? ? conf目錄存放配置文件,conf.d為nginx給出的的默認配置文件,html為存放html資源的目錄,logs存放nginx 的日志文件,ssl目錄存放ssl證書用于配置https
sudo mkdir -p /home/duel/workspace/nginx/{conf,conf.d,html,logs,ssl}
3、啟動Nginx
sudo docker run --name nginx -d -p 80:80 nginx:latest
4、Nginx啟動后,拷貝出配置文件
sudo docker cp nginx:/etc/nginx/nginx.conf /home/duel/workspace/nginx/conf/ #復制配置文件
sudo docker cp nginx:/etc/nginx/conf.d /home/duel/workspace/nginx
sudo docker cp nginx:/usr/share/nginx/html /home/duel/workspace/nginx #復制基本的html界面
5、停止Nginx容器并刪除
# 停止運行, 移除容器
sudo docker stop nginx# 刪除所有停止狀態的容器
sudo docker container prune
6、創建Html靜態文件
? ? ? 在拷貝出的存儲nginx配置文件的目錄中,添加一個用于測試的 html,路徑和源碼如下。
<!DOCTYPE html>
<html lang="en"><head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><meta charset="UTF-8"><title>dweb</title>
</head>
<body>
<h1>Hi!</h1>
<p>This is dweb index.html</p>
<p>The file is located on VMware Centos Os "/home/duel/workspace/dweb"</p>
</body>
</html>
7、新建Nginx配置文件
? ? ?在conf.d目錄下,新增了兩個文件,分別為對靜態文件解析的? dweb.conf 以及對前置文章中所示創建的Springboot應用訪問相關配置。
# 訪問靜態文件
server {listen 38080;server_name localhost;location / {root /usr/share/nginx/html/dweb;index index.html index.htm;}location ~* \.(html|css|js|png|jpg|gif|ico|mp4|mkv|rmvb|flv|eot|svg|ttf|woff|woff2|pptx|rar|zip)$ {root /usr/share/nginx/html/dweb;autoindex on;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
? Nginx 38081 端口的訪問自動轉發至 Springboot應用端口號。?
# 訪問前文中記錄的 Springboot應用
# 8093是發布的Springboot應用使用的端口server {listen 38081;server_name localhost;location / {proxy_pass http://192.168.23.134:8093; // 端口轉發}
}
8、基于新建的配置文件,重新創建Nginx容器
sudo docker run --name nginx -p 80:80 -p 443:443 -p 38080:38080 -p 38081:38081 -v /home/duel/workspace/nginx/html:/usr/share/nginx/html -v /home/duel/workspace/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/duel/workspace/nginx/conf.d:/etc/nginx/conf.d -v /home/duel/workspace/nginx/logs:/var/log/nginx -v /home/duel/workspace/nginx/ssl:/etc/nginx/ssl -d --restart=always nginx:latest
sudo docker run --name nginx -p 80:80 -p 443:443 -p 38080:38080 -p 38081:38081
-v /home/duel/workspace/nginx/html:/usr/share/nginx/html
-v /home/duel/workspace/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-v /home/duel/workspace/nginx/conf.d:/etc/nginx/conf.d
-v /home/duel/workspace/nginx/logs:/var/log/nginx
-v /home/duel/workspace/nginx/ssl:/etc/nginx/ssl
-d --restart=always nginx:latest
9、VMWare Centos中測試
打開Firefox瀏覽器、通過設置的38080端口,訪問dweb目錄下放置的index.html文件,成功!
通過設置的 38081 端口,訪問Springboot應用提供的數據接口,成功!
10、回到Windows宿主機中測試
? ? ? ?回到Windows宿主機,通過Chrome瀏覽器,訪問在 VMWare Centos Docker 中發布的靜態文件以及 Springboot數據接口,均成功!
二、錯誤的嘗試
1 、?靜態文件目錄未映射到容器內部
? ? ? ? 瀏覽器訪問報錯 “404 Not Found”
? ? ? ? 在使用 Docker 運行 Nginx 容器時,通常需要將宿主機上的文件和目錄映射到容器內部,以便于管理配置文件、靜態資源等。若將靜態文件放在其他目錄,如下所示,將靜態文件放在了“/home/duel/workspace/dweb” 目錄下,創建Nginx容器時 用的指令“-v? /home/duel/workspace/nginx/html:/usr/share/nginx/html” 只把 “/home/duel/workspace/nginx/html”目錄映射進了容器內容。這時,Nginx啟動后,瀏覽器訪問報錯 “404 Not Found”。
server {listen 38080;server_name localhost;location / {root /home/duel/workspace/dweb; // 這個目錄在容器中不會映射index index.html index.htm;}location ~* \.(html|css|js|png|jpg|gif|ico|mp4|mkv|rmvb|flv|eot|svg|ttf|woff|woff2|pptx|rar|zip)$ {root /home/duel/workspace/dweb; // 這個目錄在容器中不會映射autoindex on;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}
}
? ? ? ? 解決方法:將dweb目錄拷貝到? ./nginx/html 目錄下,并修改 conf 中的root,?./nginx/html 目錄下的文件會被映射。
server {listen 38080;server_name localhost;location / {root /usr/share/nginx/html/dweb; // 映射后的目錄index index.html index.htm;}
2、端口轉發使用localhost或127.0.0.1
? ? ? ? 瀏覽器訪問報錯 “502 Bad Gateway”
? ? ? ? 在docker容器里,容器的IP和宿主機的IP是不一樣的,127.0.0.1
指向的是容器內部的ip。
所以無法通過127.0.0.1去進行代理,必須把localhost或127.0.0.1 換成服務器的IP。
? ? 使用:proxy_pass http://127.0.0.1:8093 報 502 Bad gateway
? ? 使用:proxy_pass http://localhost:8093 報 502 Bad gateway
? ? ?需要使用主機的ip,如下:
server {listen 38081;server_name localhost;location / {proxy_pass http://192.168.23.134:8093; // 使用Centos系統IP}
}