目錄
一、教程目的
使用Docker搭建Nginx,進行最基本的反向代理操作,實現 :
- 訪問Nginx的默認頁面
- 通過Nginx訪問自定義的頁面
- 通過Nginx對ip進行代理
二、教程環境
- 系統 : winsows10
- 軟件 : Docker for Desktop
三、詳細設計
3.1 端口映射規則
宿主機端口 | 容器端口 |
---|---|
8080 | 80 |
8081 | 81 |
8082 | 82 |
訪問宿主機的8080端口,相當於訪問容器的80端口(即Nginx的默認端口);
其它以此類推。
3.2 新建容器
docker run -itd -p 8080:80 -p 8081:81 -p 8082:82 nginx
3.3 修改配置文件
本容器中nginx.conf的位置爲 /etc/nginx/nginx.conf
在配置文件最後一行的意思是使用默認的配置文件,此處將其註釋掉,以使用自己的配置
3.3.1 默認代理配置
在nginx.conf文件的http塊中添加入以下代碼
#1.配置80端口的反向代理
server{
#監聽Nginx80端口
listen 80;
#配置服務名,若無特殊配置,localhost即指代宿主機的127.0.0.1
server_name localhost;
#設置轉發
location / {
#首頁文件的目錄
root /usr/share/nginx.html;
#默認的首頁文件
index index.html index.htm;
}
}
配置容器80端口,實現訪問宿主機 http://127.0.0.1:8080訪問到Nginx的默認歡迎界面
3.3.2 訪問自定義頁面
在/home目錄下新建demo文件夾,創建a.html文件,修改其內容爲
<p>Successfully implemented the proxy to the HTML file<p>
在nginx.conf文件的http塊中加入以下代碼
#2.配置81端口的反向代理
server{
#監聽Nginx的81端口
listen 81;
#配置服務名,若無特殊配置localhost,即指代本機的127.0.0.1
server_name localhost;
#設置轉發
location / {
#設置我們自定義文件的目錄
root /home/demo;
#設置我們自定義的首頁文件
index a.html a.htm;
}
}
配置容器81端口,實現訪問宿主機 http://127.0.0.1:8081 而訪問自定義的頁面
3.3.3 對ip進行代理
實現127.0.0.1:8082通過Nginx被反向代理到127.0.0.1:5000
在nginx.conf文件的http塊中加入以下代碼
#3.配置82端口的反向代理
server{
#監聽Nginx的82端口
listen 82;
#配置服務名,若無特殊配置localhost即指代本機的127.0.0.1地址
server_name localhost;
#設置轉發,將127.0.0.1:82轉發到127.0.0.1:5000
location / {
proxy_pass 127.0.0.1:5000;
}
}
將容器82端口反向代理到Flask應用的端口,實現宿主機訪問http://127.0.0.1:8082而能訪問到默認地址爲http://127.0.0.1:5000的Flask應用
三個Server配置完成後,nginx.conf文件中http塊結構如下
http{
#配置1
server{
...
}
#配置2
server{
...
}
#配置3
server{
...
}
...
}
4. 重新加載配置文件
nginx -s reload
終端顯示 signal process started時才表明修改成功,若有問題會提示錯誤
四、運行結果
五、問題處理
1.分析問題
這裏本意是將http://127.0.0.1:82轉發到宿主機的http://127.0.0.1:5000,但Nginx處於Linux環境中,所以此處localhost實際上指的是容器內的localhost而並非宿主機內的localhost,因此出現錯誤情況。
2. 解決方法
在windows環境下可使用host.docker.internal指代宿主機的localhost地址
修改後配置文件爲
server{
listen 82;
server_name localhost;
location / {
# 這裏使用了host.docker.internal代表宿主機的127.0.0.1
proxy_pass http://host.docker.internal:5000;
}
}
重新加載配置文件