1.什麼是docker-swarm 在公司網站流量爆髮式增長的時候,一臺伺服器往往不能滿足需求,之前我的解決辦法是通過nginx來實現負載均衡,有了docker-machine之後,解決方案會更加簡單。當流量增加時,我們按照需要往docker-swarm集群中添加主機就可以了。 2.原理 我們把一組 ...
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
運行控制台測試
三台機器完成負載!!
至此三劍客分享完畢