昨天下午道哥在微信上丢给我一条新闻,看看,我们阿里云支持 Docker 企业版了。我打开一看,果然,阿里云发布了飞天敏捷版,开始支持企业级的 Docker 容器。

美国中部时间4月19日,阿里云在容器技术大会 DockerCon 2017上正式推出了 Apsara Stack Agility,也就是飞天的敏捷版。Docker 公司首席执行官 Ben Golub 在大会上宣布了 Apsara Stack Agility 的正式发布,这也是国内第一个支持 Docker 官方企业版(Enterprise Edition,EE)的容器类产品,可以部署在企业自有数据中心环境内,特别适用于企业专有云及混合云场景。

Ben 在演讲中表示,阿里巴巴电商平台已经全面容器化,能够部署和管控超过几十万容器规模,在双11狂欢节稳定支撑了每秒175000次的订单交易。阿里云不但是 Docker 的首家业务合作伙伴,同时也在为 Docker 带来大规模容器应用的实践经验。深受开发人员喜爱的 Docker Hub 服务将于近期在国内推出。

Docker 及其创始人有着一个峰回路转的故事。Docker 是一种容器技术,但是容器技术由来已久,比如 Linux Containers,历史悠久,爷爷辈的技术,但是真正让容器进入人们视野的,是 Docker。


2010年,几个年轻人在旧金山成立了一家做 PaaS 平台的公司,起名为「dotCloud」。dotCloud 主要是基于 PaaS 平台为开发者或开发商提供技术服务。什么是 PaaS 呢?PaaS 的全称是 Platform as a Service,也就是平台即服务,无论你选择什么技术栈,PaaS 都会为你提供相关的配套设置,包括语言环境、运行环境、存储和各种基础服务。

dotCloud 花费了大量时间把手工工作和重复劳动抽象成组件和服务,并放到了云端,另外,它还提供了各种监控、告警和控制功能,方便开发者管理和监控自己的产品。PaaS 的概念虽好,但是由于认知、理念和技术的局限性,早期市场的接受度并不高,规模也不够大。虽然 dotCloud 在2011年初拿到了1000万美元的融资,但依然举步维艰。

在这种情况下,dotCloud 的创始人 Solomon Hykes 做了一件漫不经心的小事,他把 dotCloud 的核心容器引擎开源了。这个基于 Linux Container 技术的核心管理引擎一经开源立刻得到了「业界」的热烈追捧,容器管理引擎大大降低了容器技术的使用门槛,轻量级虚拟化,可移植,语言无关,写了程序扔上去做成镜像可以随处部署和运行,开发、测试和生产环境彻底统一了,还能进行资源管控和虚拟化。程序员们流着口水惊呼,太方便了,太方便了。引擎的名字叫做 Docker,以 Go 语言写成。

这个结果大大出乎 dotCloud 创始人的意外,从此以后,他们开始专心研发 Docker 产品和维护相关社区,2013年10月 dotCloud 公司更名为 Docker 股份有限公司,从此王子和公主过上了幸福而快乐的生活。


Docker 的技术特点现在大家都很清楚了,比如它能够以容器的方式自动部署任何应用;容器是一系列进程的集合;基于 namespaces 和 cgroups 实现容器资源的隔离和限制;基于 copy-on-write 技术创建文件系统,分层、快速、占用空间少;提供交互式 shell 和 remote api 等等。但是,与任何一门新兴技术的兴起一样,Docker 一路走来,给工程师和技术尝鲜者挖坑无数,有进程管理的问题,资源隔离的问题,内存泄露问题,包依赖问题,网络问题等等。


基于这些考量,我很想知道阿里云在这方面到底遇到了那些坑,解决了什么样的技术问题。于是有了我和阿里云容器服务负责人易立的一段对话:

阿里在使用 Docker 技术的时候碰到过那些坑,解决了哪些业务问题,对 Docker 做了什么改进呢?

Docker 的版本迭代速度很快,在快速发展的同时,必然会给使用者带来很多挑战,比如:

  • Docker Engine 和 Swarm 在可伸缩性上的问题。在早期版本中,集群规模比较大的情况下 Swarm 调度会变很慢,CPU 利用率非常高,同时 Docker Engine 中 libnetwork 对 etcd 的压力会非常大,也存在死锁的风险。我们对此做了大量改进,若干个 PR 已经被合并到 Docker 主干,大大提升了 Docker 集群的伸缩性。
  • 阿里云服务的集成和优化。在云端 Docker 环境的部署和线下有一些不同之处。比如,我们为阿里云 VPC 提供了符合 CNM 网络规范的容器网络驱动,其带宽和时延都优于原生的 overlay 网络,可以方便地实现混合云环境中容器的互联互通。为了便于 K8S/Mesos 用户在阿里云部署,我们也将其贡献给了开源的 Flannel 项目。
  • 内核兼容性。长时间压测容器还是会遇到各种奇怪的问题。阿里云容器服务为用户提供经过兼容性测试的 OS 和 Kernel 版本。由于社区的努力,目前主流操作系统 CentOS 7.3和 Ubuntu 16.04/14.04的最新版本内核对容器兼容性的支持也越来越好。
  • Docker Hub 访问是国内开发者普遍的痛,阿里云提供了免费的加速器服务和镜像仓库服务,可以帮助用户方便地拉取和构建镜像。另外也为 Docker 社区贡献了 Docker Registry 的阿里云 OSS 存储后端,支持海量数据的低成本镜像存储,同时修复不少 Registry 相关的性能和兼容性问题,这些也都回馈给社区了。

