docker

docker

使用什么docker image来运行Go程序

有问必答myonlyzzy 回复了问题 • 24 人关注 • 22 个回复 • 3425 次浏览 • 2017-09-01 10:15 • 来自相关话题

用docker-machine创建Docker Swarm集群

文章分享myml 发表了文章 • 0 个评论 • 413 次浏览 • 2017-03-02 17:57 • 来自相关话题

参考文档 Install and Create a Docker Swarm


安装


要先安装virtualboxDocker Machine,Docker Machine 是一个简化Docker安装的命令行工具,在非linux系统用docker的同学应该用过。


加速


dockerHub访问比较慢,docker-machine执行create时加上--engine-registry-mirror参数来进行加速,例如docker-machine create -d virtualbox --engine-registry-mirror=https://3cd767jz.mirror.aliyuncs.com local


获取Token


已有docker环境
执行docker run swarm create来从dockerHub获取一个全球唯一的token


没有docker环境
执行docker-machine create -d virtualbox local创建一个docker环境


执行eval $(docker-machine env local) 进入刚创建的local,


再执行docker run swarm create获取token,
很简单吧。machine还有其它一些实用功能,可以自行查看文档


创建master


执行docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://$token swarm-master
$token请替换成上一步骤拿到的token


创建节点


创建节点和创建master类似,只是把--swarm-master参数去掉,名字改下。


执行docker-machine create -d virtualbox --swarm --swarm-discovery token://$token swarm-node-0


再创建一个docker-machine create -d virtualbox --swarm --swarm-discovery token://$token swarm-node-1
执行docker-machine ls可以看到


swarm-master   * (swarm)   virtualbox   Running   tcp://192.168.99.100:2376   swarm-master (master)   v17.03.0-ce   
swarm-node-0 - virtualbox Running tcp://192.168.99.101:2376 swarm-master v17.03.0-ce
swarm-node-0 - virtualbox Running tcp://192.168.99.102:2376 swarm-master v17.03.0-ce

执行eval $(docker-machine env --swarm swarm-master) !注意这里加上了--swarm参数,进入master,执行docker info可以看到集群信息

dockerSSH用ssh连接到docker

开源程序myml 发表了文章 • 5 个评论 • 541 次浏览 • 2017-02-11 21:59 • 来自相关话题

dockerSSH

用golang.org/x/crypto/ssh 实现的ssh服务器,能直接让你通过ss... 查看全部

dockerSSH


用golang.org/x/crypto/ssh 实现的ssh服务器,能直接让你通过ssh登陆到docker容器内,比如ssh ff756b3ea527@127.0.0.1 会登陆到ID为ff756b3ea527的容器,刚实现的尚不成熟,还有一些功能想去实现,比如scp,sftp

在docker swarm中使用grpc如何做负载均衡

有问必答jmzwcn 回复了问题 • 1 人关注 • 1 个回复 • 1337 次浏览 • 2017-02-07 19:40 • 来自相关话题

goroutine leak

回复

有问必答adolphlwq 发起了问题 • 3 人关注 • 0 个回复 • 685 次浏览 • 2017-01-05 22:28 • 来自相关话题

Docker 1.13最实用命令行:终于可以愉快地打扫房间了

文章分享数人云 发表了文章 • 0 个评论 • 729 次浏览 • 2016-12-22 11:09 • 来自相关话题

Docker 1.13出来已经有一段时间了,新版本添加了许多有用的命令,本文作者从处女座的洁癖(此处有雾)出发,告诉大家一些整理环境的小技巧。打扫房间... 查看全部


Docker 1.13出来已经有一段时间了,新版本添加了许多有用的命令,本文作者从处女座的洁癖(此处有雾)出发,告诉大家一些整理环境的小技巧。打扫房间再也不需费时又费力了,简单的命令,就可以轻松地把物品分门别类(容器、镜像、网络、存储卷……)地整理好^_^



在1.13版本中,Docker向CLI添加了一些有用的命令,让环境更加整洁。你可能已经体验了很长时间乱糟糟的开发环境——无用的容器,挂起的Docker镜像,弃置的volume,被遗忘的网络……所有这些过时的事物占据了宝贵的资源,最终导致环境无法使用。在之前的文章中曾经提到用各种各样的命令保持环境的整洁,例如:


docker rm -f $(docker ps -aq)


强制地删除所有正在运行的、暂停的以及终止的容器。同样地,也有命令可以删除挂起的镜像、网络和volume。


尽管上述命令解决了问题,但是它们要么专有,要么冗长或者难用。而新加入的命令直截了当又简单好用,现在就开始一一介绍吧。


管理命令


为了整理CLI,Docker 1.13引进了新的管理命令,如下:



  • system

  • container

  • image

  • plugin

  • secret


Docker的老版本中已经有了 network, node, service, swarm 和 volume 。这些新命令组子命令过去作为root命令直接实现。举个例子:


docker exec -it [container-name] [some-command]


exec 命令现在是 container 下面的一个子命令,这个命令相当于:


docker container exec -it [container-name] [some-command]


个人猜测为了兼容性的考虑,旧语句眼下还会使用一段时间。


Docker系统


现在有一个新管理命令 system 。它有4个子命令分别是 df, events, info 和 prune 。命令 docker system df 提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。


如果之前的命令展示出 docker 已经占用了太多空间,我们会开始清理。有一个包办一切的命令:


docker system prune


这个命令会删除当前没有被使用的一切项目,它按照一种正确的序列进行清理,所以会达到最大化的输出结果。首先删除没有被使用的容器,然后是volume和网络,最后是挂起的镜像。通过使用 y 回复来确认操作。如果想在脚本中使用这个命令,可以使用参数 --force 或者 -f 告诉Docker不要发来确认请求。


Docker容器


我们已经知道许多 docker container 的子命令。它们过去(现在也是)是 docker 的直接子命令。可以通过下面的命令得到完整的子命令列表:


docker container --help


在列表中会看到一个 prune 命令。如果使用它,那么只会删除无用的容器。因此这条命令比 docker system prune 命令更局限。使用 --force 或者 -f 同意可以让CLI不再进行确认请求。


Docker网络


这里也有一个 prune 命令:


docker network prune


删除所有孤立的网络。


Docker Volume


volume也有新的 prune 命令了:


docker volume prune


删除所有(本地)没有被容器使用的volume。


Docker镜像


新的镜像命令也是 prune 子命令。--force 用法如上面一样, --all 可以删除所有不用的镜像,不只挂起的镜像。


docker image prune --force --all


这个命令可以删除所有不使用的镜像并且不再请求确认。


总结


Docker 1.13不仅通过引入admin command添加了一些需要的命令,也让我们找到了一些非常有用的清理环境的命令。笔者最爱的命令莫过于 docker system prune,让环境一直保持干净整齐。


本文作者:Gabriel Schenker
原文链接:https://lostechies.com/gabrielschenker/2016/12/12/containers-cleanup-your-house-revisited/

数人云Meetup|分布式架构的开源组件大选

线下活动数人云 发表了文章 • 0 个评论 • 507 次浏览 • 2016-11-29 11:30 • 来自相关话题

开源组件与工具方便快捷,

在分布式架构中扮演着重要的角色,

企业按照实际需求也会对开源组件做更多优化,查看全部


开源组件与工具方便快捷,


在分布式架构中扮演着重要的角色,


企业按照实际需求也会对开源组件做更多优化,


无论是开源使用者还是开源贡献者,


面对各种各样的开源组件——容器、编排、大数据、数据库、监控、持续集成等等都会有苦恼,


选择哪一个?


不如,


我们通过「分布式架构的开源组件大选」来看看微软、阿里、PingCAP、数人云这些企业是如何用开源组件来做分布式架构,


并为开源做出了哪些贡献:)


活动中不仅可以了解各种开源组件实践,


还有嘉宾的开源成长分享以及程序员的职业规划建议,


愿来到现场的你可以有更多的收获~


嘉宾及议题介绍



刘鹏,微软云计算事业部 -高级软件开发工程师


曾在Bing新闻团队担任核心技术开发,擅长海量数据分析和系统设计,目前任职微软云计算事业部,主导开发基于Azure的融媒体解决方案


Topic1:《使用visual studio code的docker插件开发和调试nodejs应用程序》


1.VSCode简介
2.搭建nodejs + Docker开发环境
3.利用VSCode远程debug nodejs in Docker



杨成虎,阿里花名(叶翔),分布式和数据库高级技术专家


11年加入淘宝研发开源分布式缓存系统TAIR,此后一直在NoSQL领域摸爬滚打,利用NoSQL技术支撑了淘宝的天文交易量。当前专注于NoSQL的云服务化,正带领团队在MongoDB云服务上深耕细作。


Topic2:《阿里云ApsaraDB云数据库管理之道》


1.云数据库生命周期—生产,维护,下线
2.云数据库监控调度—大数据监控分析



黄东旭,PingCAP 联合创始人兼 CTO
曾就职与微软亚洲研究院,网易有道及豌豆荚,资深基础软件工程师,架构师。


擅长分布式系统以及数据库开发,在分布式存储领域有丰富的经验和独到的见解。狂热的开源爱好者以及开源软件作者,代表作品分布式 Redis 缓存方案 Codis,以及分布式关系型数据库 TiDB。


Topic3:《无痛的 MySQL 扩展方案 - TiDB 运维实践》


分享 TiDB 的用户在实际线上场景中使用 TiDB 来解决 MySQL 扩展性问题中得到的最佳实践和一些运维 tips,为 MySQL 的扩展提供一种新的思路。



春明,数人云资深架构师


8年互联网游戏后台开发经验, 先后就职于OpenFeint, GREE,Kabam等国际知名互联网游戏公司, Docker爱好者。数人云开源容器管理工具 Crane 和开源 Mesos 调度器 Swan 的主要研发者


Topic4:《一款分布式系统应用开发手记》


1.gPRC使用手记
2.将Raft集成到Mesos调度器Swan中
3.Actor模式和事件驱动


议程介绍


13:30 - 14:00 签到


14:00 - 14:40《使用visual studio code的docker插件开发和调试nodejs应用程序》刘鹏@微软


14:40 - 15:20《一款分布式系统应用开发手记》春明@数人云


15:20 - 16:00《阿里云ApsaraDB云数据库管理之道》杨成虎@阿里云


16:00 - 16:40《无痛的 MySQL 扩展方案 - TiDB 运维实践》黄东旭@PingCAP


16:40 - 17:00 自由交流


联合主办:DBAplus社群


时间:12月17日 14:00 - 17:00


地点:北京市海淀区丹棱街5号微软大厦1号楼1层故宫会议室



点击报名

来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享

文章分享lalala 发表了文章 • 1 个评论 • 551 次浏览 • 2016-11-14 18:05 • 来自相关话题


架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享。


Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化、可移植性是
CI/CD、DevOps、微服务的重要实现技术。但目前技术还不够成熟,在生产实践中还存在很多问题。对此,沪江黄凯、滴滴田智伟、蘑菇街张振华、蘑菇街向靖、扇贝丁彦以及七牛云袁晓沛在本期交流会上分享了各自的经验。本文是对此次交流的整理,欢迎探讨。





自由交流


沪江黄凯


大家好,我是来自沪江的 Java 架构师,我叫黄凯。在加入沪江之前,曾在 HP 和 IBM 的云计算部门担任核心开发和架构职位。对 IaaS、PaaS、SaaS,尤其是云存储有较深入的了解。2015 年加入沪江,担任架构师职位,主导的产品有:课件云存储,云转码等等。在这些项目中,我们使用 Mesos 和 Marathon 做 Docker 的编排工具,并开发了一个 Mesos Framework 做云转码的核心框架。


那么我们为什么要使用 Docker,也是机缘巧合。由于我们的服务开始的时候不是特别多,采用的就是一种普通的架构,后来随着服务的增多,发现部署和运维花的时间太长,我们想使用一些新的方式。开始的时候研究过 Openstack,后来觉得 Openstack 慢慢没落,于是我们就选中现在使用的 Docker。我们并不把 Docker 当成 VM 在用,而是使用它的原生的,在 Baremetal 上直接安装 Docker,这样运行效率比在 VM 运行 Docker 要来的快。课件云是由很多微服务组成,不光是一些存储,这种微服务是使用 Docker 部署,就相当于编排,把这些微服务部署上去。转码这一块是使用了 Mesos 框架,和 Docker 没有特别大的关系,但是转码的应用程序,比如说我们现在应用 FFmpeg,这个程序是运行在 Docker 里面的。


为什么要选择 Marathon?第一,我觉得 Mesos+Marathon 非常的容易理解。我们也研究过 Kubernetes 和其他的一些方法,发现从运维和研究的方面来说的话,Kubernetes 实在是太重而且太复杂,后来选择了Marathon。我们现在是内部服务使用,两个部门在使用转码集群,大概是 Baremetal 有 20 台的物理机。除去我们 API 的一些服务,还有一些第三方组件的服务的话,大概是有 400 多个 Docker 容器在跑。


滴滴田智伟


大家好,我是滴滴代驾事业部架构师,代驾事业部是公司最早尝试 Docker 虚拟化的事业部。目前主要方向是业务系统及部分中间件的 Docker 化,我们做的时间也不太长,半年多的时间。线上是因为我们有老的一套发布系统,集成涉及的部门比较多,所以我们基于原来的发布系统完成了预发布环境 Docker 的部署。线下环境基于 Docker+K8s 开发内部的自动化持续交付系统及开发测试环境管理。我们在做开发和测试环境的自动化,另一方面也是做环境管理的,两套环境。对于项目并行的时候发现原来很多不够用,原来很多配置是基于端口绑死的情况。现在基于开发 Kubernetes 的话,网络隔离用了一部分,然后主要是用环境变量这一部分,主要考虑是解决一个配置可以应用到在多个环境的情况,基于这个需求才用它。开发 Kubernetes 基于 Namespace,同一个服务在不同的 Namespace 下,它其实环境变量名可以是相同的,但是IP不同,而这一部分 IP 其实是由开发 Kubernetes 自己去管理的。基于环境变量获取一些配置的话,比如 IP 地址这种,就可以做到拿一份配置可以打出多套环境。


考虑业务的安全性和稳定性,线上基于纯 Docker 的方式在做。我们是基于裸的 Docker 来工作,主要是用资源隔离,没有借助调度框架,也没有自动伸缩。我们是两步走,一步是验证 Docker,其次是做开发 Kubernetes 线下使用和预研。为什么没有考虑 Mesos?刚才跟沪江的同学,我们的考虑是相反的。Mesos 侧重点更专一一点,首先不会有模块的划分,比如 Kubernetes 有 Replication controller ,Namespace 这种概念,而 Mesos 下几乎没有这种概念。我们拿 Kubernetes 主要是做一些编排的功能,而正好开发 Kubernetes 在整个发布和编排上,体系更全面一点。Mesos 最早是做资源管理,基于 Docker 做一个 Framework 接进来的话,它不是专门为编排而生。Kubernetes 首先解决我们的问题是,我们可能不需要加多份配置就可以搭多套不同的环境,它就是基于 Namespace 做一个多租户的概念,会对 Service 做一层隔离,对于动态配置,扩容这一部分暂时我们没用到,确实用到的一些场景比较少。主要是做不同环境的隔离,并没有太多使用编排细节上的东西,动态伸缩之类的目前线下没有太大必要,线上可能会用到。


蘑菇街向靖


大家好,我是向靖,来自蘑菇街的运维架构师。我们接下来会做一个 PaaS 平台,想做 Docker 和结合虚拟机以及我们用到公有云产品,做成一个混合云的架构平台。我们现在 Docker 也在用,更多的是当虚拟机用,后面我们想基于 Docker 原生的方式去用,可能会涉及资源调度,服务发现的问题。除了 Docker,我们还会用到公有云,公有云更多是虚拟机的方式提供。出于混合云,想在资源层做一个抽象,对于上层业务来讲它没有关系,它是跑在 Docker 上,还是云主机上,还是 KVM 虚拟机上,那么我想在这上面做一个抽象。另外还有,刚才我也是提问滴滴架构师的问题,配置怎样和代码做隔离,这个也是我考虑的问题。因为我看 Docker 用了环境变量,通过环境变量做一些配置的参数的传递,但是在虚拟机上,特别是在物理机上,通过环境变量的方式,我还在考虑有没有安全的风险,Docker 可能是一个只读的,不会被修改的,但是对于虚拟机以及物理机来说,可能会存在被修改的风险。


蘑菇街张振华


大家好,我叫张振华,花名郭嘉,我是 14 年从思科加入蘑菇街。我们算是国内用 Docker 比较早的,我们一开始用 Docker 是 1.3.2 的版本,当时我们采用集群管理工具还是 Openstack,因为当时 Kubernetes 还不是很成熟。当时也走了一些弯路,比如我们把 Docker 当成虚拟机来用,曾经在线上的规模也达到几百台虚拟机几千个容器,但是我们逐步发现不能把 Docker 当成虚拟机来使用,因此我们做了一个转型,从去年开始研究 Kubernetes,现在 Kubernetes 加 Docker 的版本开发完成了,准备逐步上线。


