使用Docker、CoreOS、Mesos部署可扩展的Web应用

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储OSS,敏感数据保护2.0 200GB 1年
简介: 本文讲的是使用Docker、CoreOS、Mesos部署可扩展的Web应用,【编者的话】本文作者重点介绍了如何使用Docker、CoreOS、Mesos、Vulcand、对象存储来部署一个可扩展的Web应用,他首先介绍了为什么要选择这些工具以及与其它工具相比这些工具的优势。
本文讲的是使用Docker、CoreOS、Mesos部署可扩展的Web应用 【编者的话】本文作者重点介绍了如何使用Docker、CoreOS、Mesos、Vulcand、对象存储来部署一个可扩展的Web应用,他首先介绍了为什么要选择这些工具以及与其它工具相比这些工具的优势。紧接着,他通过实际案例演示了整个部署过程,图文并茂,推荐阅读。

介绍

让我们先来讨论一下为什么我决定使用这些软件来展示如何创建一个可扩展的Web基础架构。

为什么选择Docker?

那问题来了,为啥要选择Linux容器?因为相比于虚拟机,Linux容器拥有更低的计算和存储开销。

Docker简化了人们使用Linux容器的方式,并且提供一些非常实用的特性,比如Dockerfiles、Docker Hub、分层文件系统。在本文中,我将使用使用Amazon S3 API的VIPR搭建私有的Docker Registry以存储镜像(如我 以前的帖子 中描述)。

为什么选择CoreOS?

所有的组件都会在Docker容器中运行,所以你可能会说,操作系统并没有那么重要。但是, CoreOS 有很多的优势,具体如下:
  • 以一个单元的形式自动更新整个系统,而不是一个包接着一个包的更新(如果你的基础设施没有SPOF,甚至要重启系统)
  • 包含用于发现服务的etcd,也使用Vulcand(甚至设置中需要mesos)
  • 包含了systemd和fleet,一个可以以一个init系统呈现你整个集群的工具。在这个设置中我不使用fleet,但是在其它方面我有使用它,比如几秒内启动elastic search集群。

为什么选择Vulcand?

我看到有关如何部署容器或虚拟机的很多教程,但我总是惊讶地看到,他们很少涉及基础设施的负载均衡部分。

在我看来,负载均衡是一个可扩展的Web应用架构的重要组成部分。如果用户不能正常访问你的应用,那还搞什么自动化?

Vulcand 是一个为HTTP API管理和微服务而设计的反向代理工具。Vulcand会监控etcd,并自动检测到它需要实现新的规则,所以你不需要重新加载任何服务。只需在etcd添加正确的密钥,然后你的服务/应用程序就可以被使用了。

为什么选择Mesos?

有三种不同的方式来自动化部署Docker容器,具体如下:
  • Fleet:Fleet是一个通过Systemd对CoreOS集群进行控制和管理的工具。如果你想启动容器或者手动指定映射到主机的端口,那Fleet是一个不错的选择(译者注:Fleet的更多资料可以阅读本文)。
  • Kubernetes:这可能是最佳的选择之一,但现在Kuernetes还太年轻。
  • Mesos:Mesos目前已经支持Docker,它已经是一个相对稳定的平台,并且可以用来部署其它软件,例如Hadoop。

为什么选择对象存储?

我们可以通过上面介绍的软件来部署可扩展和高可用的应用。但是,数据怎么处理?

结构化的内容可能会被存储到分布式数据库中,例如MongoDB。非结构化的内容一般会存储在一个本地文件系统、NAS或者对象存储。

本地文件系统并不适合现在的场景,因为容器可能会被部署到集群的任何一个节点上。

理论上 NAS共享 方案可行,但是特别复杂的。例如,NAS共享需要挂载到所有的主机上,所以你需要为每个容器指定Volume,并在特权模式下运行容器...当容器启动而NAS共享不可用时,容器内的应用程序需要能够处理相关问题。