使用阿里云提供的 Docker 服务和自建 Docker 环境有什么不同?

Docker Engine 在单机上使用很方便,但要部署出一个可用于生产的集群,有很多问题需要考虑。跟手工部署 Docker Engine 和 Swarm 相比,使用阿里云容器服务有下列优势:

  • 一键部署安全的集群。阿里云容器服务帮助用户自动完成 ECS 创建、安全组配置、Docker Engine 和 Swarm 部署等繁琐工作。更加重要的是集群自带 SSL 证书,且支持证书下载、吊销等。
  • 针对阿里云能力进行了优化和集成,内置了容器在云上最佳部署和运维实践:比如支持阿里云 VPC/经典网络/SLB 负载均衡;集成日志服务 SLS、云监控;支持阿里云 OSS,NAS 的共享数据存储卷和云盘等等。
  • 容器服务在兼容原生 Docker 编排技术的同时进行了扩展。
  • 支持GPU/CPU混合的资源调度,可以轻松部署深度学习应用。
  • 提供离线应用、定时任务等扩展的调度能力,适应不同应用需求。
  • 支持蓝绿发布等多种发布方式,可以更快、更安全地发布应用。
  • 容器启动顺序依赖困扰了很多用户,我们结合容器的健康检查,提供了优雅的依赖检测方案。

共用 Linux Kernel,让 Docker 安全性先天不足,阿里是怎么解决的?

安全性是一个系统性问题,这里只针对 runtime 安全说一下。

  • 一方面,我们可以借助于虚拟化的隔离能力来达到更强的隔离。比如,在阿里云容器服务中,集群里所有 ECS 节点都是同一个用户的,不会和其他用户共享资源,这样避免了用户间的资源争抢和安全问题。
  • 另一方面,在针对需要采用容器进行多租户支持的场景中,比如我们对容器 User Namespaces 进行了映射,对操作系统配置了 security profile 和内核加固,同时对容器使用的存储,网络资源进行了额外限制。这些可以解决限定场景下的安全和资源隔离问题。

提升容器的资源隔离性和安全性,还有很多的路要走。也在和其他团队配合,在Linux 内核层面进行探索。任何一项新技术的应用、推广和普及都需要大量的实践和改进,一个技术或者环境,能够在你自己的笔记本上跑起来和投入成千上万台集群机器中完全是两个概念。我在锤子科技和极客邦科技的研发和生产环境里都用到了 Docker 技术,但数据体量和实践让我们很难进行类似的改进,因为你正常使用就没问题啊,只有数据量足够大,机器足够多的时候,很多瓶颈,比如扩展性、安全性、兼容性和长期的可用性才会出现挑战,如果是提供给别人的商用系统,要求就更多了。

飞天敏捷版充分体现了云 + 容器的独特价值。不仅大大了降低容器服务的操作难度,移植性也很强,能在不同环境中进行应用部署。有了它,客户可以在一组主机上通过 Docker 容器来进行分布式应用的部署、更新和弹性伸缩,轻松实现混合云方案。当业务出现峰值流量时,快速将本地数据中心应用扩展到云端,利用云资源更好的进行灾备、应对峰值流量。


易立对我说,「除了产品技术层面的合作,阿里云还将加大在社区的投入,并通过一系列技术活动提升中国 Docker 技术和应用的水平。」

我曾经写过一句话,大数据量胜于优秀算法,如果数据足够多,可能产生出意想不到的应用。无论算法好坏,更多的数据总是能够带来更好的效果。目前这些数据和机器节点都在中国的大型互联网公司里。

算法再好,没有量,也是无源之水,无本之木。从这个角度看,大型互联网公司更有责任去推进技术社区的发展,基于数据优势对开源社区做出更多贡献。当然,极客邦科技也会在其中发挥重要的作用。


来源:MacTalk 作者:池建强

