梁胜:用户是Docker最大的筹码

RancherLabs创始人梁胜探讨容器技术、OpenStack及CloudStack的发展现状与前景,分享为何离开思杰创立RancherLabs,以及他对容器与传统云计算关系的看法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Rancher Labs是由梁胜(CloudStack创始人)创立的一家提供容器服务的云计算公司,产品包括RancherOS和Rancher。近日,Rancher Labs和东网科技宣布在国内成立合资子公司,全面开展Rancher在华的业务。InfoQ记者采访了Rancher CEO梁胜,与他探讨了容器、OpenStack、CloudStack等技术的发展和变革。本文根据采访整理而成。另外,梁胜还是ArchSummit全球架构师峰会的主题演讲嘉宾,欢迎关注。

\\
再谈CloudStack和OpenStack
\\

CloudStack项目已经贡献给了Apache,目前发展很健康。之前,大部分的开发其实都是思杰在做,而现在,社区也参与了很多功能的开发,社区这块,CloudStack已经逐步稳定,有了自己的开发节奏。现在的基础设施云也比较成熟了,并且性能增加的速度也没有之前那么快了,这块我觉得对用户和客户来说都非常有好处。很多的Apache开源项目,已经有5年或者10年的历史了,它们都很稳定,CloudStack也差不多进入了这个状态。就目前来看,如果用户想快速搭建一个稳定的基础设施云,除了CloudStack以外,其实也没有太多的可以选择的技术。OpenStack更适合一些比较大规模的项目,它和CloudStack的受众用户和应用场景并不完全一样。

\\

提到OpenStack,很多人都会关注它和CloudStack的对比。OpenStack最初是由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,这两个机构非常开放,并且他们既不是软件厂商,又不是硬件厂商,所以OpenStack早期就获得了很多厂商的支持。OpenStack在社区和生态方面建设的确实比CloudStack好很多,他们做开源的思路比较特别,以厂商为最初的切入点。CloudStack走的是另外一条路,我们想建立一个基于用户的社区,吸引更多的开发者来贡献代码,所以CloudStack的核心思路是简单和好用,从这方面来讲,CloudStack就非常成功,我们也获得了很多的用户。

\\

但从CloudStack和OpenStack的初衷来看,我觉得这两个开源软件都不是特别成功,因为当时它们都是受亚马逊的启迪,想成为企业搭建公有云或者私有云平台的基石。但现在放眼整个工业界,不管是国外还是国内的几个公有云,很少有基于OpenStack和CloudStack做的,大部分厂商反而是选择自己研发。私有云这块的市场,在我看来,并没有真正起来。就其原因,我觉得并不是技术的问题,而是产品和市场的问题。具体到美国来看,私有云市场基本上已经等同于服务器虚拟化,大部分的公司把OpenStack之类的技术看作是一种自动部署虚拟机的技术。尽管OpenStack、CloudStack提供了API,但很多用户并没有把云和DevOps流程联系到一起,像软件定义网络、软件定义存储、负载均衡之类的特性也没有真正用起来。

\\
为什么离开思杰?
\\

简单来说,是容器技术吸引了我,我认为它是一个新兴的发展方向。特别是从私有云的角度来看,容器技术让我眼前一亮。再回来去想CloudStack当时碰到的一些问题,不管是市场还是产品,归根结底还是它并不能把企业的产品研发流程、DevOps流程、大规模应用的部署流程联系起来,而容器却可以。之前CloudStack想拿下的客户,它们也是最早采用容器技术的团队,这也让我更坚信自己的判断。另外,对于容器技术,最吸引我的地方并不是它的效率有多高,技术有多先进,启动速度有多快之类,而是它庞大的用户群。

\\

离开思杰后,我开始做Rancher,Rancher想帮助客户搭建属于自己的基于容器的私有云平台。容器技术很简单,但是容器云并不简单,Rancher想把容器云做的简单易用,以帮助企业更好的利用工程师资源和机器资源。

