Docker - 通过容器安装部署Nginx服务(附:反向代理配置)
一、基本介绍
1,什么是 Nginx?
- Nginx 是一个高性能的 HTTP 和反向代理服务器;
- 特点是占有的内存少,并发能力强。由于其专为性能优化而开发,因此性能是其最重要的考量,能经受高负载的考验,有报告表明能支持高达 50000 个并发连接数。
2,应用场景
(1)反向代理
- 我们只需要将请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据后,在返回给客户端,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
(2)负载均衡
- 单个服务器解决不了,我们增加服务器的数量,然后将请求分发到各个服务器上,将原先请求集中到单个服务器上的情况改为将请求分发到多个服务器上,将负载分发到不同的服务器,也就是我们所说的负载均衡。
(3)动静分离
- 为了加快网站的解析速度,可以把动态页面(例如:jsp,servlet)和静态页面(例如:html,css, js)由不同的服务器来解析,加快解析速度,降低原来单个服务器的压力。
二、安装部署
1,安装步骤
(1)首先执行如下命令下载 nginx 的 docker 镜像:
docker pull nginx
(2)接着执行如下命令先运行一次容器(目的是为了拷贝配置文件):
docker run -d -p 8081:80 --name nginx \ -v /home/nginx/www:/usr/share/nginx/html \ -v /home/nginx/logs:/var/log/nginx \ nginx
(3)接着依次执行如下命令,将容器内的配置文件拷贝到指定目录:
docker container cp nginx:/etc/nginx /home/nginx/ cd /home/nginx/ mv nginx conf
(4)这时我们宿主机的 /home/nginx 路径下就会有如下三个目录:

(5)然后我们执行如下命令终止并删除容器:
docker stop nginx docker rm nginx
2,运行测试
(1)首先我们在 /home/nginx/www 目录下创建一个 index.html 文件,内容如下:
(2)然后执行如下命令运行 Nginx 容器:
(3)使用浏览器访问 http://宿主机IP:8080,可以看到如下内容,说明 Nginx 部署成功:
欢迎访问 hangge.com
(2)然后执行如下命令运行 Nginx 容器:
docker run -d -p 8080:80 --name nginx \ -v /home/nginx/www:/usr/share/nginx/html \ -v /home/nginx/logs:/var/log/nginx \ -v /home/nginx/conf:/etc/nginx \ nginx
(3)使用浏览器访问 http://宿主机IP:8080,可以看到如下内容,说明 Nginx 部署成功:

附:反向代理配置
1,基本配置
(1)首先进入 Nginx 配置文件目录:
(2)编辑 default.conf 文件:
(3)将 location / {} 里面的部分配置成 proxy_pass 代理转发:
(4)重启 Nginx 容器,访问使用浏览器访问 http://宿主机IP:8080,可以看到显示的实际上是 https://m.baidu.com 页面:
cd /home/nginx/conf/conf.d/
(2)编辑 default.conf 文件:
vi default.conf
(3)将 location / {} 里面的部分配置成 proxy_pass 代理转发:
关于反向代理配置规则更详细的介绍,可以参考我写的另一篇文章:
server { listen 80; listen [::]:80; server_name localhost; location / { proxy_pass https://m.baidu.com/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
(4)重启 Nginx 容器,访问使用浏览器访问 http://宿主机IP:8080,可以看到显示的实际上是 https://m.baidu.com 页面:

2,多端口配置
(1)default.conf 文件中我们可以添加多个 server 配置,每个 server 监听不同的端口,并且对应不同的代理转发:
(2)执行如下命令启动启动容器后(映射两个端口):
(2)接着编辑客户端电脑的 hosts 文件,添加如下域名解析配置,将两个域名都指向服务器地址:
(3)执行如下命令启动启动容器后(这次只映射1个端口):
server { listen 80; listen [::]:80; server_name localhost; location / { proxy_pass https://m.baidu.com/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } server { listen 81; listen [::]:81; server_name localhost; location / { proxy_pass http://192.168.1.100:9091/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
(2)执行如下命令启动启动容器后(映射两个端口):
- 访问 http://宿主机IP:8080,可以看到显示的实际上是 https://m.baidu.com 页面
- 访问 http://宿主机IP:8081,可以看到显示的实际上是 http://192.168.1.100:9091 页面
docker run -d -p 8080:80 -p 8081:81 --name nginx \ -v /home/nginx/www:/usr/share/nginx/html \ -v /home/nginx/logs:/var/log/nginx \ -v /home/nginx/conf:/etc/nginx \ nginx
3,通过域名访问
(1)有时我们希望通过域名访问服务,这里对上面的 default.conf 文件内容稍作修改,两个 server 监听同一个端口(80),但 server_name 使用不同的域名:server { listen 80; listen [::]:80; server_name abc.com; location / { proxy_pass https://m.baidu.com/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } server { listen 80; listen [::]:80; server_name bcd.com; location / { proxy_pass http://192.168.1.100:9091/; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
(2)接着编辑客户端电脑的 hosts 文件,添加如下域名解析配置,将两个域名都指向服务器地址:
192.168.60.133 abc.com 192.168.60.133 bdc.com
(3)执行如下命令启动启动容器后(这次只映射1个端口):
- 访问 http://abc:8080,可以看到显示的实际上是 https://m.baidu.com 页面
- 访问 http://bcd:8080,可以看到显示的实际上是 http://192.168.1.100:9091 页面
docker run -d -p 8080:80 --name nginx \ -v /home/nginx/www:/usr/share/nginx/html \ -v /home/nginx/logs:/var/log/nginx \ -v /home/nginx/conf:/etc/nginx \ nginx