细数阿里云在使用 Docker 过程中踩过的那些坑的更多相关文章

  1. 8年前诞生于淘宝,细数阿里云RPA 的前世今生!

    9月10日,踏入55岁的马云正式卸任阿里巴巴董事局主席一职,由阿里巴巴集团CEO张勇接任.公寓创业.西湖论剑.美国敲钟,从成立到登顶中国最值钱的公司,阿里巴巴只用了20年. 阿里云RPA,2011年诞 ...

  2. jenkins配置过程中踩过的一些坑

    1,编译通过之后,想要将编译好的war包放到远程服务器上,并解压 unzipBus.sh的脚本如下: #!/bin/bash jar -xvf bus.war 编译后报错:jar:Command no ...

  3. Jedis使用过程中踩过的那些坑

    1. 一个 大坑:若实例化 JedisShardInfo 时不设置节点名称(name属性),那么当Redis节点列表的顺序发生变化时,会发生“ 键 rehash 现象” 使用BTrace追踪redis ...

  4. RxJava 1升级到RxJava 2过程中踩过的一些“坑”

    RxJava2介绍 RxJava2 发布已经有一段时间了,是对 RxJava 的一次重大的升级,由于我的一个库cv4j使用了 RxJava2 来尝鲜,但是 RxJava2 跟 RxJava1 是不能同 ...

  5. 在阿里云上进行Docker集群的自动弹性伸缩

    摘要: 在刚刚结束的云栖大会上,阿里云容器服务演示了容器的自动弹性伸缩,能够从容应对互联网应用的峰值流量.阿里云容器服务不仅支持容器级别的自动弹性伸缩,也支持集群节点级别的自动弹性伸缩.从而真正做到从 ...

  6. 为什么阿里云服务器的docker启动tomcat这么慢??

    https://blog.csdn.net/tianyiii/article/details/79314597 最近在阿里云服务器使用Docker启动Tomcat,发现tomcat服务器启动过程很慢. ...

  7. 阿里云服务器搭建Docker版AWVS

    本文严重参考该文章:https://www.sqlsec.com/2020/04/awvs.html 阿里云服务器搭建Docker版AWVS,因为之前有使用Docker的经验,所以本文只是简述一下安装 ...

  8. [docker]通过阿里云源安装docker && flannel不通问题解决(try this guy out)

    docker清理容器 # 容器停止后就自动删除: docker run --rm centos /bin/echo "One"; # 杀死所有正在运行的容器: docker kil ...

  9. 阿里云ECS安装Docker

    阿里云ESC系统信息,官方说2.6内核运行docker服务可能会不稳定: $ uname -a Linux iZ259dixwg8Z -.el6.x86_64 # SMP Thu Jul :: UTC ...

随机推荐

  1. PTA数据结构与算法题目集(中文) 7-28

    PTA数据结构与算法题目集(中文)  7-28 7-28 搜索树判断 (25 分)   对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值.如果我 ...

  2. Google Adsense付款方式添加西联付款

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. Google Adsens ...

  3. 算法:模拟退火(基于c++程序)

    一 什么是模拟退火算法? 所谓退火,其实是金属冶炼的一个名词.比如加工一把刀,我们通常是把材料加工到很高的一个温度,加以锤炼.之后慢慢的将温度降下来,如果我们降温的控制比较好的话,那么金属里面的原子就 ...

  4. 动态规划_01背包_从Dijikstra和Floyd入手,彻底理解01背包

    dp一直是短板,现在从最基础的地方开始补 给定背包总容量 M ,n个商品选择,分别有价值vi,占量wi,从中取商品放入背包,令.容量和W=Σwi不超过M,令背包中的价值和V=Σvi最大 然后取法有很多 ...

  5. 《JavaScript 模式》读书笔记(6)— 代码复用模式2

    上一篇讲了最简单的代码复用模式,也是最基础的,我们普遍知道的继承模式,但是这种继承模式却有不少缺点,我们下面再看看其它可以实现继承的模式. 四.类式继承模式#2——借用构造函数 本模式解决了从子构造函 ...

  6. Julia的基本知识

    知识来源 1.变量.整数和浮点数 Julia和Matllab挺像的,基本的变量,数值定义都差不多,所以就没必要记录了. 2.数学运算 3.函数

  7. golang实现常用集合原理介绍

    golang本身对常用集合的封装还是比较少的,主要有数组(切片).双向链表.堆等.在工作中可能用到其他常用的集合,于是我自己对常用的集合进行了封装,并对原理做了简单介绍,代码库地址:https://g ...

  8. Golang——详解Go语言代码规范

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Golang专题的第二篇,我们来看看Go的语言规范. 在我们继续今天的内容之前,先来回答一个问题. 有同学在后台问我,为什么说Gola ...

  9. 「日常开发」记一次因使用Date引起的线上BUG处理

    生活中,我们需要掌控自己的时间,减少加班,提高效率:日常开发中,我们需要操作时间API,保证效率.安全.稳定.现在都2020年了,了解如何在JDK8及以后的版本中更好地操控时间就很有必要,尤其是一次线 ...

  10. .Net Core Send Email

    1.安装Nuget包MailKit,引用命名空间. using MailKit.Net.Smtp; using MimeKit; 注意:引用MailKit对应最新版本 2.定义收发地址和标题 Mime ...