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

運行控制台測試

三台機器完成負載!!

 

至此三劍客分享完畢


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM