Docker04:CentOS7+Docker+Nginx+.Netcore2.0利用docker-compose.yml实现后台.Netcore2.0环境项目的负载均衡

一、环境准备

1.VirtualBox安装CentOS7

https://blog.csdn.net/github_38313789/article/details/80467588

2.CentOS7安装Docker

https://blog.csdn.net/github_38313789/article/details/80468597

二、构建自定义的nginx镜像

1.我们去DockerHub上寻找Nginx相关的官方镜像版本号

2.自定义的Nginx的Dockerfile编写

$ sudo mkdir /root/mynginx     //在root目录下创建mynginx目录$ cd /root/mynginx             //进入mynginx目录$ sudo yum -y install vim*                  //为CentOS7安装vim编辑器(已安装可以不用执行)
$ vim Dockerfile               //使用vim创建并编辑Dockerfile文件

在vim编辑器中输入如下代码

FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]

按Esc后输入:wq保存并退出vim编辑器

3.编写最简单的nginx.conf

$ cd /root/mynginx            //进入mynginx目录$ vim nginx.conf              //创建并编辑

在vim编辑器中输入如下代码

worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    upstream webapi{
        server 192.168.1.23:8081;
        server 192.168.1.23:8082;
        server 192.168.1.23:8083;
    }

    server {        listen       80;
        location / {
          proxy_pass   http://webapi;
        }
    }
}

按Esc后输入:wq保存并退出vim编辑器

4.根据我们自己编写的Dockerfile构建nginx镜像

进入mynginx目录,确保目录中有Dockerfile和nginx.conf两个文件

$ cd /root/mynginx$ ls

构建nginx镜像,镜像名我定义为mynginx,注意最后有一个空格 和 点

$ docker build -t mynginx .


查看刚刚生成的镜像

$ docker image ls

三、构建自定义的.Netcore2.0环境镜像

1.Dockerfile编写

$ mkdir /root/mydotnet$ vim Dockerfile

在vim编辑器中输入如下代码

FROM microsoft/aspnetcore:2.0
WORKDIR /publish
EXPOSE 5000
ENV ASPNETCORE_URLS http://*:5000
CMD ["dotnet"]

2.构建镜像

$ cd /root/mydotnet$ docker build -t mydotnet .

四、编写一个返回Hello World!的WebApi

五、将项目发布的publish文件夹上传到CentoOS7上的/root目录中

1.右键打开SFTP

2.进入 root目录,确保等会上传的文件直接会上传到root目录下


3.直接将publish文件夹拖入此窗口就行了(但是得确保publish文件夹所在路径没有中文)


4.切换回CentOS7-64控制台,查看是是否上传成功


进入publish查看里面文件是否完整


六、使用docker-compose.yml运行多容器实现负载均衡

1.安装Docker Compose

1)官方安装文档

https://docs.docker.com/compose/install/#install-compose

2)安装步骤

运行此命令下载Docker Compose

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

将文件变为可执行文件

sudo chmod +x /usr/local/bin/docker-compose

测试安装是否成功

$ docker-compose --version


3)卸载compose的命令

$ rm /usr/loacl/bin/docker-compose

2.编写docker-compose.yml文件

$ cd /root/mydotnet$ vim docker-compose.yml

在vim编辑器中输入下面代码

version: '3'
services:
 webapi-01:
  image: mydotnet
  container_name: mydotnet-8081
  restart: always
  volumes:
   - /root/publish:/publish
  ports:
    - "8081:5000"
  command: dotnet Hello.dll


 webapi-02:
  image: mydotnet
  container_name: mydotnet-8082
  restart: always
  volumes:
   - /root/publish:/publish
  ports:
    - "8082:5000"
  command: dotnet Hello.dll


 webapi-03:
  image: mydotnet
  container_name: mydotnet-8083
  restart: always
  volumes:
   - /root/publish:/publish
  ports:
    - "8083:5000"
  command: dotnet Hello.dll


 nginx:
  image: mynginx
  container_name: mynginx-container
  restart: always
  ports:
   - "80:80"

3.开放宿主机(即CentOS7的)8081,8082,8083端口

$ systemctl start firewalld$ firewall-cmd --zone=public --add-port=8081/tcp --permanent
$ firewall-cmd --zone=public --add-port=8082/tcp --permanent
$ firewall-cmd --zone=public --add-port=8083/tcp --permanent
$ firewall-cmd --reload

4.重启docker服务,关闭并移除所有容器,防止已启动的容器占用端口

$ service docker restart$ docker stop $(docker ps -a -q)
$ docker rm $(docker ps -a -q)

5.运行Docker Compose

在docker-compose.yml所在目录执行命令

$ cd /root/mydotnet

你自己选择前台运行还是后台运行,我选择的是前台运行

$ docker-compose up            //前台运行$ docker-compose up -d         //后台运行
出现下图界面表示3个.net项目实例和1个nginx实例,一共四个容器均运行成功


6.测试使用nginx做负载均衡的3个dotnet项目实例是否可正常使用

查询宿主机ip
$ ip addr

浏览器输入宿主机ip,F5刷新,每次都能出现Hello Worl!表示成功!


七、那到底nginx起作用了没有呢?下面我们来做个测试解答!

我们要测试是否nginx成功实现了负载均衡,

就是要看每次我们刷新浏览器发请求是否被nginx成功转发到不同的.net项目实例所在容器,

而这里我们是通过8081,8082,8083端口来区分不同实例。

因为我们在配置nginx.conf的时候 使用的是默认的轮询转发机制,

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除,

所以当请求来的时候,nginx每次都会将当次请求转发给不同的 .net项目实例。

那我们就将8082端口封掉,那么在nginx将请求转发到8082端口时会报错禁止访问,并且nginx会自动将请求再次转发到8083端口保证请求转发成功,则表示nginx实现了负载均衡起作用了!

实验步骤:

1.ctrl+c停止当前正在运行的4个容器

$ firewall-cmd --zone=public --remove-port=8082/tcp --permanent   //关闭8082端口$ firewall-cmd --reload                                           //使上述命令生效
$ firewall-cmd --zone=public --query-port=8082/tcp                //查询8082端口是否已经关闭

2.必须要重启Docker服务,否则启动Docker容器时会报错,详细原因参考

https://blog.csdn.net/tiandaochouqin99/article/details/77367912

$ service docker restart            //重启Docker服务$ docker stop $(docker ps -a -q)    //关闭所有容器
$ docker rm $(docker ps -a -q)      //移除所有容器,防止端口被占用
$ cd /root/mydotnet                 //进入docker-compose.yml所在文件夹
$ docker-compose up                 //运行docker compse

3.浏览器输入宿主机ip,并多次刷新页面进行测试



我们看到nginx的确将请求转发到8082端口了,只是失败了而已,所以至此我们证明了nginx起作用了



猜你喜欢

转载自blog.csdn.net/github_38313789/article/details/80482002