我们为什么选用 Kubernetes?编排工具的选择我们也是做过一番调研的,它们没有谁好谁不好这一说,只能说谁更贴切你的需求。对于我们蘑菇街来说,我们需要解决是资源利用率的问题,和运维的对接,我们需要有预发和线上环境的持续集成持续部署的过程,还有我们需要有对资源的隔离,对部署的快速迭代,包括集群管理,这些方面,我们觉得 Kubernetes 更加适合于我们。


在网络方面,我们研究过现在在开源界比较常用的一些方案,但是我们都觉得不太适合,比较 Fannel,Caico 等等,他们一般用的技术都是 VXLAN,或者是用 BGP。因为我们之前对 Openstack 的网络是比较有经验的,然后我们发现有一个项目,具体名字不记得,Neutron 和 Kubernetes 做一个对接,我们在这个项目的基础上做了 VLAN 的方案,我们的网络没有用 VXLAN 来做,而是选择 VLAN 来做,这样的话一个 Docker 它可以获得跟一个物理理同一个网络平面的 IP,我们的应用程序可以直接对外访问,因为我们内部业务有这个需求选择这个方案。虽然 Docker 内部网络和外部网络是通的,但 Docker 还是独立的一个网段,不需要一层 NAT 的转换。我们直接走二层的,是在交换机走 Chunk,本来物理机交换机的 Access 口,这样的话,一台物理机上面允许跑多个 VLAN 的容器,比如说 A 业务和 B 业务要走隔离的话,通过网络的 VLAN 走隔离,它们的数据之间不会有干扰。


Load Balance 我们还没有涉及到这一块,Load Balance 我们应该会在 nginx 上做一层。因为据我了解,现在 Kubernetes 这一块 Proxy 还不是很成熟,这上面还存在一些问题,因此还不敢用 Kubernetes 现有提供的服务。服务发现和注册这一块我们还在做开发,这块会和配置管理中心打通。我们内部也有其他团队在做这些功能,所以我们会和内部的中间件团队合作。


七牛云袁晓沛


大家好,我是七牛云数据处理技术总监袁晓沛。我们的数据处理业务包括了图片和视频的实时在线及异步处理。数据处理的业务量比较大,日均请求量达到百亿级。平台采用容器技术的原因是借助容器技术快速部署,启动的特性,数据处理程序可以根据数据处理量快速地弹性伸缩。借助容器技术内核级别的资源隔离和访问控制,每个数据处理程序可以运行在一个私有的环境,不被其它程序所干扰,保证其上运行数据是安全可靠的。而且容器技术是轻量的,它以最小的资源损耗提供资源隔离和访问控制,而资源特别是计算资源在数据处理中是非常宝贵的。


我们在资源调度上采用的是 Mesos,而二层的业务调度框架则是自己自研的。七牛自身拥有近千台的物理机,容器是直接运行的物理机上,可以减少虚拟层对资源的消耗,提高资源的利用率。


在网络上,对于七牛的自定义数据处理服务直接使用的是 Host 模式,而对第三方数据处理服务则使用的是 Bridge 模式,因为这些程序是用户自己部署运行的,并不知道用户是否有开启其他的端口使用,所以使用的是 Bridge 模式,需要对外使用端口的都需要通过 NAT 进行暴露,这样服务内部使用了什么端口并不会对外界环境造成影响,对平台环境做了非常好的安全隔离。我们是使用 Consul 做注册中心,支持跨数据中心的服务发现。我们为什么自研的调度框架,而不用 Marathon。因为 Marathon 不支持跨数据中心的内部服务或外部服务的发现,而七牛有多个数据中心,影响整体的调度,其次如果选用 Marathon 的话,根据我们业务的特点,还是要再做一层对 Marathon 的包装才能作为 Dora 的调度服务,这样模块就会变多,部署运维会复杂。


扇贝丁彦


大家好,我是扇贝的技术总监丁彦,之前在暴走漫画,先后在暴走漫画和扇贝设计和主导了基于 Docker 的微服务架构系统,以及数据收集和分析系统。去年来到扇贝,这里是 Python 的开发环境。后来发现业务增长快,水平扩展一些机器,出现问题需要换个机器等等,都需要非常熟悉业务的少数开发去做。另外公司对预算控制严格,机器基本都是满负荷运作,平时也不可能多开空置的机器,已有的机器还要根据负载情况调整服务分布情况,所以这种切换服务,增删服务的操作还是比较频繁的。因此,我们用了 2-3 个月的时间将所有的运行环境都切换到 Docker上,这大大提高了我们的运维能力。


Docker 包装有几个好处。


第一个好处是,环境升级非常方便。因为只要pull 一下最新的镜像,启动一个 Container,环境就升级了。而如果直接基于公有云的镜像升级的话就很难,因为一台机器上跑哪些服务其实不一定是固定的,并且之前做的镜像只要有一台机器是还基于它的话,就删除不掉的,镜像数量又有上限。所以 Docker 非常好地解决了我们的问题。


其次是环境的颗粒度会更小,一台机器上配好几个应用的话,往往配着配着,到最后你就不太能精确地记得上面装的程序或者库是给哪个应用服务的,应用之间如果依赖有版本的冲突也很难调和。你想做些服务的迁移,把负载比较小的放一起,把负载比较大的抽出来,这个时候就非常痛苦,但你如果用 Docker 包装后就非常简单,只要在不同的机器上起不同的 Container,就可以实现这一点。


第三,我们不光用了 Docker,还加入了服务发现,刚刚讨论配置管理这些,我们一并做了。Docker 启动时候,我们自己写了一些工具,可以自定义 Docker 启动参数,包括配置参数,比如说,一些程序要运行的参数,我们主要用两种方式,一种方式是通过环境变量灌进去,还有一种方式让程序的启动脚本支持参数,然后拼接不同的参数灌进去,最终都是落实到 Docker 的启动命令上。服务发现是基于 Consul,Docker 的启动命令是从 Consul 里取的。首先 Consul有 HTTP 的 API,我们是自己写的 pip 包,只要 Include 一下这个包就可以了,Docker 的服务启动后会自动注册到 Consul。比如要在负载后加一个服务,只需要找到一台机器,启动对应的 container,剩下的事情它自己会到 Consul,注册它的参数地址一系列东西,自动把它加进去。所以这些都是自动化的,如果检测那台机器/服务挂了,Health Check 也会到 Consul 里面更新。该增加机器就增加机器,该下线就下线。总体来说,我们的生产环境全部跑在 Docker 上面的,然后区分有状态和无状态两种,有状态的定死在机器上,无状态的灵活的自由切换。还有一点,如果是有状态的容器要定死在机器上的时候,我们一般来说都会采取冗余的结构,至少保证有两个在运行,一个挂了,保证整体的服务在运行。其次基于 Docker,我们还做了一套数据搜集以及分析的机制。数据搜集是基于日志来搜集的,利用 Docker 的 Log driver,把日志打到 Filter,把结果存在存储服务上。同时监控也是基于日志做的。第三部分非生产环境,比如开发环境跟测试环境都是 Docker 做的,因为我们每一个服务都做了 Image、镜像,用容器方式跑的。通过参数来决定启动方式的,我们可以在开发环境以及测试环境采用不同的参数来启动容器。 通过 Consul 来隔离的,因为 Consul 的服务发现,开发、生产、测试环境在不同的自动发现框架里不会相互影响到。目前机器在 120 台左右,基于云服务。有些基础的东西不需要依赖于 Docker,比如说申请云主机,申请的时候就可以指定它的 CPU 和内存这些服务器资源的配置。所以这部分东西还是属于 Human schedule,不是完全让编排的系统自己决定该怎么样。


编排工具我们现在在研究进一步,我刚来这工作的时候,所有的服务没有一个跑在 Docker 上面的,我现在把它迁进来。现在数据增长,已经有一些编排的瓶颈,现在在做调研,可能基于 Swarm,做自动编排的设计。




指定话题交流



主持人:容器多的情况下 Kubernetes 存在性能问题,各位在这方面有没有好的经验?



扇贝丁彦:我们其实也遇到了这个问题,找不到办法所以放弃了 Kubernetes。我们也是用公有云,网络直接依赖公有云的网络,有可能是因为公有云造成的,我没有试过在祼机上试过。


沪江黄凯: Kuberneters 的 Fannel 有一种模式是 VXLAN,它的封装折包是做内核里做的,效率会高一点。容器多就会效率会低是因为,在 Kubernetes 1.2 的时候,走这样的一种模式,数据先到内核态中,然后把数据拉回到用户态,用 Proxy 的方式分发给各个容器当中的。其实在 Kubernetes 1.3 以后,它直接在iptables里设规则,相当于用户数据不用跑到用户态,在内核直接分发出去了,这种效率会非常高。所以可以研究一下 Kubernetes 新版本。


扇贝丁彦:我们碰到过网络方面的问题。默认的 Docker engine 的启动参数里面有个 iptables,不知道大家有没有定制化过,如果不定制化这个参数,它默认会帮你建 iptables 的转发规则,并会开启内核的网络追踪的模块。一开始我们没有注意这件事情,当我们的 Nginx 迁到 Docker 的时候,Nginx 服务瞬间会挂。后来查原因,是因为这些参数会开启网络追踪模块。因为我们的 Nginx 流量非常大,当时只有 3 台 Linux 云主机,分发 http 请求的,然后会导致 3 台Linux宿主机,内存会被刷破,网络会出现堵塞。所以我们关掉了 iptables 参数,并采用 Host 的网络模型。所以它的容器拿到的 IP 就是 Host 的 IP。我们一开始也想上一些 Kubernetes 这些东西,然后发现简单跑个模型根本跑不起来,所以一开始就放弃了这一套东西,直接搞了个裸的 Docker。



主持人:关于跨数据中心容器集群的使用,大家有经验么?



沪江黄凯:我们跨数据中心主要是IP分配上的问题,我们现在也在尝试使用 Calico,如果 Host 网络是通的话,那么它的内部网络也就通了,可以自由划 VLAN,这样你就可以解决跨 Data center 的问题。还有一个问题就在跨 Data center 时,服务注册与发现的问题。这个问题也困扰我们很久了,我们现在使用 Consul 做服务注册与发现。虽然 Consul 它是官方支持跨 Data center,但是我们在使用当中的话会发现注册的 IP,在另外一个注册中心,它会发现的比较慢,甚至有时候出现 IP 冲突的时候。


我们的做法是把 Host 的 IP 地址直接用 Environment 的形式注到 Docker 镜像内部,接下 来 Docker 镜像要注册,它就会读取 App 的 IP,然后发送给 Consul,只要保证 Host 的 IP 和 Docker内部容器的 IP 能够互通的就行了。如果不能通的话,比如说完全和 Host IP 隔离,那么起码有几台机器要暴露出去,又比如说,Consul 它本身自己要暴露出去才能访问到。Host 的 IP 是容器启动之后注进去的,启动命令中把 Host 的 IP 地址加在 -e 的后面,容器在启动之后,它的环境就会有这么一个 IP。我们用 Mesos 就没这个问题,但是用 Kubernetes 就有这个问题。Mesos 会自动帮你把这些东西注入容器中去。


滴滴田智伟:其实 Kubernetes 本身也是可以解决这个问题,我们现在在做线下持续交付的时候。定义完 Service 之后,容器会同一个 Namespace 默认加一个系统环境变量。


沪江黄凯:我们试过,在 Pod 启动之后,Pod 里容器想访问 host 的 IP 地址,是没有办法做到的。


蘑菇街张振华:因为我们之前也遇到这个问题,然后我们业务方,他们可能有一些程序会获取本机 IP 地址,如果是内部的 IP 地址,他们程序可能会出现问题,于是我们当时没有用 Docker 默认的网络,而是采用 VLAN。



主持人:我们提到好多 Mesos、Kubernetes、网络,发现没有提自动伸缩,有没有项目涉及到容器的自动伸缩?



沪江黄凯:我们沪江是基于 Mesos+Marathon 做了自己的一个服务,它这个服务是干嘛的呢,就是监测,不停的监测每一个 Docker 的 CPU 和内存的利用率,一旦超过百分之多少以后,就向 Marathon 发一个命令,说我要扩容,它还可以支持时间点,比如 15 分钟监测一次,如果在 15 分钟发现它超过阈值了,就马上扩容出来,但是缩的话,不是适用于频繁监控,如果小于 20% 的话就会缩,一旦缩的话会影响线上用户的请求。怎么办呢?我们在缩的时候可以规定它的时间点,比如半夜里 2-3 点,访问量少于多少点时候把它缩掉。我们监测的是 Docker 内部的 CPU 的使用率。就是监测一个服务,它可以监控所有同一服务的 Container,比如一个服务有 100 个容器,那么这一百多个 CPU 利用率加起来除于一百,相当于平均的利用率。如果平均利用率超过 80%了,那说明这个集群到了扩展程度了,它会以一种比例来扩展。针对单个容器,可以设置内存的限制。我们给每一个容器呢,比如它只能用 4 个 CPU,只能用 8G 的内存,或者更小一点的内存,这些都设好,设好之后它自动扩展相同规格的容器。这么做是因为 Cgroup 有个问题,当利用率到达了启动的限制,Cgroup 会把这个容器 kill 掉。这个是不可理喻的问题,所以我们想到用 Load scale 来扩容,不让他直接死掉。


滴滴田志伟:关于自动扩容,我们线下的时候遇到一个问题,我们最早的时候是用腾讯的公有云,它限制了 NET 的模块,导致我们最初用 Cgroup 的方案去做,绑定端口。内部使用所有应用,端口是要做分配的,要不然出现端口冲突。然后遇到问题是,在这种情况下,如果要做动态扩容的话,它每次先创建一个,再杀掉一个,导致每次起来的时候就起不来了,因为端口的问题。服务启动的时候端口是随机,会出现冲突问题,因为用的是 Host 的模式。



主持人:关于自动伸缩为什么没有考虑到请求数?因为如果内存占用率如果超过一定预支,那么请求数也可能超过一定预支了。把单个容器所处理的请求数给限定了,那么它内存自然不会超,然后也不会被干掉。



沪江黄凯:我个人认为,第一,请求数很难测,你不知道请求数到多少时要扩容,还不如根据 CPU 到 80%,或者 90% 来的直观。我们的 API 也是根据 CPU 来算的。你真正是高并发的 API 的话,我也测过,最后我们能够监测到的,其实还是 CPU 和内存。


扇贝丁彦:我们扩容是根据响应时间,跟请求数类似,请求数定指标不太好定,我们是根据响应时间,比如平时的响应时间是 50 毫秒,当响应时间是 300 毫秒的时候就要扩容了。



主持人:关于自动伸缩为什么没有考虑到请求数?因为如果内存占用率如果超过一定预支,那么请求数也可能超过一定预支了。把单个容器所处理的请求数给限定了,那么它内存自然不会超,然后也不会被干掉。



沪江黄凯:关于存储,我们是有一些研究的。现在容器存储问题分为两种,Kubernetes 官方支持一种理念,任何一种存储都是一个 Volume。Volume 先于 Docker 存在的,而不是 Docker 启动之后再挂载 Volume。不管是网络存储还是本地存储,全部以卷的形式,挂载在 Pod 里面或者是宿主机上,以 Driver mapper 来驱动这个 Volume,来读到你所要的内容。


还有一种情况,就是 Docker 公司主导的存储模型,任何的存储都是一种驱动。如果你想用 NFS 或者如 Ceph 这样分布式存储的话,让 Ceph 开发 Docker 的驱动,Docker run 的时候指定存储的驱动,Docker storage driver 这种方式,外部的存储在容器内部它展现形式可以是目录,也可以是挂载卷、块的形式。如果用块挂载到容器中,这个容器自己格式化它,或直接读取它都是可以的。它只不过它是相当于用了一个 Driver 的形式,把你的容器和分布式存储建立一个连接而已。对于容器,如果原本绑定块或 Volume,容器出现故障的话,直接把容器杀掉,再启动挂在同样一个 块或Volume 就解决了。优点是直接读取,而不是通过再转一层,效率比较高一点。所有存储都是 Volume 的形式理解度比较高一点,所以我们还是赞同于用 Volume 的形式。


有状态的容器。我知道 k8s 的新的计划,如果你没有用 Kubernetes 最新版本的话,一般来说我们都是容器启动在固定 Host 上,下次启动还是在这台 Host 上,它的存储它的内存,包括一些 log,全部是在这台 Host 上。还有一种是用最新的版本,有个 PetSet 的新 kind,Kubernetes 它自己会记录 Pod 在什么 Host 上启动过,不用自己去指定一定要在某一台 Host 上启动,这种方法比较智能化,但是不是特别稳定的一种方法,因为它是刚刚开发出来的新功能。