\\
容器和OpenStack的关系
\\

容器和OpenStack应该是互补的关系。因为OpenStack可以解决一些容器现在不能解决的问题,特别是基础设施这一层。容器需要一个效率高、安全、隔离度好的基础设施,而这正是OpenStack可以提供的。反过来,容器又可以帮助管理OpenStack之上的应用。当然,这两个技术在某些维度上又有一些功能重合,这也很正常。比如OpenStack有Heat项目可以管理上层应用,但是当应用容器化之后,用户就不需要使用Heat来管理了,取而代之的可能就是Kubernetes之类的项目。虽然功能有重叠,但基本上来说还是互补的。

\\

社区有人也提到直接绕过OpenStack这样的虚拟层,直接在裸机上运行容器。就目前的情况来看,在裸机上运行容器的客户还非常少,如果这是一个趋势的话,那走到这一步还需要很久的时间。容器平台和IaaS的关系有点像浏览器和操作系统的关系。随着越来越多的应用可以直接运行在浏览器上,用户对操作系统的依赖越来越少。容器平台使用户更容易从一个IaaS云转移到另一个IaaS云,就像浏览器使用户更容易从一个操作系统换到另一个操作系统。但从另一个角度来看,没有传统操作系统而只能运行浏览器的电脑(像Chromebook)还不多见,大部分用户还是选择使用安装在传统操作系统上的浏览器。

\\

另外,我发现在美国,DigitalOcean也非常受用户喜欢。DigitalOcean非常简单,直白点说就是VPS+API,但性价比很高。仔细想想,未来的基础设施云不一定要很复杂,像DigitalOcean这样就足够了。如果是这样,反而对OpenStack有好处,因为OpenStack目前的市场占有率还非常小,所以它可以利用这个时机,布局好容器技术,然后简化产品,尽量做得简单易用。

\\
如何看Docker?
\\

Docker这个技术很不错,并且社区也做的很棒。他们的社区基本上是Docker一个公司在运营,也没有采用传统的基金会模式,但我觉得他们运转地很不错,也很开放,基本上好的改进都可以被采纳。Docker的迭代速度非常快,尽管功能不是很稳定,但可以看出这个社区的活力。如果要说以Docker为代表的用户社区和以OpenStack为代表的厂商社区哪个好,我觉得还是Docker,因为有了用户,根本不需要担忧没有厂商的支持。当然,技术和社区都是次要的,在我看来,Docker最重要的地方还是它的用户。

\\

Docker这个产品给了我很大的启发,如果让我再重新做一次CloudStack,那我的定位一定是简单好用。之前CloudStack做得太重了,大而重的东西,我现在一点都不觉得好。

\\

Rancher Labs是一家做容器管理的公司,产品包括RancherOS和Rancher,Rancher OS是一个高效能的轻量级Linux分发版本,专门设计来运行容器如Docker等。很多人都是从RancherOS开始了解到Rancher。其实为什么做RancherOS,也和我们看好Docker有关系。最开始,我们并没有自己开发OS,而是使用CoreOS。但在使用过程中遇到了一些问题,因为CoreOS使用的是Systemd作为系统和服务的管理工具,而Systemd和Docker在某些地方配合的却不好,并且很难修改。所以在去年年底,CoreOS就决定开发自己的容器技术Rkt,Rkt和Docker最大的区别就是它没有Daemon,直接基于Systemd。所以Rkt和Systemd整合的非常好,在CoreOS这样的系统上,Rkt会相对更稳定。当然,从技术角度,我们也可以理解为什么CoreOS要这样做。

\\

但后来我们放弃了CoreOS,因为我们不能失去Docker,它有那么大的用户量,这是其它容器技术没办法比的,并且Systemd是一个内部技术,没有太多的真正用户。于是我们决定用CoreOS相反的思路重新开发一个OS,去掉Systemd,保留Docker。

\\

