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

运行控制台测试

三台机器完成负载!!

 

至此三剑客分享完毕

posted on 2018-11-24 15:21  chester·chen  阅读(1332)  评论(1编辑  收藏  举报