主持人:关于自动伸缩为什么没有考虑到请求数?因为如果内存占用率如果超过一定预支,那么请求数也可能超过一定预支了。把单个容器所处理的请求数给限定了,那么它内存自然不会超,然后也不会被干掉。



沪江黄凯:我个人认为还是在同一台机器上起一个新的实例,不要让它做数据迁移,因为数据迁移会占用很多资源。而且如果你的想法是说,所有的分布式的存储只是以 Volume 的形式挂载在宿主同上,这也就没什么问题了。因为存储和 Docker 是完全分开来的。如果只有一个 Volume,存储的可靠性会得不到保障,所以在 Kubernetes 新版本当中,它会建立一个 Volume 的 kind,也相当于建立 RC kind一样,是一个 Pod,那这样由 Kubernetes 来保障这个 Volume 的高可用。

动手造轮 | 一款Bash 脚本 +HTTP 请求工具 +JSON 解析工具组成的测试小工具

开源程序数人云 发表了文章 • 2 个评论 • 590 次浏览 • 2016-11-03 12:23 • 来自相关话题

数人云开源一款容器管理工具Crane,Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团... 查看全部


数人云开源一款容器管理工具Crane,Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团队自制了一套适合Crane API测试的小工具。它也适用于其他接口测试,小数发现很多朋友对它感兴趣,就勤劳地搬运过来,希望能为大家提供一个参考和思路。



针对Crane团队只向外输出API的特点, 选择测试工具是秉着以下原则的:



  • 第一, 功能不要太复杂,学习曲线不能太陡, 功能够用就行;

  • 第二, 可编程要好, 最好不要有界面,程序员友好。


于是一款简单的Bash脚本+HTTP 请求工具+JSON解析工具组成的测试小工具雏形出现了。


下面给大家展现这款工具的构成


Bash脚本: 测试工具的粘合剂, 不是Java也不是Python, 用Bash简单易用,功能强大。
Httpie: 一款类似curl的http工具, 不过比curl简单的多, 尤其是想发个JSON请求时候, 更简单。
jq: jq是一款命令行解析JSON文本的工具, 支持非常多的语法解析构造重组JSON文本。


下面依次给大家介绍一下httpie和jq的基本用法


1. 例子说明如何使用httpie


httpie在terminal下的命令是http, 先来几个简单的例子给演示一下用法。


http get http://httpbin.org/get header:header-content



其中, http是命令, get是请求method, http://httpbin.org 是请求地址, httpbin是一个http的测试服务; 用冒号相连的参数代表着HTTP请求头, 用等号连接为请求body中的JSON键和值。 httpie默认的请求为json请求, 所以不用过多指明,header已经加上了Content-Type:application/json。


http post http://httpbin.org/post header:header-content json-key=json-value



http支持很多命令行选项, 介绍一个有意思的是 --check-status, check-status是把http response的非200值设置成进程的exit code, 比如:



如上所示, 请求一个不存在的地址时候进程退出符号变成了4。 我们将大量使用这个feature来判断返回值。


2. 例子说明如何使用jq


下面我们用几个例子介绍一下jq的用法。



上图演示如何提取一个json的key。



如何提取一个嵌套的key。



提取数组中的元素。


篇幅关系我们不过多展示jq的高级功能, 除了基本的解析和构造以外,jq支持大量的filter, 如有兴趣可参考https://stedolan.github.io/jq/ ... tions


3. Crane测试工具的几个场景


场景一: 我期望测试API的HTTP测试的返回状态比如200, 404, 500


首先bash造了几个基本的函数来输出错误, 和判断状态



使用方法



场景二: 登录过程测试



更多的测试例子可参考https://github.com/Dataman-Clo ... _test


至此,一款可用的测试工具出炉了, 虽然简单,不过功能恰到好处,非常适合我们的场景, 再也不怕API出错发现不了了。 聪明的同事们把这工具配到了jenkins和单元测试一起执行, 出错了还能得到邮件通知, 酷极了。

RunC/RKT/Docker 这几个容器工具各有什么优缺点?

技术讨论astaxie 回复了问题 • 2 人关注 • 1 个回复 • 929 次浏览 • 2016-11-02 12:09 • 来自相关话题

Docker与Golang的巧妙结合

文章分享田浩浩 发表了文章 • 0 个评论 • 765 次浏览 • 2016-10-27 11:48 • 来自相关话题

译文转载:Docker与Golang的巧妙结合


【编者的话】这是一个展示在使用Go语言时如何让Dock... 查看全部

译文转载:Docker与Golang的巧妙结合




【编者的话】这是一个展示在使用Go语言时如何让Docker更有用的提示与技巧的简辑。例如,如何使用不同版本的Go工具链来编译Go代码,如何交叉编译到不同的平台(并且测试结果!),或者如何制作真正小的容器镜像。


下面的文章假定你已经安装了Docker。不必是最新版本(这篇文章不会使用Docker任何花哨的功能)。


没有go的Go


...意思是:“不用安装go就能使用Go”


如果你写Go代码,或者你对Go语言有一点点兴趣,你肯定要安装了Go编译器和Go工具链,所以你可能想知道:“重点是什么?”;但有些情况下,你想不安装Go就来编译Go。



  • 机器上依旧有老版本Go 1.2(你不能或不想更新),不得不使用这个代码库,需要一个高版本的工具链。

  • 想使用Go1.5的交叉编译功能(例如,确保能从一个Linux系统创建操作系统X的二进制文件)。

  • 想拥有多版本的Go,但不想完全弄乱系统。

  • 想100%确定项目和它所有的依赖,下载,建立和运行在一个纯净的系统上。


如果遇到上述情况,找Docker来解决!


在容器里编译一个程序


当你安装了Go,你可以执行go get -v github.com/user/repo来下载,创建和安装一个库。(-v只是信息显示,如果你喜欢工具链快速和静默地运行,可以将它移除!)


你也可以执行go get github.com/user/repo/...来下载,创建和安装那个repo(包括库和二进制文件)里面所有的东西。


我们可以在一个容器里面这样做!


试试这个:


docker run golang go get -v github.com/golang/example/hello/...

这将拉取golang镜像(除非你已经有了,那它会马上启动),并且创建一个基于它的容器。在那个容器里,go会下载一个“hello world”的例子,创建它,安装它。但它会把它安装到这个容器里……我们现在怎么运行那个程序呢?


在容器里运行程序


一个办法是提交我们刚刚创建的容器,即,打包它到一个新的镜像:


docker commit $(docker ps -lq) awesomeness

注意:docker ps –lq输出最后一个执行的容器的ID(只有ID!)。如果你是机器的唯一用户,并且你从上一个命令开始没有创建另一个容器,那这个容器就是你刚刚创建的“hello world”的例子。


现在,可以用刚刚构建的镜像创建容器来运行程序:


docker run awesomeness hello

输出会是Hello, Go examples!


闪光点


当用docker commit构建镜像时,可以用--change标识指定任意Dockerfile命令。例如,可以使用一个CMD或者ENTRYPOINT命令以便docker run awesomeness自动执行hello。


在一次性容器上运行


如果不想创建额外的镜像只想运行这个Go程序呢?


使用:


docker run --rm golang sh -c \
"go get github.com/golang/example/hello/... && exec hello"

等等,那些花哨的东西是什么?



  • --rm 告诉Docker CLI一旦容器退出,就自动发起一个docker rm命令。那样,不会留下任何东西。

  • 使用shell逻辑运算符&&把创建步骤(go get)和执行步骤(exec hello)联接在一起。如果不喜欢shell,&&意思是“与”。它允许第一部分go get...,并且如果(而且仅仅是如果!)那部分运行成功,它将执行第二部分(exec hello)。如果你想知道为什么这样:它像一个懒惰的and计算器,只有当左边的值是true才计算右边的。

  • 传递命令到sh –c,因为如果是简单的做docker run golang "go get ... && hello",Docker将试着执行名为go SPACE get SPACE etc的程序。并且那不会起作用。因此,我们启动一个shell,并让shell执行命令序列。

  • 使用exec hello而不是hello:这将使用hello程序替代当前的进程(我们刚才启动的shell)。这确保hello在容器里是PID 1。而不是shell的是PID 1而hello作为一个子进程。这对这个微小的例子毫无用处,但是当运行更有用的程序,这将允许它们正确地接收外部信号,因为外部信号是发送给容器里的PID 1。你可能会想,什么信号啊?好的例子是docker stop,发送SIGTERM给容器的PID 1。


使用不同版本的Go


当使用golang镜像,Docker扩展为golang:latest,将(像你所猜的)映射到Docker Hub上的最新可用版本。


如果想用一个特定的Go版本,很容易:在镜像名字后面用那个版本做标签指定它。


例如,想用Go 1.5,修改上面的例子,用golang:1.5替换golang


docker run --rm golang:1.5 sh -c \
"go get github.com/golang/example/hello/... && exec hello"

你能在Docker Hub的Golang镜像页面上看到所有可用的版本(和变量)。


在系统上安装


好了,如果想在系统上运行编译好的程序,而不是一个容器呢?我们将复制这个编译了的二进制文件到容器外面。注意,仅当容器架构和主机架构匹配的时候,才会起作用;换言之,如果在Linux上运行Docker。(我排除的可能是运行Windows容器的人!)


最容易在容器外获得二进制文件的方法是映射$GOPATH/bin目录到一个本地目录,在golang容器里,$GOPATH/go.所以我们可以如下操作:


docker run -v /tmp/bin:/go/bin \
golang go get github.com/golang/example/hello/...
/tmp/bin/hello

如果在Linux上,将看到Hello, Go examples!消息。但如果是,例如在Mac上,可能会看到:


-bash:
/tmp/test/hello: cannot execute binary file

我们又能做什么呢?


交叉编译


Go 1.5具备优秀的开箱即用交叉编译能力,所以如果你的容器操作系统和/或架构和你的系统不匹配,根本不是问题!


开启交叉编译,需要设置GOOS和/或GOARCH


例如,假设在64位的Mac上:


docker run -e GOOS=darwin -e GOARCH=amd64 -v /tmp/crosstest:/go/bin \
golang go get github.com/golang/example/hello/...

交叉编译的输出不是直接在$GOPATH/bin,而是在$GOPATH/bin/$GOOS_$GOARCH.。换言之,想运行程序,得执行/tmp/crosstest/darwin_amd64/hello.


直接安装到$PATH


如果在Linux上,甚至可以直接安装到系统bin目录:


docker run -v /usr/local/bin:/go/bin \
golang get github.com/golang/example/hello/...

然而,在Mac上,尝试用/usr作为一个卷将不能挂载Mac的文件系统到容器。会挂载Moby VM(小Linux VM藏在工具栏Docker图标的后面)的/usr目录。(译注:目前Docker for Mac版本可以自定义设置挂载路径)


但可以使用/tmp或者在你的home目录下的什么其它目录,然后从这里复制。


创建依赖镜像


我们用这种技术产生的Go二进制文件是静态链接的。这意味着所有需要运行的代码包括所有依赖都被嵌入了。动态链接的程序与之相反,不包含一些基本的库(像“libc”)并且使用系统范围的复制,是在运行时确定的。


这意味着可以在容器里放弃Go编译好的程序,没有别的,并且它会运行。


我们试试!


scratch镜像


Docker生态系统有一个特殊的镜像:scratch.这是一个空镜像。它不需要被创建或者下载,因为定义的就是空的。


给新的Go依赖镜像创建一个新的空目录。


在这个新目录,创建下面的Dockerfile:


FROM scratch
COPY ./hello /hello
ENTRYPOINT ["/hello"]

这意味着:从scratch开始(一个空镜像),增加hello文件到镜像的根目录,*定义hello程序为启动这个容器后默认运行的程序。


然后,产生hello二进制文件如下:


docker run -v $(pwd):/go/bin --rm \
golang go get github.com/golang/example/hello/...

注意:不需要设置GOOSGOARCH,正因为,想要一个运行在Docker容器里的二进制文件,不是在主机上。所以不用设置这些变量!


然后,创建镜像:


docker build -t hello .

测试它:


docker run hello

(将显示“Hello, Go examples!”)


最后但不重要,检查镜像的大小:


docker images hello

如果一切做得正确,这个镜像大约2M。相当好!


构建东西而不推送到Github


当然,如果不得不推送到GitHub,每次编译都会浪费很多时间。


想在一个代码段上工作并在容器中创建它时,可以在golang容器里挂载一个本地目录到/go。所以$GOPATH是持久调用:docker run -v $HOME/go:/go golang ....


但也可以挂载本地目录到特定的路径上,来“重载”一些包(那些在本地编辑的)。这是一个完整的例子:


# Adapt the two following environment variables if you are not running on a Mac
export GOOS=darwin GOARCH=amd64
mkdir go-and-docker-is-love
cd go-and-docker-is-love
git clone git://github.com/golang/example
cat example/hello/hello.go
sed -i .bak s/olleH/eyB/ example/hello/hello.go
docker run --rm \
-v $(pwd)/example:/go/src/github.com/golang/example \
-v $(pwd):/go/bin/${GOOS}_${GOARCH} \
-e GOOS -e GOARCH \
golang go get github.com/golang/example/hello/...
./hello
# Should display "Bye, Go examples!"

网络包和CGo的特殊情况


进入真实的Go代码世界前,必须承认的是:在二进制文件上有一点点偏差。如果在使用CGo,或如果在使用net包,Go链接器将生成一个动态库。这种情况下,net包(里面确实有许多有用的Go程序!),罪魁祸首是DNS解析。大多数系统都有一个花哨的,模块化的名称解析系统(像名称服务切换),它依赖于插件,技术上,是动态库。默认地,Go将尝试使用它;这样,它将产生动态库。


我们怎么解决?


重用另一个版本的libc


一个解决方法是用一个基础镜像,有那些程序功能所必需的库。几乎任何“正规”基于GNU libc的Linux发行版都能做到。所以,例如,使用FROM debianFROM fedora,替代FROM scratch。现在结果镜像会比原来大一些;但至少,大出来的这一点将和系统里其它镜像共享。


注意:这种情况不能使用Alpine,因为Alpine是使用musl库而不是GNU libc。


使用自己的libc


另一个解决方案是像做手术般地提取需要的文件,用COPY替换容器里的。结果容器会小。然而,这个提取过程困难又繁琐,太多更深的细节要处理。


如果想自己看,看看前面提到的ldd和名称服务切换插件。


用netgo生成静态二进制文件


我们也可以指示Go不用系统的libc,用本地DNS解析代替Go的netgo


要使用它,只需在go get选项加入-tags netgo -installsuffix netgo



  • -tags netgo指示工具链使用netgo

  • -installsuffix netgo确保结果库(任何)被一个不同的,非默认的目录所替代。如果做多重go get(或go build)调用,这将避免代码创建和用不用netgo之间的冲突。如果像目前我们讲到的这样,在容器里创建,是完全没有必要的。因为这个容器里面永远没有其他Go代码要编译。但它是个好主意,习惯它,或至少知道这个标识存在。


SSL证书的特殊情况


还有一件事,你会担心,你的代码必须验证SSL证书;例如,通过HTTPS联接外部API。这种情况,需要将根证书也放入容器里,因为Go不会捆绑它们到二进制文件里。


安装SSL证书


再次,有很多可用的选择,但最简单的是使用一个已经存在的发布里面的包。


Alpine是一个好的选择,因为它非常小。下面的Dockerfile将给你一个小的基础镜像,但捆绑了一个过期的跟证书:


FROM alpine:3.4
RUN apk add --no-cache ca-certificates apache2-utils

来看看吧,结果镜像只有6MB!


