zoukankan      html  css  js  c++  java
  • CentOS下Docker与.netcore(五)之 三剑客之一Docker-swarm集群

     CentOS下Docker与.netcore(一) 之 安装

    CentOS下Docker与.netcore(二) 之 Dockerfile

    CentOS下Docker与.netcore(三)之 三剑客之一Docker-Compose

    CentOS下Docker与.netcore(四)之 三剑客之一Docker-machine+jenkins简单自动化部署

    CentOS下Docker与.netcore(五)之 三剑客之一Docker-swarm集群

    1.什么是docker-swarm

    在公司网站流量爆发式增长的时候,一台服务器往往不能满足需求,之前我的解决办法是通过nginx来实现负载均衡,有了docker-machine之后,解决方案会更加简单。当流量增加时,我们按照需要往docker-swarm集群中添加主机就可以了。

    2.原理

    我们把一组docker-swarm集群中的所有docker容器统称作一个service,其中的每一个docker容器称做一个task,如下图

    3.开始搭建环境

    上一章我们讲了docker-machine,在这里我们需要用到。我在我本地Hyper-v创建4个虚拟机

    其中:

    CentOS设置静态IP:  192.168.8.200,并在这个虚机上搭建好docker-machine

    CentOS2设置静态IP:192.168.8.201

    CentOS3设置静态IP:192.168.8.202

    CentOS3设置静态IP:192.168.8.203

    然后通过200节点,分别在201,202,203上搭建好docker

    4.创建集群(swarm命令

     1)docker-mashine  ssh 到host1上创建leader

    [root@localhost ~]# docker-machine ssh host1
    [root@host1 ~]# docker swarm init --advertise-addr 192.168.8.201

    2)docker-mashine  ssh 到host2加入集群

    [root@localhost ~]# docker-machine ssh host2

    3)docker-mashine  ssh 到host1上查看集群列表

    到此,集群构建完毕,是一个最简单的集群

    5.新建.netcore项目

     1)修改ValueController.cs
            // GET api/values
            [HttpGet]
            public ActionResult<IEnumerable<string>> Get()
            {
                var ip = HttpContext.Connection.LocalIpAddress;
                var port = HttpContext.Connection.LocalPort;
                return new string[] { ip.ToString(), port.ToString() };
            }
    2)修改Program.cs
            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args).UseUrls("http://*:5000")
                    .UseStartup<Startup>();
    3)新建dockerfile,并经属性设置为:始终复制到输出目录

    FROM microsoft/dotnet:2.1-aspnetcore-runtime
    MAINTAINER yishi.chen

    LABEL description="DockerSwarmTest"
    LABEL version="1.0"


    WORKDIR /app
    COPY . .
    EXPOSE 5000
    ENTRYPOINT ["dotnet","DockerSwarmTest.dll"]

    4)构建image并上传到docker-hub

    5)创建service

    我们先只创建一个容器

    测试接口

    6)添加一个容器
    [root@host1 ~]# docker service update --replicas 2 cys_web

    查看运行状态

    两个都已经启动

    6.模拟并发请求接口

    新建一个控制台程序

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Threading.Tasks;
    
    namespace Client
    {
        class Program
        {
            static HttpClient httpClient = new HttpClient();
            static void Main(string[] args)
            {
                Parallel.For(1, 10000, i =>
                {
                    HttpResponseMessage response = httpClient.SendAsync(new HttpRequestMessage
                    {
                        Method = new HttpMethod("GET"),
                        RequestUri = new Uri("http://192.168.8.202:5000/api/values")
                    }).Result;
                    var result = response.Content.ReadAsStringAsync().Result;
                    Console.WriteLine(result);
                });
            }
        }
    }

    运行测试,结果如下:

    我们发现,请求http://192.168.8.202:5000/api/values时,是对service中的两个容器实现轮询调用的,因此,docker swarm很简单的实现了负载,我们可以再把host3加进集群里,再测试一下有三个容器的情况的结果。

    [root@host1 ~]# docker node ls
    ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
    b6qt1dnbj4hnf2jks0rnxjm8y *   host1               Ready               Active              Leader              18.09.0
    p9vfq9qt6dtv929an5hzmirn9     host2               Ready               Active                                  18.09.0
    uy37l58v2ooux2tju89ex1o7q     host3               Ready               Active                                  18.09.0

    运行控制台测试

    三台机器完成负载!!

    至此三剑客分享完毕

  • 相关阅读:
    Python 面向对象高级编程
    Python 继承和多态
    Python 访问限制
    学习笔记项目3-Django-管理网站
    学习笔记项目2-Django-创建数据库及应用
    学习笔记项目1-Django-创建虚拟环境和项目
    写一个 100 以内的奇数列表
    给一个字符串,转换成数字整数,若包含非法字符,返回提示,正确则反回整数值,不能使用内置函数转换
    Linux系统实现一个everything程序
    自动化测试常用脚本-等待某个元素是否显示
  • 原文地址:https://www.cnblogs.com/chenyishi/p/10012246.html
Copyright © 2011-2022 走看看