然而,对象存储却可以在任何容器的任何应用中使用,并且是高可用的,因为我们使用了负载均衡器,它不需要任何配置,这也可以加快应用程序的开发周期。为什么了?因为开发者不需要考虑数据的存储方式、目录结构管理等。

我已经开发了一个Web应用程序,它展示了一个应用程序如何不通过数据路径处理上传和下载,我会在下面运行这个应用程序。

1.png


上图展示了几个不同的组件,以及我如何设置3个节点的CoreOS集群。

我使用Keepalived来确保公共 IP 10.64.231.84是可用的,不管对应在coreos1还是coreos3节点上。

Vulcand会运行再每个节点上,以均衡用户和Web应用程序之间的负载,同事也可以平衡应用程序和不同的VIPR节点。

私有的Docker Registry在coreos1节点上运行,并使用Amazon S3 API在VIPR上存储镜像。

Mesos主节点(Master)和Marathon运行在coreos2节点上。

Demo

视频 可以点此链接浏览。

为我的Web应用程序创建Docker镜像

这里是我用来构建Docker镜像的Dockerfile:
FROM golang
WORKDIR /
RUN git clone https://djannot:xxxx@github.com/djannot/s3pics.git
WORKDIR /s3pics
RUN go build
EXPOSE 8080

构建镜像时我使用了 --no-cache 参数,以确保最新的源代码是从GitHub上克隆的。
core@coreos1 /media/share1/Dockerfiles/s3pics $ docker build --no-cache .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon
Step 0 : FROM golang
---> 1ea210e0e1f6
Step 1 : WORKDIR /
---> Running in f6987b175723
---> 022aa96f56d0
Removing intermediate container f6987b175723
Step 2 : RUN git clone https://djannot:xxxx@github.com/djannot/s3pics.git
---> Running in 54d6a32e90ba
Cloning into 's3pics'...
---> 3369bca87577
Removing intermediate container 54d6a32e90ba
Step 3 : WORKDIR /s3pics
---> Running in d875bc08eac9
---> 73946142ea54
Removing intermediate container d875bc08eac9
Step 4 : RUN go build
---> Running in e0bd59c1f28b
---> baebdd1b633e
Removing intermediate container e0bd59c1f28b
Step 5 : EXPOSE 8080
---> Running in 16d3fa9be1c5
---> 815b7aed2c83
Removing intermediate container 16d3fa9be1c5
Successfully built 815b7aed2c83