今年6月,Docker联合其它国际大牌公司成立了OCI,这对Docker来说意义重大。之前很多人总是认为Docker是一个厂家标准,并不是一个工业界的标准。OCI的成立,也暗示着Docker公司愿意更加开放,愿意和Linux基金会一起推动容器技术的落地,一定程度上消除了大家的疑虑。

\\

在容器技术飞速发展的今天,我们应怎样看待传统的私有云构建思路?在几家独大的公有云世界,是否会诞生新的挑战者?OpenStack已发展5年多了,存在哪些问题?基础设施层应如何更好地支持容器化的应用?云计算和容器技术将会如何融合?云计算先驱,Rancher Labs 和 CloudStack 创始人梁胜将在ArchSummit全球架构师峰会中为您讲述云计算在容器时代的发展趋势。

好的,这是一个比较复杂的需求,需要用到HTML、CSS和JavaScript来实现。我将会给出一个简单的实现方案,你可以根据自己的需求进行修改和优化。 首先,我们需要创建一个HTML页面,其中包含一个表格,用于展示考勤信息。代码如下: ```html <!DOCTYPE html> <html> <head> <title>技术网络科考勤表</title> <style> table { border-collapse: collapse; } td, th { border: 1px solid black; padding: 5px; text-align: center; } .center { text-align: center; } .month { width: 50px; } .date { width: 30px; } .checkbox { width: 20px; height: 20px; } .select { width: 100%; } </style> </head> <body> <table> <thead> <tr> <th colspan="35" class="center">技术网络科考勤表</th> </tr> <tr> <th colspan="2" class="center">年月</th> <th colspan="33" class="center">日期</th> </tr> <tr> <th>人名</th> <th>时间</th> <th class="month">1</th> <th class="month">2</th> <th class="month">3</th> <th class="month">4</th> <th class="month">5</th> <th class="month">6</th> <th class="month">7</th> <th class="month">8</th> <th class="month">9</th> <th class="month">10</th> <th class="month">11</th> <th class="month">12</th> <th class="date">1</th> <th class="date">2</th> <th class="date">3</th> <th class="date">4</th> <th class="date">5</th> <th class="date">6</th> <th class="date">7</th> <th class="date">8</th> <th class="date">9</th> <th class="date">10</th> <th class="date">11</th> <th class="date">12</th> <th class="date">13</th> <th class="date">14</th> <th class="date">15</th> <th class="date">16</th> <th class="date">17</th> <th class="date">18</th> <th class="date">19</th> <th class="date">20</th> <th class="date">21</th> <th class="date">22</th> <th class="date">23</th> <th class="date">24</th> <th class="date">25</th> <th class="date">26</th> <th class="date">27</th> <th class="date">28</th> <th class="date">29</th> <th class="date">30</th> <th class="date">31</th> <th>值班天数</th> <th>带班</th> </tr> </thead> <tbody> <tr> <td>渠际时</td> <td>行政班</td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="checkbox"><input type="checkbox"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td class="date"><input type="text"></td> <td>0</td> <td> <select class="select"> <option value="渠际时">渠际时</option> <option value="陈海峰">陈海峰</option> <option value="梁胜玉">梁胜玉</option> <option value="袁凯">袁凯</option> <option value="侯博文">侯博文</option> <option value="孙逍遥">孙逍遥</option> <option value="郭智豪">郭智豪</option> <option value="杨沐松">杨沐松</option> </select> </td> </tr> <!-- 其他人员的行 --> </tbody> </table> <button id="submit">提交保存</button> <script src="attendance.js"></script> </body> </html> ``` 在这个表格中,我们使用了三个不同的CSS类来设置样式。`.center`用于设置文本居中,`.month`和`.date`用于设置月份和日期的宽度。 接下来,我们需要使用JavaScript来动态生成表格中的内容。代码如下: ```javascript // 获取表格 var table = document.querySelector('table'); // 创建年份选择框 var yearSelect = document.createElement('select'); yearSelect.classList.add('select'); for (var i = 2022; i <= 2099; i++) { var option = document.createElement('option'); option.value = i; option.textContent = i; yearSelect.appendChild(option); } // 添加到表格中 table.rows[1].cells[0].appendChild(yearSelect); // 创建月份选择框 var monthSelect = document.createElement('select'); monthSelect.classList.add('select'); for (var i = 1; i <= 12; i++) { var option = document.createElement('option'); option.value = i; option.textContent = i; monthSelect.appendChild(option); } // 添加到表格中 table.rows[1].cells[1].appendChild(monthSelect); // 获取当前年份和月份 var now = new Date(); var year = now.getFullYear(); var month = now.getMonth() + 1; // 根据年份和月份计算当月天数 function getDaysInMonth(year, month) { var days = new Date(year, month, 0).getDate(); if (month == 2 && (year % 4 == 0 && year % 100 != 0 || year % 400 == 0)) { // 闰年2月29天 days = 29; } return days; } // 根据年份和月份生成日期选择框 function createDateInput(year, month) { var days = getDaysInMonth(year, month); var fragment = document.createDocumentFragment(); for (var i = 1; i <= days; i++) { var input = document.createElement('input'); input.type = 'text'; input.classList.add('date'); fragment.appendChild(input); } return fragment; } // 根据年份和月份生成星期几 function createWeekday(year, month) { var days = getDaysInMonth(year, month); var fragment = document.createDocumentFragment(); for (var i = 1; i <= days; i++) { var weekday = new Date(year, month - 1, i).getDay(); var td = document.createElement('td'); td.textContent = '日一二三四五六'[weekday]; fragment.appendChild(td); } return fragment; } // 根据人员和日期生成单元格 function createCell(name, shift, year, month) { var td = document.createElement('td'); if (shift) { // 班次行 var shifts = ['行政班', '生产班', '夜班']; for (var i = 0; i < 3; i++) { var checkbox = document.createElement('input'); checkbox.type = 'checkbox'; checkbox.classList.add('checkbox'); td.appendChild(checkbox); td.appendChild(document.createTextNode(shifts[i])); td.appendChild(document.createElement('br')); } } else { // 时间和日期行 if (name) { td.textContent = name; } else { td.rowSpan = 5; td.textContent = '渠际时\n陈海峰\n梁胜玉\n袁凯\n侯博文\n孙逍遥\n郭智豪\n杨沐松'; } if (year && month) { if (shift === undefined) { // 时间行 td.textContent = '行政班'; } td.appendChild(document.createElement('br')); td.appendChild(document.createTextNode(year + '年' + month + '月')); td.appendChild(document.createElement('br')); td.appendChild(createDateInput(year, month)); td.appendChild(document.createElement('br')); td.appendChild(createWeekday(year, month)); } } return td; } // 生成表格内容 for (var i = 0; i < 8; i++) { var tr = document.createElement('tr'); for (var j = 0; j < 35; j++) { tr.appendChild(createCell(null, i == 0 ? true : false, year, month)); } table.tBodies[0].appendChild(tr); } // 提交保存按钮 var submitButton = document.getElementById('submit'); submitButton.addEventListener('click', function() { // 保存表格数据 }); ``` 在这个代码中,我们首先创建了年份和月份的选择框,并将它们添加到表格中。然后,我们使用`createCell`函数来动态生成表格中的单元格。在这个函数中,我们根据参数来决定单元格的内容和样式。如果`shift`参数不为空,则表示生成班次行,否则表示生成时间和日期行。如果`name`参数不为空,则表示生成人名行的单元格,否则表示生成时间和日期行的单元格。最后,我们使用`createCell`函数来生成表格中的所有单元格,并将它们添加到表格中。 最后,我们在页面底部添加了一个提交保存按钮,并使用事件监听器来处理点击事件。在这个事件处理函数中,我们可以获取表格中的数据,并将它们保存到服务器或本地存储中。 这个实现方案可能还有很多需要改进的地方,比如表格样式、输入校验、数据格式等等。但是,我相信这个代码可以帮助你快速实现你的需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值