一、前言
在前面的文章中我们已经介绍了如何在Centos7 系统中安装Docker以及利用Docker进行 Asp.Net Core 应用的部署。在本文中,我们将继续介绍利用Docker部署 Nginx 服务实现负载均衡。文章最后附有Nginx部署的视频全过程。
二、环境
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 参数删掉就可以了。
以下视频,请带上耳机开始聆听
往期教程:
.NET 开发框架(五)-IIS 上部署 ASP.NET Core 项目教程
.NET 开发框架(六)-架构设计之 IIS 负载均衡(视频)
.NET 开发框架(九)-NLB 网络负载平衡配置实战(视频)
Docker(一)-CentOS7 中安装 Docker 视频教程
.NET Core 跨平台部署于 Docker(Centos)- 视频教程
Exceptionless – .Net Core 开源日志框架