最后,我推送镜像到Docker registry。
core@coreos1 /media/share1/Dockerfiles/s3pics $ docker push 10.64.231.45:5000/s3pics:2.0
The push refers to a repository [10.64.231.45:5000/s3pics] (len: 1)
Sending image list
Pushing repository 10.64.231.45:5000/s3pics (1 tags)
Image 511136ea3c5a already pushed, skipping
Image 16386e29a1f4 already pushed, skipping
Image 835c4d274060 already pushed, skipping
Image 22c23ce0a90c already pushed, skipping
Image 3f1e6432f26e already pushed, skipping
Image 7982826b1e59 already pushed, skipping
Image 1dafbd563f5a already pushed, skipping
Image 7a94d87545e8 already pushed, skipping
Image e2d60f7b3d07 already pushed, skipping
Image 4f23222e2f74 already pushed, skipping
Image 258b590ccdee already pushed, skipping
Image 986643313a7b already pushed, skipping
Image 1ea210e0e1f6 already pushed, skipping
022aa96f56d0: Image successfully pushed
3369bca87577: Image successfully pushed
73946142ea54: Image successfully pushed
baebdd1b633e: Image successfully pushed
815b7aed2c83: Image successfully pushed
Pushing tag for rev [815b7aed2c83] on {http://10.64.231.45:5000/v1/repositories/s3pics/tags/2.0}

我已经指定了一个tag(2.0),以确保集群中的每个节点都会从Docker Registry获取最新版本。

部署Mesos应用程序

现在,让我们使用Docker镜像部署一个Mesos应用:
POST http://<Mesos Marathon IP>:8080/v2/apps

{
"id": "s3pics",
"cmd": "cd /s3pics; ./s3pics -AccessKey=denis@ad.forest -SecretKey=xxxx -EndPoint=http://denisnamespace.ns.viprds.ad.forest -Namespace=denisnamespace",
"cpus": 0.1,
"mem": 64.0,
"instances": 1,
"container": {
"type": "DOCKER",
"docker": {
  "image": "10.64.231.45:5000/s3pics:2.0",
  "network": "BRIDGE",
  "portMappings": [
  { "containerPort": 8080, "hostPort": 0, "protocol": "tcp" }
  ]
}
},
"healthChecks": [
{
"protocol": "HTTP",
"portIndex": 0,
"path": "/",
"gracePeriodSeconds": 10,
"intervalSeconds": 20,
"maxConsecutiveFailures": 3
}
]
}

当Mesos应用程序启动后,Mesos Marathon UI就会显示应用程序的状态。

2.png


几秒钟之后,应用部署成功,Docker主机和端口显示在UI中。

3.png


访问web应用

使用在Marathon UI显示的信息,我可以访问URL为 http://coreos1.ad.forest:31000 的Web应用程序。

4.png


当应用程序运行时页面左上角会显示容器名称,用于上载和下载的图片的Amazon S3终端(endpoint)会显示在左下角,并表明ViPR用于存储数据。

我们现在可以上传图片了。

5.png


下面是由Web应用程序发送到浏览器的代码,以让浏览器直接上传图片到对象存储平台。
var files =  $("#file")[0].files;
var reader = new FileReader();
reader.onload = function(event){
var content = event.target.result;
try {
$.ajax({
  url: 'http://bucket1.denisnamespace.ns.viprds.ad.forest:80/pictures/B6C3OuVCIAEfwjm.jpg',
  data: content,
  cache: false,
  processData: false,
  type: 'PUT',
  beforeSend: function (request)
  {
    request.setRequestHeader('Content-Length','35964');
    request.setRequestHeader('Content-Type','binary/octet-stream');
    request.setRequestHeader('x-amz-date','Sun, 11 Jan 2015 12:53:12 UTC');
    request.setRequestHeader('host','bucket1.denisnamespace.ns.viprds.ad.forest');
    request.setRequestHeader('Authorization','AWS denis@ad.forest:iCnahEUOy8/lanI96tQYA3WKQVE=');
  },
  success: function(data, textStatus, request){
    $('#alert-success').html("Picture uploaded").show().delay(5000).fadeOut();
    },
  error: function(data, textStatus, request){
    $('#alert-danger').html("Upload failed").show().delay(5000).fadeOut();
  }
});
}
catch (e) {
alert(e);
}
}
reader.readAsArrayBuffer(files[0]);


图片直接上传到对象存储平台的事实意味着该Web应用程序中并没有数据路径。也就是说无需部署数百个实例应用程序就可以扩展。
这个Web应用程序,也可用于显示所有存储在相应的Amazon S3的图片。

6.png


图片下方显示的URL表明图片可以直接从对象存储平台下载,而这又意味着Web应用程序不是从数据路径直接下载。

对象存储是事实上的标准网络规模应用。

更新vulcand代理

现在,让我们看看如何能够从外界访问该Web应用程序。
我使用Golang开发了一个小工具,同时使用Marathon API和etcd API:
  • 找到那些运行的Mesos应用程序但却没有相对应的在etcd中的vulcand规则,然后新建缺失的规则。
  • 找到那些存在与etdc的vulcand规则中的不再运行的Mesos应用,然后删除。

7.png


Web应用程序现在可以从外界访问。( http://s3pics.ad.fores t).

8.png


扩展Mesos应用程序

其中Mesos之美在于它能够轻松地扩展当前正在运行的应用程序的实例数目。

9.png


几秒钟后,20个实例正在运行。

10.png


我需要再次运行我的工具来更新vulcand规则。

11.jpg


现在,如果我刷新我的网页浏览器,可以看到,在左上角显示的容器名称是基于服务的应用程序实例发生变化。

12.png


13.png


使用Marathon UI或API时,它也可以按比例缩小的实例数并再次运行工具来更新vulcand规则。

原文链接:How to create a web scale infrastructure based on Docker, CoreOS, Vulcand and Mesos. And why Object Storage becomes the de facto data repository(翻译:张逸仙 审校:李颖杰)

原文发布时间为:2015-01-26
本文作者:zyx_today
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:使用Docker、CoreOS、Mesos部署可扩展的Web应用
相关实践学习
基于ECS和NAS搭建个人网盘
本场景主要介绍如何基于ECS和NAS快速搭建个人网盘。
阿里云文件存储 NAS 使用教程
阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。 产品详情:https://www.aliyun.com/product/nas
目录
相关文章
|
2月前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
364 91
|
18天前
|
Ubuntu 安全 Docker
Ubuntu下部署及操作Docker技巧
以上就是在Ubuntu下部署及操作Docker的具体步骤。但这只是冰山一角,Docker的魅力远不仅如此。你可以将其视为存放各种工具的小箱子,随时随地取用,极大地提升工作效率。你也可以私人订制,适应不同的开发环境,就像一个拥有各种口味冰淇淋的冰箱,满足各种各样的需求。好了,现在你已经掌握了基本的Docker运用技巧,快去尝试使用吧!记住,沉浸在探索中,你会找到无尽的乐趣和满满的收获。
81 23
|
2月前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
28天前
|
安全 API 算法框架/工具
大模型文件Docker镜像化部署技术详解
大模型文件Docker镜像化部署技术详解
195 2
|
1月前
|
JSON 运维 Ubuntu
在Docker上部署Ollama+AnythingLLM完成本地LLM Agent部署
通过以上步骤,您可以成功在Docker上部署Ollama和AnythingLLM,实现本地LLM Agent的功能。在部署过程中,确保环境和配置正确,以避免不必要的问题。希望本文能够帮助您顺利完成部署,并在本地环境中高效地使用LLM模型。
650 8
|
2月前
|
人工智能 文字识别 安全
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
Stirling-PDF 是一款基于 Docker 的本地化 PDF 编辑工具,支持 50 多种 PDF 操作,包括合并、拆分、转换、压缩等,同时提供多语言支持和企业级功能,满足个人和企业用户的多样化需求。
154 6
Stirling-PDF:51.4K Star!用Docker部署私有PDF工作站,支持50多种PDF操作,从此告别在线工具
|
2月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
84 19
|
1月前
|
Docker Python 容器
Docker——阿里云服务器使用Docker部署python项目全程小记
本文记录了我在阿里云服务器上使用Docker部署python项目(flask为例)的全过程,在这里记录和分享一下,希望可以给大家提供一些参考。
180 0
|
1月前
|
运维 网络安全 文件存储
找不到类似 Docker Desktop 的 Web 管理界面?试试这些开源方案
Docker Desktop 是本地容器化开发的利器,但存在无法通过 Web 远程管理、跨平台体验不一致等问题。为此,推荐几款轻量级、可 Web 化管理的 Docker 工具:Portainer 功能全面,适合企业级运维;CasaOS 集成应用商店和 NAS 功能,适合家庭/个人开发环境;Websoft9 提供预集成环境,新手友好。这些工具能有效提升容器管理效率,满足不同场景需求。
95 3
|
25天前
|
存储 SQL 关系型数据库
docker部署n9e开源版本7.4.0
n9e开源版本7.4.0
41 0
下一篇
oss创建bucket