目录
一、目的
使用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;
}
}
重新加载配置文件