注意:--no-cache选项告诉apk(Alpine包管理器)从Alpine的镜像发布上获取可用包的列表,不保存在磁盘上。你可能会看到Dockerfiles做这样的事apt-get update && apt-get install ... && rm -rf /var/cache/apt/*;这实现了(即在最终镜像中不保留包缓存)与一个单一标志相当的东西。


一个附加的回报:把你的应用程序放入基于Alpine镜像的容器,让你获得了一堆有用的工具。如果需要,现在你可以吧shell放入容器并在它运行时做点什么。


打包


我们看到Docker如何帮助我们在干净独立的环境里编译Go代码;如何使用不同版本的Go工具链;以及如何在不同的操作系统和平台之间交叉编译。


我们还看到Go如何帮我们给Docker创建小的,容器依赖镜像,并且描述了一些静态库和网络依赖相关的微妙联系(没别的意思)。


除了Go是真的适合Docker项目这个事实,我们希望展示给你的是,Go和Docker如何相互借鉴并且一起工作得很好!


致谢


这最初是在2016年GopherCon骇客日提出的。


我要感谢所有的校对材料、提出建议和意见让它更好的人,包括但不局限于:



所有的错误和拼写错误都是我自己的;所有的好东西都是他们的!


原文链接:Docker + Golang = <3(翻译:陈晏娥 审校:田浩浩

函数里的 socket 连接没有被正确的关闭

有问必答astaxie 回复了问题 • 2 人关注 • 1 个回复 • 999 次浏览 • 2016-10-24 21:30 • 来自相关话题

16.10.21Docker最新动态 VMware举白旗:vSphere、vRealize、VSAN都将支持Docker

文章分享wwdyy 发表了文章 • 0 个评论 • 465 次浏览 • 2016-10-21 12:55 • 来自相关话题

本周在巴塞罗那举行的VMworld大会上,容器成为热点话题,VMware在自己的计算、存储和管理产品组合中(vSphere、VSAN和vRealize)中支持容器用于生产环境。

VMware似乎正在采取EMC的颠覆性技术方法:证明EMC是全... 查看全部

本周在巴塞罗那举行的VMworld大会上,容器成为热点话题,VMware在自己的计算、存储和管理产品组合中(vSphere、VSAN和vRealize)中支持容器用于生产环境。


VMware似乎正在采取EMC的颠覆性技术方法:证明EMC是全闪存阵列和超融合基础设施一体机的早期采用者。因此,VMware知道vSphere这块蛋糕要被软件初创厂商夺走,但并不排斥容器而是提供支持。


下面就让我们分别来看看vSphere 6.5、VSAN 6.5和vRealize Automation 7.2。


vSphere 6.5




  • vCenter Server Appliance让客户简化了打补丁、升级、备份和恢复,获得高可用性,vCenter Server环境的规模和性能增加了2倍。




  • REST API用于控制虚拟基础设施以及实现自动化




  • 基于HTML5的vSphere Client简化了管理员的体验




  • 虚拟机级的加密,确保静态数据以及vMotion虚拟机的安全




  • Secure Boot帮助防止图像篡改,防止将未经授权的组件加载到vSphere环境中



  • vSphere Integrated Containers为应用团队提供了一个兼容Docker的接口,能够让vSphere运行容器而不用重新架构他们现有的基础设施


VMware还宣布vSphere Virtual Volumes 2.0增加了对阵列复制和业务关键应用——例如Oracle Database with Real Application Cluster——的原生支持。


Virtual SAN 6.5


VSAN 6.5新增了5个功能特性,使其成为物理存储阵列更好的替代选择:




  • 支持iSCSI,这样VSAN就可以作为针对外部物理工作负载的iSCSI目标,包括集群应用,例如在有限数量的物理服务器上进行SQL Server with Failover Clustering




  • 永久数据层,通过vSphere Integrated Container针对容器化的应用




  • 双节点Direct Connect,避免了ROBO站点不同VSAN系统之间对路由器和交换机的需求,帮助客户降低成本达15%-20%/站点。




  • REST API和Expanded PowerCLI面向企业级自动化和类似云的灵活性,以及对VSAN环境的管理



  • 支持512字节的模拟(512e)磁盘驱动器和SSD,可支持高容量驱动器,推进全闪存的超融合基础设施理念。


全闪存超融合基础设施一体机这个想法是诱人的,意味着相比基于磁盘的超融合基础设施一体机性能要提升2-5倍甚至更多。


VSAN还通过了一项认证计划。该计划最初是专注于文件服务和数据保护产品,向客户确保这些产品可以恰当地部署、运行和与VSAN实现互操作性,文件服务产品将来自于Dell EMC、NetApp和Nexenta。数据保护方面的合作伙伴则包括CommVault、Dell EMC、Veeam和Veritas。


随着时间的推移,VMware将会把更多合作伙伴的产品带入自己的VSAN生态系统。


vRealize Automation 7.2


vRealize Automation 7.2将引入对微软Azure的开箱即用支持,目前主要是对AWS和vCloud Air的支持。此外该产品还将增加容器管理能力,及以下功能:




  • Admiral,一个可扩展的、轻量级的容器管理menu,用于部署和管理容器到Docker主机




  • 开发者们可以通过vRealiza Automation 7.2服务目录配置容器主机,使用统一服务蓝图或者Docker Compose给容器化的应用做建模




  • 应用团队可以搭建混合式的虚拟机和容器部署




  • 云管理员可以管理容器主机,并监管使用情况,包括容量配额或者审批工作流




  • vRealize Log Insight 4.0将采用高级警报管理功能,和重新设计的、易于使用的界面




  • vRealize Operations 6.4有更好的警报管理和度量分组,以及针对特定用户角色定制设计的新仪表板,覆盖基础设施、应用和云团队



  • vRealize Log Insight 4.0和vRealize Operation 6.4将集成vSphere 6.5,以及更广泛的vRealize产品组合。


目前VMware正在测试Admiral,在VMware vSphere Integrated Containers的虚拟容器主机上部署和管理容器,并称“vRealize Automation 7.2很适合那些要求支持现有应用、同时通过采用微服务和云原生架构实现应用现代化的企业机构”。


vCloud Air


VMware正在面向企业推出vCloud Air灾难恢复产品的测试版。


VMware表示,该产品提供了对专有云环境的安全和隔离,结合了直接集成到vSphere中的复制产品的简化性,以及针对SD-WAN技术进行了优化。


VMware还推出了测试版的VMware Cloud Foundation Service on vCloud Air,可以在完全集成的VMware服务产品使用vSphere、VSAN和NSX。


定价和供货


VSAN标准版将在这个季度获得基础的全闪存配置支持。


VMware vRealize Automation 7.2、vRealize Log Insight 4.0和Operations 6.4、Virtual SAN 6.5、vSphere 6.5以及vSphere Virtual Volumes 2.0都预计在今年年底供货。


vSphere 6.5的VMware vSphere Integrated Containers新功能(也在vSphere 6上支持)将面向vSphere Enterprise Plus版本的客户免费提供。vSphere的起价为每CPU 995美元。


Virtual SAN的起价为每CPU 2495美元。用于台式机的Virtual SAN起价为每个用户50美元。Virtual SAN标准本现在包含对全闪存硬件的支持。

视频来啦 | 手把手教你玩转数人云容器管理面板Crane

Go开源项目数人云 发表了文章 • 0 个评论 • 382 次浏览 • 2016-10-19 10:40 • 来自相关话题

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.... 查看全部

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.5的发布,完善了许多功能和体验。今天小数给小伙伴们带来的是数人云总架构师为大家录制的Crane使用视频。从安装到使用,step by step,玩转容器管理面板就是这么简单!


小数友情提示,在电脑上超清模式下获得最好的视频体验:)


视频地址:http://v.qq.com/x/page/a0337msa1d4.html


关于Crane


数人云容器管理面板Crane是国内首个基于最新 Docker SwarmKit 技术的集群管理工具。它根据 Docker 的原生编排功能,采用轻量化架构,帮助开发者快速搭建 DevOps 环境,体验 Docker 的各种最新功能。


欢迎扫码下方二维码来Crane交流群进行技术交流~(^-^)V


Docker 从入门到实践-3-安装

文章分享wwdyy 发表了文章 • 1 个评论 • 364 次浏览 • 2016-10-17 23:26 • 来自相关话题

Ubuntu 系列安装 Docker

官方网站上有各种环境下的 安装指南。

通过系统自带包安装

Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。

$ sudo... 查看全部

Ubuntu 系列安装 Docker


官方网站上有各种环境下的 安装指南。


通过系统自带包安装


Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。


$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
如果使用操作系统自带包安装 Docker,目前安装的版本是比较旧的 0.9.1。 要安装更新的版本,可以通过使用 Docker 源的方式。


通过Docker源安装最新版本


要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。


$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker


14.04 之前版本


如果是较低版本的 Ubuntu 系统,需要先更新内核。


$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
然后重复上面的步骤即可。


安装之后启动 Docker 服务。


$ sudo service docker start


CentOS 系列安装 Docker


Docker 支持 CentOS6 及以后的版本。


CentOS6


对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下


$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io


CentOS7


CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:


$ sudo yum install docker
安装之后启动 Docker 服务,并让它随系统启动自动加载。


$ sudo service docker start
$ sudo chkconfig docker on

使用什么docker image来运行Go程序

回复

有问必答myonlyzzy 回复了问题 • 24 人关注 • 22 个回复 • 3425 次浏览 • 2017-09-01 10:15 • 来自相关话题

在docker swarm中使用grpc如何做负载均衡

回复

有问必答jmzwcn 回复了问题 • 1 人关注 • 1 个回复 • 1337 次浏览 • 2017-02-07 19:40 • 来自相关话题

goroutine leak

回复

有问必答adolphlwq 发起了问题 • 3 人关注 • 0 个回复 • 685 次浏览 • 2017-01-05 22:28 • 来自相关话题

RunC/RKT/Docker 这几个容器工具各有什么优缺点?

回复

技术讨论astaxie 回复了问题 • 2 人关注 • 1 个回复 • 929 次浏览 • 2016-11-02 12:09 • 来自相关话题

函数里的 socket 连接没有被正确的关闭

回复

有问必答astaxie 回复了问题 • 2 人关注 • 1 个回复 • 999 次浏览 • 2016-10-24 21:30 • 来自相关话题

用docker-machine创建Docker Swarm集群

文章分享myml 发表了文章 • 0 个评论 • 413 次浏览 • 2017-03-02 17:57 • 来自相关话题

参考文档 Install and Create a Docker Swarm


安装


要先安装virtualboxDocker Machine,Docker Machine 是一个简化Docker安装的命令行工具,在非linux系统用docker的同学应该用过。


加速


dockerHub访问比较慢,docker-machine执行create时加上--engine-registry-mirror参数来进行加速,例如docker-machine create -d virtualbox --engine-registry-mirror=https://3cd767jz.mirror.aliyuncs.com local


获取Token


已有docker环境
执行docker run swarm create来从dockerHub获取一个全球唯一的token


没有docker环境
执行docker-machine create -d virtualbox local创建一个docker环境


执行eval $(docker-machine env local) 进入刚创建的local,


再执行docker run swarm create获取token,
很简单吧。machine还有其它一些实用功能,可以自行查看文档


创建master


执行docker-machine create -d virtualbox --swarm --swarm-master --swarm-discovery token://$token swarm-master
$token请替换成上一步骤拿到的token


创建节点


创建节点和创建master类似,只是把--swarm-master参数去掉,名字改下。


执行docker-machine create -d virtualbox --swarm --swarm-discovery token://$token swarm-node-0


再创建一个docker-machine create -d virtualbox --swarm --swarm-discovery token://$token swarm-node-1
执行docker-machine ls可以看到


swarm-master   * (swarm)   virtualbox   Running   tcp://192.168.99.100:2376   swarm-master (master)   v17.03.0-ce   
swarm-node-0 - virtualbox Running tcp://192.168.99.101:2376 swarm-master v17.03.0-ce
swarm-node-0 - virtualbox Running tcp://192.168.99.102:2376 swarm-master v17.03.0-ce

执行eval $(docker-machine env --swarm swarm-master) !注意这里加上了--swarm参数,进入master,执行docker info可以看到集群信息

dockerSSH用ssh连接到docker

开源程序myml 发表了文章 • 5 个评论 • 541 次浏览 • 2017-02-11 21:59 • 来自相关话题

dockerSSH

用golang.org/x/crypto/ssh 实现的ssh服务器,能直接让你通过ss... 查看全部

dockerSSH


用golang.org/x/crypto/ssh 实现的ssh服务器,能直接让你通过ssh登陆到docker容器内,比如ssh ff756b3ea527@127.0.0.1 会登陆到ID为ff756b3ea527的容器,刚实现的尚不成熟,还有一些功能想去实现,比如scp,sftp

Docker 1.13最实用命令行:终于可以愉快地打扫房间了

文章分享数人云 发表了文章 • 0 个评论 • 729 次浏览 • 2016-12-22 11:09 • 来自相关话题

Docker 1.13出来已经有一段时间了,新版本添加了许多有用的命令,本文作者从处女座的洁癖(此处有雾)出发,告诉大家一些整理环境的小技巧。打扫房间... 查看全部


Docker 1.13出来已经有一段时间了,新版本添加了许多有用的命令,本文作者从处女座的洁癖(此处有雾)出发,告诉大家一些整理环境的小技巧。打扫房间再也不需费时又费力了,简单的命令,就可以轻松地把物品分门别类(容器、镜像、网络、存储卷……)地整理好^_^



在1.13版本中,Docker向CLI添加了一些有用的命令,让环境更加整洁。你可能已经体验了很长时间乱糟糟的开发环境——无用的容器,挂起的Docker镜像,弃置的volume,被遗忘的网络……所有这些过时的事物占据了宝贵的资源,最终导致环境无法使用。在之前的文章中曾经提到用各种各样的命令保持环境的整洁,例如:


docker rm -f $(docker ps -aq)


强制地删除所有正在运行的、暂停的以及终止的容器。同样地,也有命令可以删除挂起的镜像、网络和volume。


尽管上述命令解决了问题,但是它们要么专有,要么冗长或者难用。而新加入的命令直截了当又简单好用,现在就开始一一介绍吧。


管理命令


为了整理CLI,Docker 1.13引进了新的管理命令,如下:



  • system

  • container

  • image

  • plugin

  • secret


Docker的老版本中已经有了 network, node, service, swarm 和 volume 。这些新命令组子命令过去作为root命令直接实现。举个例子:


docker exec -it [container-name] [some-command]


exec 命令现在是 container 下面的一个子命令,这个命令相当于:


docker container exec -it [container-name] [some-command]


个人猜测为了兼容性的考虑,旧语句眼下还会使用一段时间。


Docker系统


现在有一个新管理命令 system 。它有4个子命令分别是 df, events, info 和 prune 。命令 docker system df 提供Docker整体磁盘使用率的概况,包括镜像、容器和(本地)volume。所以我们现在随时都可以查看Docker使用了多少资源。


如果之前的命令展示出 docker 已经占用了太多空间,我们会开始清理。有一个包办一切的命令:


docker system prune


这个命令会删除当前没有被使用的一切项目,它按照一种正确的序列进行清理,所以会达到最大化的输出结果。首先删除没有被使用的容器,然后是volume和网络,最后是挂起的镜像。通过使用 y 回复来确认操作。如果想在脚本中使用这个命令,可以使用参数 --force 或者 -f 告诉Docker不要发来确认请求。


Docker容器


我们已经知道许多 docker container 的子命令。它们过去(现在也是)是 docker 的直接子命令。可以通过下面的命令得到完整的子命令列表:


docker container --help


在列表中会看到一个 prune 命令。如果使用它,那么只会删除无用的容器。因此这条命令比 docker system prune 命令更局限。使用 --force 或者 -f 同意可以让CLI不再进行确认请求。


Docker网络


这里也有一个 prune 命令:


docker network prune


删除所有孤立的网络。


Docker Volume


volume也有新的 prune 命令了:


docker volume prune


删除所有(本地)没有被容器使用的volume。


Docker镜像


新的镜像命令也是 prune 子命令。--force 用法如上面一样, --all 可以删除所有不用的镜像,不只挂起的镜像。


docker image prune --force --all


这个命令可以删除所有不使用的镜像并且不再请求确认。


总结


Docker 1.13不仅通过引入admin command添加了一些需要的命令,也让我们找到了一些非常有用的清理环境的命令。笔者最爱的命令莫过于 docker system prune,让环境一直保持干净整齐。


本文作者:Gabriel Schenker
原文链接:https://lostechies.com/gabrielschenker/2016/12/12/containers-cleanup-your-house-revisited/

数人云Meetup|分布式架构的开源组件大选

线下活动数人云 发表了文章 • 0 个评论 • 507 次浏览 • 2016-11-29 11:30 • 来自相关话题

开源组件与工具方便快捷,

在分布式架构中扮演着重要的角色,

企业按照实际需求也会对开源组件做更多优化,查看全部


开源组件与工具方便快捷,


在分布式架构中扮演着重要的角色,


企业按照实际需求也会对开源组件做更多优化,


无论是开源使用者还是开源贡献者,


面对各种各样的开源组件——容器、编排、大数据、数据库、监控、持续集成等等都会有苦恼,


选择哪一个?


不如,


我们通过「分布式架构的开源组件大选」来看看微软、阿里、PingCAP、数人云这些企业是如何用开源组件来做分布式架构,


并为开源做出了哪些贡献:)


活动中不仅可以了解各种开源组件实践,


还有嘉宾的开源成长分享以及程序员的职业规划建议,


愿来到现场的你可以有更多的收获~


嘉宾及议题介绍



刘鹏,微软云计算事业部 -高级软件开发工程师


曾在Bing新闻团队担任核心技术开发,擅长海量数据分析和系统设计,目前任职微软云计算事业部,主导开发基于Azure的融媒体解决方案


Topic1:《使用visual studio code的docker插件开发和调试nodejs应用程序》


1.VSCode简介
2.搭建nodejs + Docker开发环境
3.利用VSCode远程debug nodejs in Docker



杨成虎,阿里花名(叶翔),分布式和数据库高级技术专家


11年加入淘宝研发开源分布式缓存系统TAIR,此后一直在NoSQL领域摸爬滚打,利用NoSQL技术支撑了淘宝的天文交易量。当前专注于NoSQL的云服务化,正带领团队在MongoDB云服务上深耕细作。


Topic2:《阿里云ApsaraDB云数据库管理之道》


1.云数据库生命周期—生产,维护,下线
2.云数据库监控调度—大数据监控分析



黄东旭,PingCAP 联合创始人兼 CTO
曾就职与微软亚洲研究院,网易有道及豌豆荚,资深基础软件工程师,架构师。


擅长分布式系统以及数据库开发,在分布式存储领域有丰富的经验和独到的见解。狂热的开源爱好者以及开源软件作者,代表作品分布式 Redis 缓存方案 Codis,以及分布式关系型数据库 TiDB。


Topic3:《无痛的 MySQL 扩展方案 - TiDB 运维实践》


分享 TiDB 的用户在实际线上场景中使用 TiDB 来解决 MySQL 扩展性问题中得到的最佳实践和一些运维 tips,为 MySQL 的扩展提供一种新的思路。



春明,数人云资深架构师


8年互联网游戏后台开发经验, 先后就职于OpenFeint, GREE,Kabam等国际知名互联网游戏公司, Docker爱好者。数人云开源容器管理工具 Crane 和开源 Mesos 调度器 Swan 的主要研发者


Topic4:《一款分布式系统应用开发手记》


1.gPRC使用手记
2.将Raft集成到Mesos调度器Swan中
3.Actor模式和事件驱动


议程介绍


13:30 - 14:00 签到


14:00 - 14:40《使用visual studio code的docker插件开发和调试nodejs应用程序》刘鹏@微软


14:40 - 15:20《一款分布式系统应用开发手记》春明@数人云


15:20 - 16:00《阿里云ApsaraDB云数据库管理之道》杨成虎@阿里云


16:00 - 16:40《无痛的 MySQL 扩展方案 - TiDB 运维实践》黄东旭@PingCAP


16:40 - 17:00 自由交流


联合主办:DBAplus社群


时间:12月17日 14:00 - 17:00


地点:北京市海淀区丹棱街5号微软大厦1号楼1层故宫会议室



点击报名

来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享

文章分享lalala 发表了文章 • 1 个评论 • 551 次浏览 • 2016-11-14 18:05 • 来自相关话题


架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享。


Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化、可移植性是
CI/CD、DevOps、微服务的重要实现技术。但目前技术还不够成熟,在生产实践中还存在很多问题。对此,沪江黄凯、滴滴田智伟、蘑菇街张振华、蘑菇街向靖、扇贝丁彦以及七牛云袁晓沛在本期交流会上分享了各自的经验。本文是对此次交流的整理,欢迎探讨。





自由交流


沪江黄凯


大家好,我是来自沪江的 Java 架构师,我叫黄凯。在加入沪江之前,曾在 HP 和 IBM 的云计算部门担任核心开发和架构职位。对 IaaS、PaaS、SaaS,尤其是云存储有较深入的了解。2015 年加入沪江,担任架构师职位,主导的产品有:课件云存储,云转码等等。在这些项目中,我们使用 Mesos 和 Marathon 做 Docker 的编排工具,并开发了一个 Mesos Framework 做云转码的核心框架。


那么我们为什么要使用 Docker,也是机缘巧合。由于我们的服务开始的时候不是特别多,采用的就是一种普通的架构,后来随着服务的增多,发现部署和运维花的时间太长,我们想使用一些新的方式。开始的时候研究过 Openstack,后来觉得 Openstack 慢慢没落,于是我们就选中现在使用的 Docker。我们并不把 Docker 当成 VM 在用,而是使用它的原生的,在 Baremetal 上直接安装 Docker,这样运行效率比在 VM 运行 Docker 要来的快。课件云是由很多微服务组成,不光是一些存储,这种微服务是使用 Docker 部署,就相当于编排,把这些微服务部署上去。转码这一块是使用了 Mesos 框架,和 Docker 没有特别大的关系,但是转码的应用程序,比如说我们现在应用 FFmpeg,这个程序是运行在 Docker 里面的。


为什么要选择 Marathon?第一,我觉得 Mesos+Marathon 非常的容易理解。我们也研究过 Kubernetes 和其他的一些方法,发现从运维和研究的方面来说的话,Kubernetes 实在是太重而且太复杂,后来选择了Marathon。我们现在是内部服务使用,两个部门在使用转码集群,大概是 Baremetal 有 20 台的物理机。除去我们 API 的一些服务,还有一些第三方组件的服务的话,大概是有 400 多个 Docker 容器在跑。


滴滴田智伟


大家好,我是滴滴代驾事业部架构师,代驾事业部是公司最早尝试 Docker 虚拟化的事业部。目前主要方向是业务系统及部分中间件的 Docker 化,我们做的时间也不太长,半年多的时间。线上是因为我们有老的一套发布系统,集成涉及的部门比较多,所以我们基于原来的发布系统完成了预发布环境 Docker 的部署。线下环境基于 Docker+K8s 开发内部的自动化持续交付系统及开发测试环境管理。我们在做开发和测试环境的自动化,另一方面也是做环境管理的,两套环境。对于项目并行的时候发现原来很多不够用,原来很多配置是基于端口绑死的情况。现在基于开发 Kubernetes 的话,网络隔离用了一部分,然后主要是用环境变量这一部分,主要考虑是解决一个配置可以应用到在多个环境的情况,基于这个需求才用它。开发 Kubernetes 基于 Namespace,同一个服务在不同的 Namespace 下,它其实环境变量名可以是相同的,但是IP不同,而这一部分 IP 其实是由开发 Kubernetes 自己去管理的。基于环境变量获取一些配置的话,比如 IP 地址这种,就可以做到拿一份配置可以打出多套环境。


考虑业务的安全性和稳定性,线上基于纯 Docker 的方式在做。我们是基于裸的 Docker 来工作,主要是用资源隔离,没有借助调度框架,也没有自动伸缩。我们是两步走,一步是验证 Docker,其次是做开发 Kubernetes 线下使用和预研。为什么没有考虑 Mesos?刚才跟沪江的同学,我们的考虑是相反的。Mesos 侧重点更专一一点,首先不会有模块的划分,比如 Kubernetes 有 Replication controller ,Namespace 这种概念,而 Mesos 下几乎没有这种概念。我们拿 Kubernetes 主要是做一些编排的功能,而正好开发 Kubernetes 在整个发布和编排上,体系更全面一点。Mesos 最早是做资源管理,基于 Docker 做一个 Framework 接进来的话,它不是专门为编排而生。Kubernetes 首先解决我们的问题是,我们可能不需要加多份配置就可以搭多套不同的环境,它就是基于 Namespace 做一个多租户的概念,会对 Service 做一层隔离,对于动态配置,扩容这一部分暂时我们没用到,确实用到的一些场景比较少。主要是做不同环境的隔离,并没有太多使用编排细节上的东西,动态伸缩之类的目前线下没有太大必要,线上可能会用到。


蘑菇街向靖


大家好,我是向靖,来自蘑菇街的运维架构师。我们接下来会做一个 PaaS 平台,想做 Docker 和结合虚拟机以及我们用到公有云产品,做成一个混合云的架构平台。我们现在 Docker 也在用,更多的是当虚拟机用,后面我们想基于 Docker 原生的方式去用,可能会涉及资源调度,服务发现的问题。除了 Docker,我们还会用到公有云,公有云更多是虚拟机的方式提供。出于混合云,想在资源层做一个抽象,对于上层业务来讲它没有关系,它是跑在 Docker 上,还是云主机上,还是 KVM 虚拟机上,那么我想在这上面做一个抽象。另外还有,刚才我也是提问滴滴架构师的问题,配置怎样和代码做隔离,这个也是我考虑的问题。因为我看 Docker 用了环境变量,通过环境变量做一些配置的参数的传递,但是在虚拟机上,特别是在物理机上,通过环境变量的方式,我还在考虑有没有安全的风险,Docker 可能是一个只读的,不会被修改的,但是对于虚拟机以及物理机来说,可能会存在被修改的风险。


蘑菇街张振华


大家好,我叫张振华,花名郭嘉,我是 14 年从思科加入蘑菇街。我们算是国内用 Docker 比较早的,我们一开始用 Docker 是 1.3.2 的版本,当时我们采用集群管理工具还是 Openstack,因为当时 Kubernetes 还不是很成熟。当时也走了一些弯路,比如我们把 Docker 当成虚拟机来用,曾经在线上的规模也达到几百台虚拟机几千个容器,但是我们逐步发现不能把 Docker 当成虚拟机来使用,因此我们做了一个转型,从去年开始研究 Kubernetes,现在 Kubernetes 加 Docker 的版本开发完成了,准备逐步上线。


我们为什么选用 Kubernetes?编排工具的选择我们也是做过一番调研的,它们没有谁好谁不好这一说,只能说谁更贴切你的需求。对于我们蘑菇街来说,我们需要解决是资源利用率的问题,和运维的对接,我们需要有预发和线上环境的持续集成持续部署的过程,还有我们需要有对资源的隔离,对部署的快速迭代,包括集群管理,这些方面,我们觉得 Kubernetes 更加适合于我们。


在网络方面,我们研究过现在在开源界比较常用的一些方案,但是我们都觉得不太适合,比较 Fannel,Caico 等等,他们一般用的技术都是 VXLAN,或者是用 BGP。因为我们之前对 Openstack 的网络是比较有经验的,然后我们发现有一个项目,具体名字不记得,Neutron 和 Kubernetes 做一个对接,我们在这个项目的基础上做了 VLAN 的方案,我们的网络没有用 VXLAN 来做,而是选择 VLAN 来做,这样的话一个 Docker 它可以获得跟一个物理理同一个网络平面的 IP,我们的应用程序可以直接对外访问,因为我们内部业务有这个需求选择这个方案。虽然 Docker 内部网络和外部网络是通的,但 Docker 还是独立的一个网段,不需要一层 NAT 的转换。我们直接走二层的,是在交换机走 Chunk,本来物理机交换机的 Access 口,这样的话,一台物理机上面允许跑多个 VLAN 的容器,比如说 A 业务和 B 业务要走隔离的话,通过网络的 VLAN 走隔离,它们的数据之间不会有干扰。


Load Balance 我们还没有涉及到这一块,Load Balance 我们应该会在 nginx 上做一层。因为据我了解,现在 Kubernetes 这一块 Proxy 还不是很成熟,这上面还存在一些问题,因此还不敢用 Kubernetes 现有提供的服务。服务发现和注册这一块我们还在做开发,这块会和配置管理中心打通。我们内部也有其他团队在做这些功能,所以我们会和内部的中间件团队合作。


七牛云袁晓沛


大家好,我是七牛云数据处理技术总监袁晓沛。我们的数据处理业务包括了图片和视频的实时在线及异步处理。数据处理的业务量比较大,日均请求量达到百亿级。平台采用容器技术的原因是借助容器技术快速部署,启动的特性,数据处理程序可以根据数据处理量快速地弹性伸缩。借助容器技术内核级别的资源隔离和访问控制,每个数据处理程序可以运行在一个私有的环境,不被其它程序所干扰,保证其上运行数据是安全可靠的。而且容器技术是轻量的,它以最小的资源损耗提供资源隔离和访问控制,而资源特别是计算资源在数据处理中是非常宝贵的。


我们在资源调度上采用的是 Mesos,而二层的业务调度框架则是自己自研的。七牛自身拥有近千台的物理机,容器是直接运行的物理机上,可以减少虚拟层对资源的消耗,提高资源的利用率。


在网络上,对于七牛的自定义数据处理服务直接使用的是 Host 模式,而对第三方数据处理服务则使用的是 Bridge 模式,因为这些程序是用户自己部署运行的,并不知道用户是否有开启其他的端口使用,所以使用的是 Bridge 模式,需要对外使用端口的都需要通过 NAT 进行暴露,这样服务内部使用了什么端口并不会对外界环境造成影响,对平台环境做了非常好的安全隔离。我们是使用 Consul 做注册中心,支持跨数据中心的服务发现。我们为什么自研的调度框架,而不用 Marathon。因为 Marathon 不支持跨数据中心的内部服务或外部服务的发现,而七牛有多个数据中心,影响整体的调度,其次如果选用 Marathon 的话,根据我们业务的特点,还是要再做一层对 Marathon 的包装才能作为 Dora 的调度服务,这样模块就会变多,部署运维会复杂。


扇贝丁彦


大家好,我是扇贝的技术总监丁彦,之前在暴走漫画,先后在暴走漫画和扇贝设计和主导了基于 Docker 的微服务架构系统,以及数据收集和分析系统。去年来到扇贝,这里是 Python 的开发环境。后来发现业务增长快,水平扩展一些机器,出现问题需要换个机器等等,都需要非常熟悉业务的少数开发去做。另外公司对预算控制严格,机器基本都是满负荷运作,平时也不可能多开空置的机器,已有的机器还要根据负载情况调整服务分布情况,所以这种切换服务,增删服务的操作还是比较频繁的。因此,我们用了 2-3 个月的时间将所有的运行环境都切换到 Docker上,这大大提高了我们的运维能力。


Docker 包装有几个好处。


第一个好处是,环境升级非常方便。因为只要pull 一下最新的镜像,启动一个 Container,环境就升级了。而如果直接基于公有云的镜像升级的话就很难,因为一台机器上跑哪些服务其实不一定是固定的,并且之前做的镜像只要有一台机器是还基于它的话,就删除不掉的,镜像数量又有上限。所以 Docker 非常好地解决了我们的问题。


其次是环境的颗粒度会更小,一台机器上配好几个应用的话,往往配着配着,到最后你就不太能精确地记得上面装的程序或者库是给哪个应用服务的,应用之间如果依赖有版本的冲突也很难调和。你想做些服务的迁移,把负载比较小的放一起,把负载比较大的抽出来,这个时候就非常痛苦,但你如果用 Docker 包装后就非常简单,只要在不同的机器上起不同的 Container,就可以实现这一点。


第三,我们不光用了 Docker,还加入了服务发现,刚刚讨论配置管理这些,我们一并做了。Docker 启动时候,我们自己写了一些工具,可以自定义 Docker 启动参数,包括配置参数,比如说,一些程序要运行的参数,我们主要用两种方式,一种方式是通过环境变量灌进去,还有一种方式让程序的启动脚本支持参数,然后拼接不同的参数灌进去,最终都是落实到 Docker 的启动命令上。服务发现是基于 Consul,Docker 的启动命令是从 Consul 里取的。首先 Consul有 HTTP 的 API,我们是自己写的 pip 包,只要 Include 一下这个包就可以了,Docker 的服务启动后会自动注册到 Consul。比如要在负载后加一个服务,只需要找到一台机器,启动对应的 container,剩下的事情它自己会到 Consul,注册它的参数地址一系列东西,自动把它加进去。所以这些都是自动化的,如果检测那台机器/服务挂了,Health Check 也会到 Consul 里面更新。该增加机器就增加机器,该下线就下线。总体来说,我们的生产环境全部跑在 Docker 上面的,然后区分有状态和无状态两种,有状态的定死在机器上,无状态的灵活的自由切换。还有一点,如果是有状态的容器要定死在机器上的时候,我们一般来说都会采取冗余的结构,至少保证有两个在运行,一个挂了,保证整体的服务在运行。其次基于 Docker,我们还做了一套数据搜集以及分析的机制。数据搜集是基于日志来搜集的,利用 Docker 的 Log driver,把日志打到 Filter,把结果存在存储服务上。同时监控也是基于日志做的。第三部分非生产环境,比如开发环境跟测试环境都是 Docker 做的,因为我们每一个服务都做了 Image、镜像,用容器方式跑的。通过参数来决定启动方式的,我们可以在开发环境以及测试环境采用不同的参数来启动容器。 通过 Consul 来隔离的,因为 Consul 的服务发现,开发、生产、测试环境在不同的自动发现框架里不会相互影响到。目前机器在 120 台左右,基于云服务。有些基础的东西不需要依赖于 Docker,比如说申请云主机,申请的时候就可以指定它的 CPU 和内存这些服务器资源的配置。所以这部分东西还是属于 Human schedule,不是完全让编排的系统自己决定该怎么样。


编排工具我们现在在研究进一步,我刚来这工作的时候,所有的服务没有一个跑在 Docker 上面的,我现在把它迁进来。现在数据增长,已经有一些编排的瓶颈,现在在做调研,可能基于 Swarm,做自动编排的设计。




指定话题交流



主持人:容器多的情况下 Kubernetes 存在性能问题,各位在这方面有没有好的经验?



扇贝丁彦:我们其实也遇到了这个问题,找不到办法所以放弃了 Kubernetes。我们也是用公有云,网络直接依赖公有云的网络,有可能是因为公有云造成的,我没有试过在祼机上试过。


沪江黄凯: Kuberneters 的 Fannel 有一种模式是 VXLAN,它的封装折包是做内核里做的,效率会高一点。容器多就会效率会低是因为,在 Kubernetes 1.2 的时候,走这样的一种模式,数据先到内核态中,然后把数据拉回到用户态,用 Proxy 的方式分发给各个容器当中的。其实在 Kubernetes 1.3 以后,它直接在iptables里设规则,相当于用户数据不用跑到用户态,在内核直接分发出去了,这种效率会非常高。所以可以研究一下 Kubernetes 新版本。


扇贝丁彦:我们碰到过网络方面的问题。默认的 Docker engine 的启动参数里面有个 iptables,不知道大家有没有定制化过,如果不定制化这个参数,它默认会帮你建 iptables 的转发规则,并会开启内核的网络追踪的模块。一开始我们没有注意这件事情,当我们的 Nginx 迁到 Docker 的时候,Nginx 服务瞬间会挂。后来查原因,是因为这些参数会开启网络追踪模块。因为我们的 Nginx 流量非常大,当时只有 3 台 Linux 云主机,分发 http 请求的,然后会导致 3 台Linux宿主机,内存会被刷破,网络会出现堵塞。所以我们关掉了 iptables 参数,并采用 Host 的网络模型。所以它的容器拿到的 IP 就是 Host 的 IP。我们一开始也想上一些 Kubernetes 这些东西,然后发现简单跑个模型根本跑不起来,所以一开始就放弃了这一套东西,直接搞了个裸的 Docker。



主持人:关于跨数据中心容器集群的使用,大家有经验么?



沪江黄凯:我们跨数据中心主要是IP分配上的问题,我们现在也在尝试使用 Calico,如果 Host 网络是通的话,那么它的内部网络也就通了,可以自由划 VLAN,这样你就可以解决跨 Data center 的问题。还有一个问题就在跨 Data center 时,服务注册与发现的问题。这个问题也困扰我们很久了,我们现在使用 Consul 做服务注册与发现。虽然 Consul 它是官方支持跨 Data center,但是我们在使用当中的话会发现注册的 IP,在另外一个注册中心,它会发现的比较慢,甚至有时候出现 IP 冲突的时候。


我们的做法是把 Host 的 IP 地址直接用 Environment 的形式注到 Docker 镜像内部,接下 来 Docker 镜像要注册,它就会读取 App 的 IP,然后发送给 Consul,只要保证 Host 的 IP 和 Docker内部容器的 IP 能够互通的就行了。如果不能通的话,比如说完全和 Host IP 隔离,那么起码有几台机器要暴露出去,又比如说,Consul 它本身自己要暴露出去才能访问到。Host 的 IP 是容器启动之后注进去的,启动命令中把 Host 的 IP 地址加在 -e 的后面,容器在启动之后,它的环境就会有这么一个 IP。我们用 Mesos 就没这个问题,但是用 Kubernetes 就有这个问题。Mesos 会自动帮你把这些东西注入容器中去。


滴滴田智伟:其实 Kubernetes 本身也是可以解决这个问题,我们现在在做线下持续交付的时候。定义完 Service 之后,容器会同一个 Namespace 默认加一个系统环境变量。


沪江黄凯:我们试过,在 Pod 启动之后,Pod 里容器想访问 host 的 IP 地址,是没有办法做到的。


蘑菇街张振华:因为我们之前也遇到这个问题,然后我们业务方,他们可能有一些程序会获取本机 IP 地址,如果是内部的 IP 地址,他们程序可能会出现问题,于是我们当时没有用 Docker 默认的网络,而是采用 VLAN。



主持人:我们提到好多 Mesos、Kubernetes、网络,发现没有提自动伸缩,有没有项目涉及到容器的自动伸缩?



沪江黄凯:我们沪江是基于 Mesos+Marathon 做了自己的一个服务,它这个服务是干嘛的呢,就是监测,不停的监测每一个 Docker 的 CPU 和内存的利用率,一旦超过百分之多少以后,就向 Marathon 发一个命令,说我要扩容,它还可以支持时间点,比如 15 分钟监测一次,如果在 15 分钟发现它超过阈值了,就马上扩容出来,但是缩的话,不是适用于频繁监控,如果小于 20% 的话就会缩,一旦缩的话会影响线上用户的请求。怎么办呢?我们在缩的时候可以规定它的时间点,比如半夜里 2-3 点,访问量少于多少点时候把它缩掉。我们监测的是 Docker 内部的 CPU 的使用率。就是监测一个服务,它可以监控所有同一服务的 Container,比如一个服务有 100 个容器,那么这一百多个 CPU 利用率加起来除于一百,相当于平均的利用率。如果平均利用率超过 80%了,那说明这个集群到了扩展程度了,它会以一种比例来扩展。针对单个容器,可以设置内存的限制。我们给每一个容器呢,比如它只能用 4 个 CPU,只能用 8G 的内存,或者更小一点的内存,这些都设好,设好之后它自动扩展相同规格的容器。这么做是因为 Cgroup 有个问题,当利用率到达了启动的限制,Cgroup 会把这个容器 kill 掉。这个是不可理喻的问题,所以我们想到用 Load scale 来扩容,不让他直接死掉。


滴滴田志伟:关于自动扩容,我们线下的时候遇到一个问题,我们最早的时候是用腾讯的公有云,它限制了 NET 的模块,导致我们最初用 Cgroup 的方案去做,绑定端口。内部使用所有应用,端口是要做分配的,要不然出现端口冲突。然后遇到问题是,在这种情况下,如果要做动态扩容的话,它每次先创建一个,再杀掉一个,导致每次起来的时候就起不来了,因为端口的问题。服务启动的时候端口是随机,会出现冲突问题,因为用的是 Host 的模式。



主持人:关于自动伸缩为什么没有考虑到请求数?因为如果内存占用率如果超过一定预支,那么请求数也可能超过一定预支了。把单个容器所处理的请求数给限定了,那么它内存自然不会超,然后也不会被干掉。



沪江黄凯:我个人认为,第一,请求数很难测,你不知道请求数到多少时要扩容,还不如根据 CPU 到 80%,或者 90% 来的直观。我们的 API 也是根据 CPU 来算的。你真正是高并发的 API 的话,我也测过,最后我们能够监测到的,其实还是 CPU 和内存。


扇贝丁彦:我们扩容是根据响应时间,跟请求数类似,请求数定指标不太好定,我们是根据响应时间,比如平时的响应时间是 50 毫秒,当响应时间是 300 毫秒的时候就要扩容了。



主持人:关于自动伸缩为什么没有考虑到请求数?因为如果内存占用率如果超过一定预支,那么请求数也可能超过一定预支了。把单个容器所处理的请求数给限定了,那么它内存自然不会超,然后也不会被干掉。



沪江黄凯:关于存储,我们是有一些研究的。现在容器存储问题分为两种,Kubernetes 官方支持一种理念,任何一种存储都是一个 Volume。Volume 先于 Docker 存在的,而不是 Docker 启动之后再挂载 Volume。不管是网络存储还是本地存储,全部以卷的形式,挂载在 Pod 里面或者是宿主机上,以 Driver mapper 来驱动这个 Volume,来读到你所要的内容。


还有一种情况,就是 Docker 公司主导的存储模型,任何的存储都是一种驱动。如果你想用 NFS 或者如 Ceph 这样分布式存储的话,让 Ceph 开发 Docker 的驱动,Docker run 的时候指定存储的驱动,Docker storage driver 这种方式,外部的存储在容器内部它展现形式可以是目录,也可以是挂载卷、块的形式。如果用块挂载到容器中,这个容器自己格式化它,或直接读取它都是可以的。它只不过它是相当于用了一个 Driver 的形式,把你的容器和分布式存储建立一个连接而已。对于容器,如果原本绑定块或 Volume,容器出现故障的话,直接把容器杀掉,再启动挂在同样一个 块或Volume 就解决了。优点是直接读取,而不是通过再转一层,效率比较高一点。所有存储都是 Volume 的形式理解度比较高一点,所以我们还是赞同于用 Volume 的形式。


有状态的容器。我知道 k8s 的新的计划,如果你没有用 Kubernetes 最新版本的话,一般来说我们都是容器启动在固定 Host 上,下次启动还是在这台 Host 上,它的存储它的内存,包括一些 log,全部是在这台 Host 上。还有一种是用最新的版本,有个 PetSet 的新 kind,Kubernetes 它自己会记录 Pod 在什么 Host 上启动过,不用自己去指定一定要在某一台 Host 上启动,这种方法比较智能化,但是不是特别稳定的一种方法,因为它是刚刚开发出来的新功能。



主持人:关于自动伸缩为什么没有考虑到请求数?因为如果内存占用率如果超过一定预支,那么请求数也可能超过一定预支了。把单个容器所处理的请求数给限定了,那么它内存自然不会超,然后也不会被干掉。



沪江黄凯:我个人认为还是在同一台机器上起一个新的实例,不要让它做数据迁移,因为数据迁移会占用很多资源。而且如果你的想法是说,所有的分布式的存储只是以 Volume 的形式挂载在宿主同上,这也就没什么问题了。因为存储和 Docker 是完全分开来的。如果只有一个 Volume,存储的可靠性会得不到保障,所以在 Kubernetes 新版本当中,它会建立一个 Volume 的 kind,也相当于建立 RC kind一样,是一个 Pod,那这样由 Kubernetes 来保障这个 Volume 的高可用。

动手造轮 | 一款Bash 脚本 +HTTP 请求工具 +JSON 解析工具组成的测试小工具

开源程序数人云 发表了文章 • 2 个评论 • 590 次浏览 • 2016-11-03 12:23 • 来自相关话题

数人云开源一款容器管理工具Crane,Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团... 查看全部


数人云开源一款容器管理工具Crane,Crane开发过程中,为了保证API的健壮性和稳定性, 数人云开发团队自制了一套适合Crane API测试的小工具。它也适用于其他接口测试,小数发现很多朋友对它感兴趣,就勤劳地搬运过来,希望能为大家提供一个参考和思路。



针对Crane团队只向外输出API的特点, 选择测试工具是秉着以下原则的:



  • 第一, 功能不要太复杂,学习曲线不能太陡, 功能够用就行;

  • 第二, 可编程要好, 最好不要有界面,程序员友好。


于是一款简单的Bash脚本+HTTP 请求工具+JSON解析工具组成的测试小工具雏形出现了。


下面给大家展现这款工具的构成


Bash脚本: 测试工具的粘合剂, 不是Java也不是Python, 用Bash简单易用,功能强大。
Httpie: 一款类似curl的http工具, 不过比curl简单的多, 尤其是想发个JSON请求时候, 更简单。
jq: jq是一款命令行解析JSON文本的工具, 支持非常多的语法解析构造重组JSON文本。


下面依次给大家介绍一下httpie和jq的基本用法


1. 例子说明如何使用httpie


httpie在terminal下的命令是http, 先来几个简单的例子给演示一下用法。


http get http://httpbin.org/get header:header-content



其中, http是命令, get是请求method, http://httpbin.org 是请求地址, httpbin是一个http的测试服务; 用冒号相连的参数代表着HTTP请求头, 用等号连接为请求body中的JSON键和值。 httpie默认的请求为json请求, 所以不用过多指明,header已经加上了Content-Type:application/json。


http post http://httpbin.org/post header:header-content json-key=json-value



http支持很多命令行选项, 介绍一个有意思的是 --check-status, check-status是把http response的非200值设置成进程的exit code, 比如:



如上所示, 请求一个不存在的地址时候进程退出符号变成了4。 我们将大量使用这个feature来判断返回值。


2. 例子说明如何使用jq


下面我们用几个例子介绍一下jq的用法。



上图演示如何提取一个json的key。



如何提取一个嵌套的key。



提取数组中的元素。


篇幅关系我们不过多展示jq的高级功能, 除了基本的解析和构造以外,jq支持大量的filter, 如有兴趣可参考https://stedolan.github.io/jq/ ... tions


3. Crane测试工具的几个场景


场景一: 我期望测试API的HTTP测试的返回状态比如200, 404, 500


首先bash造了几个基本的函数来输出错误, 和判断状态



使用方法



场景二: 登录过程测试



更多的测试例子可参考https://github.com/Dataman-Clo ... _test


至此,一款可用的测试工具出炉了, 虽然简单,不过功能恰到好处,非常适合我们的场景, 再也不怕API出错发现不了了。 聪明的同事们把这工具配到了jenkins和单元测试一起执行, 出错了还能得到邮件通知, 酷极了。

Docker与Golang的巧妙结合

文章分享田浩浩 发表了文章 • 0 个评论 • 765 次浏览 • 2016-10-27 11:48 • 来自相关话题

译文转载:Docker与Golang的巧妙结合


【编者的话】这是一个展示在使用Go语言时如何让Dock... 查看全部

译文转载:Docker与Golang的巧妙结合




【编者的话】这是一个展示在使用Go语言时如何让Docker更有用的提示与技巧的简辑。例如,如何使用不同版本的Go工具链来编译Go代码,如何交叉编译到不同的平台(并且测试结果!),或者如何制作真正小的容器镜像。


下面的文章假定你已经安装了Docker。不必是最新版本(这篇文章不会使用Docker任何花哨的功能)。


没有go的Go


...意思是:“不用安装go就能使用Go”


如果你写Go代码,或者你对Go语言有一点点兴趣,你肯定要安装了Go编译器和Go工具链,所以你可能想知道:“重点是什么?”;但有些情况下,你想不安装Go就来编译Go。



  • 机器上依旧有老版本Go 1.2(你不能或不想更新),不得不使用这个代码库,需要一个高版本的工具链。

  • 想使用Go1.5的交叉编译功能(例如,确保能从一个Linux系统创建操作系统X的二进制文件)。

  • 想拥有多版本的Go,但不想完全弄乱系统。

  • 想100%确定项目和它所有的依赖,下载,建立和运行在一个纯净的系统上。


如果遇到上述情况,找Docker来解决!


在容器里编译一个程序


当你安装了Go,你可以执行go get -v github.com/user/repo来下载,创建和安装一个库。(-v只是信息显示,如果你喜欢工具链快速和静默地运行,可以将它移除!)


你也可以执行go get github.com/user/repo/...来下载,创建和安装那个repo(包括库和二进制文件)里面所有的东西。


我们可以在一个容器里面这样做!


试试这个:


docker run golang go get -v github.com/golang/example/hello/...

这将拉取golang镜像(除非你已经有了,那它会马上启动),并且创建一个基于它的容器。在那个容器里,go会下载一个“hello world”的例子,创建它,安装它。但它会把它安装到这个容器里……我们现在怎么运行那个程序呢?


在容器里运行程序


一个办法是提交我们刚刚创建的容器,即,打包它到一个新的镜像:


docker commit $(docker ps -lq) awesomeness

注意:docker ps –lq输出最后一个执行的容器的ID(只有ID!)。如果你是机器的唯一用户,并且你从上一个命令开始没有创建另一个容器,那这个容器就是你刚刚创建的“hello world”的例子。


现在,可以用刚刚构建的镜像创建容器来运行程序:


docker run awesomeness hello

输出会是Hello, Go examples!


闪光点


当用docker commit构建镜像时,可以用--change标识指定任意Dockerfile命令。例如,可以使用一个CMD或者ENTRYPOINT命令以便docker run awesomeness自动执行hello。


在一次性容器上运行


如果不想创建额外的镜像只想运行这个Go程序呢?


使用:


docker run --rm golang sh -c \
"go get github.com/golang/example/hello/... && exec hello"

等等,那些花哨的东西是什么?



  • --rm 告诉Docker CLI一旦容器退出,就自动发起一个docker rm命令。那样,不会留下任何东西。

  • 使用shell逻辑运算符&&把创建步骤(go get)和执行步骤(exec hello)联接在一起。如果不喜欢shell,&&意思是“与”。它允许第一部分go get...,并且如果(而且仅仅是如果!)那部分运行成功,它将执行第二部分(exec hello)。如果你想知道为什么这样:它像一个懒惰的and计算器,只有当左边的值是true才计算右边的。

  • 传递命令到sh –c,因为如果是简单的做docker run golang "go get ... && hello",Docker将试着执行名为go SPACE get SPACE etc的程序。并且那不会起作用。因此,我们启动一个shell,并让shell执行命令序列。

  • 使用exec hello而不是hello:这将使用hello程序替代当前的进程(我们刚才启动的shell)。这确保hello在容器里是PID 1。而不是shell的是PID 1而hello作为一个子进程。这对这个微小的例子毫无用处,但是当运行更有用的程序,这将允许它们正确地接收外部信号,因为外部信号是发送给容器里的PID 1。你可能会想,什么信号啊?好的例子是docker stop,发送SIGTERM给容器的PID 1。


使用不同版本的Go


当使用golang镜像,Docker扩展为golang:latest,将(像你所猜的)映射到Docker Hub上的最新可用版本。


如果想用一个特定的Go版本,很容易:在镜像名字后面用那个版本做标签指定它。


例如,想用Go 1.5,修改上面的例子,用golang:1.5替换golang


docker run --rm golang:1.5 sh -c \
"go get github.com/golang/example/hello/... && exec hello"

你能在Docker Hub的Golang镜像页面上看到所有可用的版本(和变量)。


在系统上安装


好了,如果想在系统上运行编译好的程序,而不是一个容器呢?我们将复制这个编译了的二进制文件到容器外面。注意,仅当容器架构和主机架构匹配的时候,才会起作用;换言之,如果在Linux上运行Docker。(我排除的可能是运行Windows容器的人!)


最容易在容器外获得二进制文件的方法是映射$GOPATH/bin目录到一个本地目录,在golang容器里,$GOPATH/go.所以我们可以如下操作:


docker run -v /tmp/bin:/go/bin \
golang go get github.com/golang/example/hello/...
/tmp/bin/hello

如果在Linux上,将看到Hello, Go examples!消息。但如果是,例如在Mac上,可能会看到:


-bash:
/tmp/test/hello: cannot execute binary file

我们又能做什么呢?


交叉编译


Go 1.5具备优秀的开箱即用交叉编译能力,所以如果你的容器操作系统和/或架构和你的系统不匹配,根本不是问题!


开启交叉编译,需要设置GOOS和/或GOARCH


例如,假设在64位的Mac上:


docker run -e GOOS=darwin -e GOARCH=amd64 -v /tmp/crosstest:/go/bin \
golang go get github.com/golang/example/hello/...

交叉编译的输出不是直接在$GOPATH/bin,而是在$GOPATH/bin/$GOOS_$GOARCH.。换言之,想运行程序,得执行/tmp/crosstest/darwin_amd64/hello.


直接安装到$PATH


如果在Linux上,甚至可以直接安装到系统bin目录:


docker run -v /usr/local/bin:/go/bin \
golang get github.com/golang/example/hello/...

然而,在Mac上,尝试用/usr作为一个卷将不能挂载Mac的文件系统到容器。会挂载Moby VM(小Linux VM藏在工具栏Docker图标的后面)的/usr目录。(译注:目前Docker for Mac版本可以自定义设置挂载路径)


但可以使用/tmp或者在你的home目录下的什么其它目录,然后从这里复制。


创建依赖镜像


我们用这种技术产生的Go二进制文件是静态链接的。这意味着所有需要运行的代码包括所有依赖都被嵌入了。动态链接的程序与之相反,不包含一些基本的库(像“libc”)并且使用系统范围的复制,是在运行时确定的。


这意味着可以在容器里放弃Go编译好的程序,没有别的,并且它会运行。


我们试试!


scratch镜像


Docker生态系统有一个特殊的镜像:scratch.这是一个空镜像。它不需要被创建或者下载,因为定义的就是空的。


给新的Go依赖镜像创建一个新的空目录。


在这个新目录,创建下面的Dockerfile:


FROM scratch
COPY ./hello /hello
ENTRYPOINT ["/hello"]

这意味着:从scratch开始(一个空镜像),增加hello文件到镜像的根目录,*定义hello程序为启动这个容器后默认运行的程序。


然后,产生hello二进制文件如下:


docker run -v $(pwd):/go/bin --rm \
golang go get github.com/golang/example/hello/...

注意:不需要设置GOOSGOARCH,正因为,想要一个运行在Docker容器里的二进制文件,不是在主机上。所以不用设置这些变量!


然后,创建镜像:


docker build -t hello .

测试它:


docker run hello

(将显示“Hello, Go examples!”)


最后但不重要,检查镜像的大小:


docker images hello

如果一切做得正确,这个镜像大约2M。相当好!


构建东西而不推送到Github


当然,如果不得不推送到GitHub,每次编译都会浪费很多时间。


想在一个代码段上工作并在容器中创建它时,可以在golang容器里挂载一个本地目录到/go。所以$GOPATH是持久调用:docker run -v $HOME/go:/go golang ....


但也可以挂载本地目录到特定的路径上,来“重载”一些包(那些在本地编辑的)。这是一个完整的例子:


# Adapt the two following environment variables if you are not running on a Mac
export GOOS=darwin GOARCH=amd64
mkdir go-and-docker-is-love
cd go-and-docker-is-love
git clone git://github.com/golang/example
cat example/hello/hello.go
sed -i .bak s/olleH/eyB/ example/hello/hello.go
docker run --rm \
-v $(pwd)/example:/go/src/github.com/golang/example \
-v $(pwd):/go/bin/${GOOS}_${GOARCH} \
-e GOOS -e GOARCH \
golang go get github.com/golang/example/hello/...
./hello
# Should display "Bye, Go examples!"

网络包和CGo的特殊情况


进入真实的Go代码世界前,必须承认的是:在二进制文件上有一点点偏差。如果在使用CGo,或如果在使用net包,Go链接器将生成一个动态库。这种情况下,net包(里面确实有许多有用的Go程序!),罪魁祸首是DNS解析。大多数系统都有一个花哨的,模块化的名称解析系统(像名称服务切换),它依赖于插件,技术上,是动态库。默认地,Go将尝试使用它;这样,它将产生动态库。


我们怎么解决?


重用另一个版本的libc


一个解决方法是用一个基础镜像,有那些程序功能所必需的库。几乎任何“正规”基于GNU libc的Linux发行版都能做到。所以,例如,使用FROM debianFROM fedora,替代FROM scratch。现在结果镜像会比原来大一些;但至少,大出来的这一点将和系统里其它镜像共享。


注意:这种情况不能使用Alpine,因为Alpine是使用musl库而不是GNU libc。


使用自己的libc


另一个解决方案是像做手术般地提取需要的文件,用COPY替换容器里的。结果容器会小。然而,这个提取过程困难又繁琐,太多更深的细节要处理。


如果想自己看,看看前面提到的ldd和名称服务切换插件。


用netgo生成静态二进制文件


我们也可以指示Go不用系统的libc,用本地DNS解析代替Go的netgo


要使用它,只需在go get选项加入-tags netgo -installsuffix netgo



  • -tags netgo指示工具链使用netgo

  • -installsuffix netgo确保结果库(任何)被一个不同的,非默认的目录所替代。如果做多重go get(或go build)调用,这将避免代码创建和用不用netgo之间的冲突。如果像目前我们讲到的这样,在容器里创建,是完全没有必要的。因为这个容器里面永远没有其他Go代码要编译。但它是个好主意,习惯它,或至少知道这个标识存在。


SSL证书的特殊情况


还有一件事,你会担心,你的代码必须验证SSL证书;例如,通过HTTPS联接外部API。这种情况,需要将根证书也放入容器里,因为Go不会捆绑它们到二进制文件里。


安装SSL证书


再次,有很多可用的选择,但最简单的是使用一个已经存在的发布里面的包。


Alpine是一个好的选择,因为它非常小。下面的Dockerfile将给你一个小的基础镜像,但捆绑了一个过期的跟证书:


FROM alpine:3.4
RUN apk add --no-cache ca-certificates apache2-utils

来看看吧,结果镜像只有6MB!


注意:--no-cache选项告诉apk(Alpine包管理器)从Alpine的镜像发布上获取可用包的列表,不保存在磁盘上。你可能会看到Dockerfiles做这样的事apt-get update && apt-get install ... && rm -rf /var/cache/apt/*;这实现了(即在最终镜像中不保留包缓存)与一个单一标志相当的东西。


一个附加的回报:把你的应用程序放入基于Alpine镜像的容器,让你获得了一堆有用的工具。如果需要,现在你可以吧shell放入容器并在它运行时做点什么。


打包


我们看到Docker如何帮助我们在干净独立的环境里编译Go代码;如何使用不同版本的Go工具链;以及如何在不同的操作系统和平台之间交叉编译。


我们还看到Go如何帮我们给Docker创建小的,容器依赖镜像,并且描述了一些静态库和网络依赖相关的微妙联系(没别的意思)。


除了Go是真的适合Docker项目这个事实,我们希望展示给你的是,Go和Docker如何相互借鉴并且一起工作得很好!


致谢


这最初是在2016年GopherCon骇客日提出的。


我要感谢所有的校对材料、提出建议和意见让它更好的人,包括但不局限于:



所有的错误和拼写错误都是我自己的;所有的好东西都是他们的!


原文链接:Docker + Golang = <3(翻译:陈晏娥 审校:田浩浩

16.10.21Docker最新动态 VMware举白旗:vSphere、vRealize、VSAN都将支持Docker

文章分享wwdyy 发表了文章 • 0 个评论 • 465 次浏览 • 2016-10-21 12:55 • 来自相关话题

本周在巴塞罗那举行的VMworld大会上,容器成为热点话题,VMware在自己的计算、存储和管理产品组合中(vSphere、VSAN和vRealize)中支持容器用于生产环境。

VMware似乎正在采取EMC的颠覆性技术方法:证明EMC是全... 查看全部

本周在巴塞罗那举行的VMworld大会上,容器成为热点话题,VMware在自己的计算、存储和管理产品组合中(vSphere、VSAN和vRealize)中支持容器用于生产环境。


VMware似乎正在采取EMC的颠覆性技术方法:证明EMC是全闪存阵列和超融合基础设施一体机的早期采用者。因此,VMware知道vSphere这块蛋糕要被软件初创厂商夺走,但并不排斥容器而是提供支持。


下面就让我们分别来看看vSphere 6.5、VSAN 6.5和vRealize Automation 7.2。


vSphere 6.5




  • vCenter Server Appliance让客户简化了打补丁、升级、备份和恢复,获得高可用性,vCenter Server环境的规模和性能增加了2倍。




  • REST API用于控制虚拟基础设施以及实现自动化




  • 基于HTML5的vSphere Client简化了管理员的体验




  • 虚拟机级的加密,确保静态数据以及vMotion虚拟机的安全




  • Secure Boot帮助防止图像篡改,防止将未经授权的组件加载到vSphere环境中



  • vSphere Integrated Containers为应用团队提供了一个兼容Docker的接口,能够让vSphere运行容器而不用重新架构他们现有的基础设施


VMware还宣布vSphere Virtual Volumes 2.0增加了对阵列复制和业务关键应用——例如Oracle Database with Real Application Cluster——的原生支持。


Virtual SAN 6.5


VSAN 6.5新增了5个功能特性,使其成为物理存储阵列更好的替代选择:




  • 支持iSCSI,这样VSAN就可以作为针对外部物理工作负载的iSCSI目标,包括集群应用,例如在有限数量的物理服务器上进行SQL Server with Failover Clustering




  • 永久数据层,通过vSphere Integrated Container针对容器化的应用




  • 双节点Direct Connect,避免了ROBO站点不同VSAN系统之间对路由器和交换机的需求,帮助客户降低成本达15%-20%/站点。




  • REST API和Expanded PowerCLI面向企业级自动化和类似云的灵活性,以及对VSAN环境的管理



  • 支持512字节的模拟(512e)磁盘驱动器和SSD,可支持高容量驱动器,推进全闪存的超融合基础设施理念。


全闪存超融合基础设施一体机这个想法是诱人的,意味着相比基于磁盘的超融合基础设施一体机性能要提升2-5倍甚至更多。


VSAN还通过了一项认证计划。该计划最初是专注于文件服务和数据保护产品,向客户确保这些产品可以恰当地部署、运行和与VSAN实现互操作性,文件服务产品将来自于Dell EMC、NetApp和Nexenta。数据保护方面的合作伙伴则包括CommVault、Dell EMC、Veeam和Veritas。


随着时间的推移,VMware将会把更多合作伙伴的产品带入自己的VSAN生态系统。


vRealize Automation 7.2


vRealize Automation 7.2将引入对微软Azure的开箱即用支持,目前主要是对AWS和vCloud Air的支持。此外该产品还将增加容器管理能力,及以下功能:




  • Admiral,一个可扩展的、轻量级的容器管理menu,用于部署和管理容器到Docker主机




  • 开发者们可以通过vRealiza Automation 7.2服务目录配置容器主机,使用统一服务蓝图或者Docker Compose给容器化的应用做建模




  • 应用团队可以搭建混合式的虚拟机和容器部署




  • 云管理员可以管理容器主机,并监管使用情况,包括容量配额或者审批工作流




  • vRealize Log Insight 4.0将采用高级警报管理功能,和重新设计的、易于使用的界面




  • vRealize Operations 6.4有更好的警报管理和度量分组,以及针对特定用户角色定制设计的新仪表板,覆盖基础设施、应用和云团队



  • vRealize Log Insight 4.0和vRealize Operation 6.4将集成vSphere 6.5,以及更广泛的vRealize产品组合。


目前VMware正在测试Admiral,在VMware vSphere Integrated Containers的虚拟容器主机上部署和管理容器,并称“vRealize Automation 7.2很适合那些要求支持现有应用、同时通过采用微服务和云原生架构实现应用现代化的企业机构”。


vCloud Air


VMware正在面向企业推出vCloud Air灾难恢复产品的测试版。


VMware表示,该产品提供了对专有云环境的安全和隔离,结合了直接集成到vSphere中的复制产品的简化性,以及针对SD-WAN技术进行了优化。


VMware还推出了测试版的VMware Cloud Foundation Service on vCloud Air,可以在完全集成的VMware服务产品使用vSphere、VSAN和NSX。


定价和供货


VSAN标准版将在这个季度获得基础的全闪存配置支持。


VMware vRealize Automation 7.2、vRealize Log Insight 4.0和Operations 6.4、Virtual SAN 6.5、vSphere 6.5以及vSphere Virtual Volumes 2.0都预计在今年年底供货。


vSphere 6.5的VMware vSphere Integrated Containers新功能(也在vSphere 6上支持)将面向vSphere Enterprise Plus版本的客户免费提供。vSphere的起价为每CPU 995美元。


Virtual SAN的起价为每CPU 2495美元。用于台式机的Virtual SAN起价为每个用户50美元。Virtual SAN标准本现在包含对全闪存硬件的支持。

视频来啦 | 手把手教你玩转数人云容器管理面板Crane

Go开源项目数人云 发表了文章 • 0 个评论 • 382 次浏览 • 2016-10-19 10:40 • 来自相关话题

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.... 查看全部

数人云容器管理面板Crane已经开源一个月多啦,经历了新版本v1.0.5的发布,完善了许多功能和体验。今天小数给小伙伴们带来的是数人云总架构师为大家录制的Crane使用视频。从安装到使用,step by step,玩转容器管理面板就是这么简单!


小数友情提示,在电脑上超清模式下获得最好的视频体验:)


视频地址:http://v.qq.com/x/page/a0337msa1d4.html


关于Crane


数人云容器管理面板Crane是国内首个基于最新 Docker SwarmKit 技术的集群管理工具。它根据 Docker 的原生编排功能,采用轻量化架构,帮助开发者快速搭建 DevOps 环境,体验 Docker 的各种最新功能。


欢迎扫码下方二维码来Crane交流群进行技术交流~(^-^)V


Docker 从入门到实践-3-安装

文章分享wwdyy 发表了文章 • 1 个评论 • 364 次浏览 • 2016-10-17 23:26 • 来自相关话题

Ubuntu 系列安装 Docker

官方网站上有各种环境下的 安装指南。

通过系统自带包安装

Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。

$ sudo... 查看全部

Ubuntu 系列安装 Docker


官方网站上有各种环境下的 安装指南。


通过系统自带包安装


Ubuntu 14.04 版本系统中已经自带了 Docker 包,可以直接安装。


$ sudo apt-get update
$ sudo apt-get install -y docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker
$ sudo sed -i '$acomplete -F _docker docker' /etc/bash_completion.d/docker.io
如果使用操作系统自带包安装 Docker,目前安装的版本是比较旧的 0.9.1。 要安装更新的版本,可以通过使用 Docker 源的方式。


通过Docker源安装最新版本


要安装最新的 Docker 版本,首先需要安装 apt-transport-https 支持,之后通过添加源来安装。


$ sudo apt-get install apt-transport-https
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
$ sudo bash -c "echo deb https://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker


14.04 之前版本


如果是较低版本的 Ubuntu 系统,需要先更新内核。


$ sudo apt-get update
$ sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring
$ sudo reboot
然后重复上面的步骤即可。


安装之后启动 Docker 服务。


$ sudo service docker start


CentOS 系列安装 Docker


Docker 支持 CentOS6 及以后的版本。


CentOS6


对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下


$ sudo yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm
$ sudo yum install docker-io


CentOS7


CentOS7 系统 CentOS-Extras 库中已带 Docker,可以直接安装:


$ sudo yum install docker
安装之后启动 Docker 服务,并让它随系统启动自动加载。


$ sudo service docker start
$ sudo chkconfig docker on

Docker 从入门到实践-2-基本概念

文章分享wwdyy 发表了文章 • 0 个评论 • 397 次浏览 • 2016-10-15 20:46 • 来自相关话题

镜像

Docker 包括三个基本概念

镜像(Image)
容器(Container)
仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周... 查看全部

镜像


Docker 包括三个基本概念


镜像(Image)
容器(Container)
仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期。


Docker 镜像


Docker 镜像就是一个只读的模板。


例如:一个镜像可以包含一个完整的 ubuntu 操作系统环境,里面仅安装了 Apache 或用户需要的其它应用程序。


镜像可以用来创建 Docker 容器。


Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。


Docker 容器


Docker 利用容器来运行应用。


容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。


可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。


注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。


Docker 仓库


仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。


仓库分为公开仓库(Public)和私有仓库(Private)两种形式。


最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool 等,可以提供大陆用户更稳定快速的访问。


当然,用户也可以在本地网络内创建一个私有仓库。


当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。


注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。

Docker 从入门到实践-1-Docker简介

文章分享wwdyy 发表了文章 • 0 个评论 • 421 次浏览 • 2016-10-14 18:11 • 来自相关话题

本文转自极客学院-wiki

Docker 从入门到实践

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是... 查看全部

本文转自极客学院-wiki


Docker 从入门到实践


Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 App)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。


Docker 是个伟大的项目,它彻底释放了虚拟化的威力,极大降低了云计算资源供应的成本,同时让应用的分发、测试、部署和分发都变得前所未有的高效和轻松!


适用人群 适用人群


本书既适用于具备基础 Linux 知识的 Docker 初学者,也希望可供理解原理和实现的高级用户参考。


学习前提 学习前提


学习本书前,需要你对 Linux 系统有一定的了解,此外,本书注重实践,所以需要读者能够自己搭建 Linux 环境。


什么是 Docker


Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。


Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。


Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。


在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。


下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。



为什么要使用 Docker?


作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。


首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。


容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。


具体说来,Docker 在如下几个方面具有较大的优势。


更快速的交付和部署


对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。


开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。


更高效的虚拟化


Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。


更轻松的迁移和扩展


Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。


更简单的管理


使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。


对比传统虚拟机总结
































特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Rikka - 极简多插件私人图床

开源程序7sDream 发表了文章 • 3 个评论 • 988 次浏览 • 2016-10-14 12:23 • 来自相关话题

OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧……

简介

Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能,所有的一切都按照 ... 查看全部

OvO 终于有个 Go 社区了……我来发个学 Golang 的时候练手的一个东西吧……


简介


Rikka 是一个极简的图床系统,设计理念是让每个人都能有个自己的好用的图床。为了极简,去掉了上传历史的功能,所有的一切都按照 上传-复制-关闭-粘贴 的使用流程来设计。为了方便每个人自己部署,封装成了 Docker Image。DaoCloud 的一个 128M 的实例都能愉快的跑 Rikka,内存占用大约 10 - 20M。


因为是在我刚学 Go 的时候开的项目,所以我在有意的尽量不使用其他模块,专注于用自带 package 完成功能,对于其他初学者可能是个不错的例子哟。


特点/Feature:



  • 极简,不保存上传历史

  • 支持将图片链接复制成多种格式

  • 文件储存部分插件化,有很多可用的插件,比如:新浪微博,七牛云,又拍云,腾讯云等

  • 提供 API

  • Web 服务和 RESTful API 服务模块化

  • CLI 工具

  • 只保证支持较新版本的 Chrome/Firefox/Safari

  • 首页标志很可爱

  • 维护者貌似很活跃 :)


目前支持的图片储存插件



  • 本地服务器

  • 七牛云

  • 又拍云

  • 新浪微博

  • 腾讯云 COS

  • 腾讯云 CI


可能以后还会加啦,因为是插件形式,所以加起来很简单。应该以后会有 Imgur 和 Flickr 插件吧。
恩,其实可以自己写插件的,但是我现在还没写插件的编写文档。不过把目前我写的几个插件看完应该也就明白怎么写了,很 Easy 的~


截图/Demo


首页:


homepage


预览页面:


viewpage


我在 DaoCloud 用免费配额搭了个 Rikka 做 Demo:http://7sdream-rikka-demo.daoapp.io/


密码是:rikka


感兴趣的可以去试试,最大图片大小 5M。不过这只是 Demo 哟,不要真的用这个啦,如果想自己搭个自用的 Rikka 的话可以看:部署文档图文教程


我自己也在腾讯云部署了一个:http://akkir.me 但是这个就不告诉你们密码咯……毕竟是自用的。


API/CLI


Rikka 是有 RESTFul 的 API 的,文档在这里


然后我还写了个 CLI 工具方便命令行使用:文档|下载


放个使用截图吧:



然后是多张上传:



计划中是有跨平台 GUI 想法的,不过现在还没动手。


项目地址


嘎嘎嘎 项目地址留在最后:https://github.com/7sDream/rikka


Docker Image:https://hub.docker.com/r/7sdream/rikka/


如果刚开始学 Golang 的小伙伴应该可以稍微看看当作入门例子。


功力雄厚的同志们就来多提提意见吧~不甚感激!


对了对了,有谁知道 Docker Container 的 Logs 怎么和 Fail2Ban 结合起来使用呀?只能在 Container 里装个 Fail2Ban 么?

16.10.13Docker最新动态 Docker在中国找到了第一个官方合作伙伴-阿里云

文章分享wwdyy 发表了文章 • 2 个评论 • 389 次浏览 • 2016-10-13 19:16 • 来自相关话题

10月13日,在2016杭州·云栖大会上,全球知名的容器技术公司Docker与阿里云宣布达成战略合作,双方将在容器服务领域进行紧密合作,阿里云将为客户提供更加先进的云上应用管理服务。 查看全部

10月13日,在2016杭州·云栖大会上,全球知名的容器技术公司Docker与阿里云宣布达成战略合作,双方将在容器服务领域进行紧密合作,阿里云将为客户提供更加先进的云上应用管理服务。


基于合作,双方在开源容器技术以及发展方向上共同努力,并提供本地化的Docker服务。Docker公司选择阿里云平台作为其Docker Hub在中国运营的基础服务。阿里云也获得Docker Engine商用版以及Docker DataCenter运营权,并为Docker客户提供企业级支持和咨询服务。同时,阿里云将成为Docker官方支持的云服务提供商。


Docker技术是近年来最火的开源技术,正在改变企业应用从开发、构建到发布、运行的整个生命周期。 此前,Docker与AWS、Azure、IBM、HPE进行合作,阿里云是其在国内的第一个官方合作伙伴。


阿里云在2015年开始提供“容器服务”,在容器领域有着长期的技术积累和持续投入。阿里云将为客户提供更为多样的容器相关解决方案如DevOps、微服务改造,藉此帮助企业用户通过更为稳定、高效、安全的实现其对应用升级和改造,有效降低维护成本,交付效率提升13倍。同时,利用容器“一次构建,随处运行”的特点,可以帮助用户迁移无缝应用到云环境。


Docker Hub等服务落地中国,可以更好地服务国内开发者,促进中国技术社区的成长。得益于阿里云强大的云基础设施,将极大提升国内用户对Docker Hub的访问体验。


在阿里云上,华大基因正在利用容器服务构建基因数据的应用开发和共享平台,路特通过阿里云容器服务实现DevOps为企业客户提供SaaS服务,学霸君基于容器服务实现微服务架构应用和DevOps流程优化。


Docker CEO Ben Golub说,我们很高兴把Docker容器技术, 商业化的Docker Engine和Docker DataCenter引进到中国,我们选择了领先的的合作伙伴,让我们能够更好地服务于我们共同的客户。


阿里云总裁胡晓明表示,通过和Docker的战略合作,阿里云将更好地为企业级客户提供完善的云服务,使能客户,并实现时代转型。

Windows 原生 Docker 正式商用

文章分享DaoCloud 发表了文章 • 0 个评论 • 537 次浏览 • 2016-10-13 16:59 • 来自相关话题

上图显示:Windows 应用已经可以稳定地运行在原生容器管理平台之上

... 查看全部


上图显示:Windows 应用已经可以稳定地运行在原生容器管理平台之上


2016 年 9 月 26 日,微软 Ignite 技术大会在亚特兰大举行,微软官方正式发布了 Windows Server 2016。对于广大 Windows 开发人员和 IT 技术专家来说,Windows 最令人激动的新功能,非「容器」莫属。而运行在 Windows Server 2016 上的容器,正是由 Docker 公司所驱动。


本篇博客将详细剖析这些让 Docker 容器与 Windows 完美匹配的技术创新点,并尝试阐述这些成就的重要意义。我们也推荐你看看同期发布的几篇博客,其中一篇讲述了如何创建你的第一台 Windows 容器,还有一篇详细介绍了 Docker 公司和微软公司为了在 Windows 上支持 Docker 而开展的一系列商业合作。



2013 年,第一版 Docker 正式问世。从那以后的三年间,Docker 发展势如破竹,彻底改变了 Linux 开发者和运维人员 “构建、交付和运行(build,ship and run)” 应用的方式。如今,Docker Engine 和容器已经可以在 Windows 平台之上原生使用了,开发者和 IT 专家们也可以在 Windows 平台应用和基础架构上,体验一把 Linux 用户曾经经历过的大革新,享受 Linux 用户曾经享受过的福利:更好的安全性、更高的敏捷性、更优良的便捷性,以及随时可以把私有应用迁移到云端之上的灵活性。


而对于那些需要创建和维护 Linux 和 Windows 两大架构平台的开发人员和 IT 专家们来说,Docker 运行在 Windows 平台的重大意义更加不言而喻:现在,Docker 平台已经可以为 Linux 和 Windows 应用的管理提供一整套工具、API 和镜像格式了。随着 Linux 和 Windows 应用与服务器不断地 「Docker 化」,开发者和 IT 专家将能够通过使用 Docker 技术来管理和改进本地和云端的复杂微服务部署。


在 Windows Server 之上运行容器


Docker 和微软已经磨合了两年,期间开展了一系列的合作——Windows 内核中容器化基元(primitives)越来越多,为了充分利用这些新基元,双方协力把 Docker Engine 和 CLI 迁移到 Windows 平台上,Docker 还给 Docker Hub 增加了多架构镜像支持。今天 Windows 平台中正式引入 Docker,正是这两年合作的结晶。


结果就是,现在在 Windows 平台上已经可以完美使用强大无比的 docker run 来快速启动一个完全独立的新容器了。



内核容器化功能已经整合进所有版本的 Windows Server 2016,在 Win10 的周年更新系统中也有。Windows 原生的 Docker daemon 可以在 Windows Server 2016 和 Win10 系统上运行(虽然 Win10 上只能创建和运行基于 Windows Server 的容器)。


Windows 版的 docker run 和 Linux 版有着一样的意义:全进程隔离,自带层级变动支持的沙盒文件系统(还有 Windows 注册表!)。每个容器都只面向一个纯净的 Windows 系统,而且无法介入到系统上的其他进程(不管这个进程是否被容器化了)。


举个例子,两个用着不同网络信息服务(IIS)版本,用着不同 . NET 框架的 Docker 化应用,可以在同一个系统中友好共存,甚至可以在互不影响的情况下,给各自的文件系统和注册表读写数据。


容器化之后,Windows IT 专家们可以隔离全部进程,发布状态的工件将变得非常稳定,用起虚拟机来就更加得心应手了,不必担心在硬件虚拟化过程中产生的资源超支和灵敏度降低。


Linux 上的容器可以用不同的安全档案运行,Windows 上的容器也与此类似,可以运行以下两种隔离模式中的一种:


1、Windows Server 容器使用和 Linux 容器一样的共享内核进程隔离范式。由于容器作为标准(但是隔离)的进程来运行,所以启动很快,而资源超支可以降到最低。


2、有了 Hyper-V 隔离,容器一启动就会生成一个很小的管理程序,容器进程就在这个程序里运行。虽然启动速度会稍慢一点,资源占用也会略有增加,但整体的隔离环境却会好上不少。


可以通过 docker run 上一个简单的开关来设置隔离:



只要底层主机能支持所需的隔离模式,任何 Windows 容器镜像都能当作一台 Hyper-V 或服务器容器来运行,而且一台容器主机可以一个接着一个地运行这两者。基于容器的隔离模式,它是不知道容器进程的,而 Docker 控制 API 对于两种模式而言都是一样的。


这样一来,开发者就无需经常为隔离模式操心了,他们只需要用默认的设置就行,或者自己做些方便上手的设定。当 IT 专家需要选择如何在产品中部署容器化的应用时,隔离模式实实在在地为他们提供了选择的余地。


当然了,有一点要注意:尽管 Hyper-V 是支持 Hyper-V隔离的运行时技术,但 Hyper-V 隔离了的容器并不是 Hyper-V 虚拟机,不能用标准的 Hyper-V 工具来管理。


构建 Windows 容器镜像


得益于 Windows 注册表和文件系统的层级改进,docker build 和 Dockerfiles 都能完全支持创建 Windows Docker 镜像。下面是一个 Windows Dockerfile 样例文件,它是由斯蒂凡·施尔提交给 Node.js 官方 Docker 库的镜像。它能用 docker build 在 Windows 上创建出来:



来看看 PowerShell 是如何用于安装和启动 zip 文件和应用程序的吧:Windows 容器运行遵循 Windows API 的可执行程序。要创建和运行 Windows 容器,你需要一个 Windows 系统。虽然 Windows 和 Linux 上的 Docker 工具、控制 API 和镜像格式都是一样的,Docker Windows 容器不能在 Linux 系统上运行,反之亦然。


还请注意,开始层是 microsoft/windowsservercore。在创建 Windows 容器镜像时,开启 FROMScratch 是没用的。镜像要么是基于 microsoft/windowsserverco,要么是基于 microsoft/nanoserver。


Windows Server Core 镜像还配有一个近乎完整的用户态,这个用户态有各种进程,还有建立在标准 Windows Server Core 安装上的 DLL。除了 GUI 应用,以及那些需要 Windows 远程桌面的应用,大部分运行在 Windows Server 上的应用都能被 Docker 化,以最少的误差,在一个基于 microsoft / windowsservercore 的镜像上运行。举几个例子:MicrosoftSQL Server, Apache, 网络信息服务(IIS),以及整个 .NET 框架。


这种灵活性,是以容量的暴增为代价的:microsoft/windowsservercore 镜像高达 10 个 G。不过幸好有了 Docker 高效率的镜像层级,在实际操作中容量过大并不是什么大麻烦。任何一台 Docker 主机只需要拖进底层一次便足矣,任何拖进系统或创建在系统上的镜像只不过是在重复利用底层。


另一个底层选项是 Nano Server,这是一款全新的小体积 Windows 版本,带有一个精简版的 Windows API。包括 IIS、新版 .NET Core framework,Node.js 和 GO 在内,已经有大量的软件运行在 Nano Server 上了。而且 Nano Server 基本镜像的体积远小于 Windows Server Core,这意味着它的必备组件更少,保持刷新所需的表面积也更小。Nano Server 是一个令人激动的成果,不仅因为,作为小型容器的底层,它的创建和 boot 非常快,还因为,它作为一种极小主义操作系统,是为了另一款同样优秀的,专门运行 Docker 镜像和容器的容器主机 OS 而生的——这就是它的伟大之处。


有了 Windows Server Core 和 Nano Server 可供选择,开发者和 IT 大牛们就可以自由玩转了,要么把异彩纷呈的 Windows 平台应用 “lift-and-shift” 到 Server Core 容器里,要么采用 Nano Server 搞绿地模式开发,要么把整个应用分解成数量更多的小部分,整合进微服务的组件里。


Docker 目前正与微软及其社区携手,在 WindowsServer Core 和 Nano Server 上创建容器镜像。Golang、Python 和 Mongo 语言作为正式 Docker 镜像,都可以用,更多的 Docker 镜像也正在开发之中,而且微软还维护了一系列非常普及的样本镜像。


总结


今天,Docker Engine 能在 Windows 系统上创建、运行和管理容器,是微软团队、Docker 团队,以及 Docker 社区成员经年累月劳动的成果。Docker 与微软通力合作,把容器化的福音带给了 Windows 开发者和 IT专家,我们为此感到无比自豪;让 Windows 和 Linux 技术能用同一套工具和 API 来创建、交付和运行应用,我们也为此感到无比激动。