一、前言
在前面的文章中我们已经介绍了如何在Centos7系统中安装Docker以及利用Docker进行Asp.Net Core应用的部署。在本文中,我们将继续介绍利用Docker部署Nginx服务实现负载均衡。文章最后附有Nginx部署的视频全过程。
注:查看公众号历史文章,获知Asp.Net Core应用部署视频教程
二、环境
CentOS7, Docker-ce
三、Nginx服务部署
1.首先我们需要查找Nginx的镜像
docker search nginx
2.从镜像列表中选取其中一个,拉取到本地
docker pull nginx
-nginx: 镜像名称,如果需要特定版本可使用<imageName>:<tag>进行拉取
3.快速启动,在容器中加载镜像文件,并运行
docker run -d -it -p 8080:80 --name nginx8080 nginx
- -d: 后台运行
- -p 8080:80: 端口映射,<本地映射端口>:<容器端口>
- --name nginx8080: 容器名称,名称自定义
-nginx:在2中得到的镜像名称
4.查看Nginx所在容器的状态
docker ps
5.也可以通过浏览器或者使用命令查看Nginx服务
curl http://192.168.138.200:8080/
-192.168.138.200:8080: <本地IP>:<本地映射端口>
6.将容器中Nginx服务的配置文件及首页文件复制到本地
docker cp nginx8080:/etc/nginx ~/nginx
docker cp nginx8080:/usr/share/nginx/html ~/nginxwww
-nginx8080: Nginx服务容器名称
-/etc/nginx: Nginx服务配置文件存放目录
- ~/nginx: 本地配置文件存放目录,自定义
- /usr/share/nginx/html: Nginx服务html文件默认存放目录
- ~/nginxwww: 本地html文件存放目录,自定义
7.删除的当前Nginx服务,因为我们前面建立的这个Nginx服务是为了验证它能在Docker中运行,以及6中能将默认的配置文件复制到本地(偷懒的步骤)。现在目的都已经达到了,它也就完成自己的使命了。
docker stop nginx8080
docker rm nginx8080
--nginx8080: Nginx服务容器名称
8.将本地文件映射到容器中,再部署Nginx服务。把配置文件放在本地,这样就可以方便我们修改。
docker run -d -it -p 8080:80 --name nginx8080 -v ~/nginx:/etc/nginx -v ~/nginxwww:/usr/share/nginx/html --link=markjiang_dockerdemo:demo nginx
- -v ~/nginx:/etc/nginx: 将本地的配置文件所在目录映射到容器中
- -v ~/nginxwww:/usr/share/nginx/html: 将本地的首页文件映射到容器中
- --link=marijiang_dockerdemo:demo: link连接器,使得容器间可进行单向通信,即Nginx服务可使用别名demo访问容器markjiang_dockerdemo,格式<目标容器名称>:<别名>,别名在Nginx所在容器内部使用
9.查看容器状态
docker ps
10.修改本地配置文件nginx.conf
vi ~/nginx/nginx.conf
编辑nginx.conf文件,在http节点内添加以下内容,并保存
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /api/ { proxy_pass http://demo/api/; } }
- listen 80: Nginx在容器中占用的端口
- location /: 因为我只想转发api的请求,首页文件直接使用Nginx服务自身的即可,因此特地声明一个路径
- location /api/: 将包含"/api/"的请求全部转发到真正的.Net服务中
-proxy_pass http://demo/api/: demo即为8中定义的别名
11.重启Nginx服务,读取最新的配置文件
docker restart nginx8080
-nginx8080: Nginx服务容器名称
12.在浏览器中查看或者使用命令向Nginx服务发出api请求
curl http://192.168.138.200:8080/api/values
13.新增一个Asp.Net Core应用,用于负载均衡
docker run -d -it -p 8091:80 --name markjiang_dockerdemo2 markjiang/dockerdemo
-markjiang/dockerdemo: 使用原有的镜像即可
14.修改本地配置文件nginx.conf
vi ~/nginx/nginx.conf
编辑nginx.conf文件,在server节点内修改以下内容,并保存
server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; } location /api/ { proxy_pass http://apiserver/api/; } } upstream apiserver { server demo weight=1; server demo2 weight=1; }
- proxy_pass http://apiserver/api/: apiserver为服务器组名,自定义
- upstream apiserver: 定义服务器组
- weight=1: 负载均衡中该服务所占的权重,权重自定义
15.重建Nginx服务,添加新服务别名,读取最新的配置文件,实现负载均衡
docker stop nginx8080
docker rm nginx8080
docker run -d -it -p 8080:80 --name nginx8080 -v ~/nginx:/etc/nginx -v ~/nginxwww:/usr/share/nginx/html --link=markjiang_dockerdemo:demo --link=markjiang_dockerdemo2:demo2 nginx
16.关于.Net应用部署
在我的这个例子中,还是会将.Net应用的端口映射到本地端口中,可以让客户端直接调用,但在实际应用中,因为有了Nginx进行反向代理,我们的.Net应用就不需要把端口暴露出来,这样跟外界隔绝了会更加安全,因此我们在执行docker run命令时,只要将 -p 8090:80参数删掉就可以了。
以下视频,请带上耳机开始聆听