十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
一、docker简介
创新互联建站10多年企业网站制作服务;为您提供网站建设,网站制作,网页设计及高端网站定制服务,企业网站制作及推广,对成都办公空间设计等多个方面拥有丰富的网站运维经验的网站建设公司。
Docker 官网:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
https://github.com/moby/moby
1、docker是什么
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
特性:一次封装到处运行,很好的说明了Docker的跨平台和强移植性。
Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。
Docker基础是Linux 容器(LXC)基础,并对其进行了更高层面的封装,使得用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
Docker容器与传统虚拟机不同,容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。参考如下对比图:
2.1 比虚拟机高效:
如前描述,因容器复用了本地主机操作系统,仅仅是封装了容器运行所需的软件环境(从这个角度看可以参考RPM安装包),因此与主机上直接运行软件所需的资源几乎是一样的。不像虚拟机那样需要额外的内存、CPU等来支持虚拟机操作系统的运行。
2.2 快速交付和部署:
对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。而且可以保证每一个地方运行的环境都是一模一样的,不会因为开发环境与生产环境不同而导致某些问题。
docker容器的启动更是秒级的,因此可以随时快速生产、关闭。
2.3 轻松迁移和扩展:
docker镜像可以在任意环境中迁移,而不会出现兼容性问题,迁移过程轻松方便。
2.4 管理简单:
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
2.5 docker对比传统虚拟机
三、Docker架构
1、Docker的组织架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
docker架构如图:
各组件介绍:
Docker 镜像(Images) | Docker 镜像是用于创建 Docker 容器的模板。 |
Docker 容器(Container) | 容器是独立运行的一个或一组应用。 |
Docker 客户端(Client) | Docker 客户端通过命令行或者其他工具使用 Docker API (https://docs.docker.com/reference/api/docker_remote_api) 与 Docker 的守护进程通信。 |
Docker 主机(Host) | 一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。 |
Docker 仓库(Registry) | Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。 Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。 |
Docker Machine | Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 |
三、基本概念
Docker 包括三个基本概念
镜像(Image)
容器(Container)
仓库(Repository)
理解了这三个概念,就理解了 Docker 的整个生命周期。
3.1 镜像:
Docker 镜像就是一个只读的模板。
例如:一个镜像可以包含一个完整的 CentOS 操作系统环境,里面仅安装了 httpd或用户需要的其它应用程序。
镜像可以用来创建 Docker 容器。
Docker 提供了一个很简单的机制来创建镜像或者更新现有的镜像,用户甚至可以直接从其他人那里下载一个已经做好的镜像来直接使用。
我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root
文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root
文件系统。比如官方镜像 ubuntu:14.04
就包含了完整的一套 Ubuntu 14.04 最小系统的 root
文件系统。
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
因为镜像包含操作系统完整的 root
文件系统,其体积往往是庞大的,因此在 Docker 设计时,就充分利用 Union FS 的技术,将其设计为分层存储的架构。所以严格来说,镜像并非是像一个 ISO 那样的打包文件,镜像只是一个虚拟的概念,其实际体现并非由一个文件组成,而是由一组文件系统组成,或者说,由多层文件系统联合组成。
镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。
分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层,然后进一步添加新的层,以定制自己所需的内容,构建新的镜像。
关于镜像构建,将会在后续相关章节中做进一步的讲解。
3.2 容器:
Docker 利用容器来运行应用。
容器是从镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
*注:镜像是只读的,容器在启动的时候创建一层可写层作为最上层。
每一个镜像都可能依赖于由一个或多个下层的组成的另一个镜像。我们有时说,下层那个 镜像是上层镜像的父镜像。
一个没有任何父镜像的镜像,谓之基础镜像。
所有镜像都是通过一个 64 位十六进制字符串 (内部是一个 256 bit 的值)来标识的。 为简化使用,前 12 个字符可以组成一个短ID,可以在命令行中使用。短ID还是有一定的 碰撞机率,所以服务器总是返回长ID。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类
和实例
一样,
镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root
文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID
空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学
Docker 时常常会把容器和虚拟机搞混。
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run
,数据却不会丢失。
3.3 仓库:
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器(Registry)混为一谈,并不严格区分。实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。 其作为默认docker仓库,但在国内下载速度很慢。当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
*注:Docker 仓库的概念跟 Git 类似,注册服务器可以理解为 GitHub 这样的托管服务。
镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签>
的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest
作为默认标签。
以 Ubuntu 镜像 为例,ubuntu
是仓库的名字,其内包含有不同的版本标签,如,14.04
, 16.04
。我们可以通过 ubuntu:14.04
,或者 ubuntu:16.04
来具体指定所需哪个版本的镜像。如果忽略了标签,比如 ubuntu
,那将视为 ubuntu:latest
。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy
,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。
Docker Registry 公开服务是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务供用户管理私有镜像。
最常使用的 Registry 公开服务是官方的 Docker Hub,这也是默认的 Registry,并拥有大量的高质量的官方镜像。除此以外,还有 CoreOS 的 Quay.io,CoreOS 相关的镜像存储在这里;Google 的 Google Container Registry,Kubernetes 的镜像使用的就是这个服务。
由于某些原因,在国内访问这些服务可能会比较慢。国内的一些云服务商提供了针对 Docker Hub 的镜像服务(Registry Mirror),这些镜像服务被称为加速器。常见的有 阿里云加速器、DaoCloud 加速器、灵雀云加速器等。使用加速器会直接从国内的地址下载 Docker Hub 的镜像,比直接从官方网站下载速度会提高很多。在后面的章节中会有进一步如何配置加速器的讲解。
国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像仓库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。
除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。在后续的相关章节中,会有进一步的搭建私有 Registry 服务的讲解。
开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker
命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。在官方的商业化版本 Docker Trusted Registry 中,提供了这些高级功能。
除了官方的 Docker Registry 外,还有第三方软件实现了 Docker Registry API,甚至提供了用户界面以及一些高级功能。比如,VMWare Harbor 和 Sonatype Nexus。
四、Docker变身Moby之谜
本周,Docker突然变成了Moby,这次名称的变更让很多人感到一头雾水。Docker(公司)决定将Docker(商业软件产品)和Docker(开源项目)区分开来。在DockerCon大会上,该公司推出了Moby Project项目——它其实就是Docker开源项目的新名称而已(相当于红帽公司的Ferdora项目)。
在DockerCon大会上,该公司推出了Moby Project项目——它其实就是Docker开源项目的新名称而已。Moby还扮演了另一个角色:为具体的基础设施创建个性化容器软件。
但这冰冻三尺,又非一日之寒。
早在 Docker 项目刚受到广泛关注不久,就已经有很多意见指出 Docker 这个名字既是公司名字,又是开源项目的名字,而且很快又成了公司商业产品的名字,这本身就是很大的隐患。但 Docker 公司并没有采取什么措施,反而更加关注和遏制任何第三方试图滥用 Docker 关键字的苗头。
Docker 公司有意无意之间制造的这个模糊地带,在 Docker 项目高速发展的两年里,将开源社区用心经营出来的庞大受众和用户群体,同公司未来商业产品的影响力和目标客户通过 “Docker” 关键字成功的统一起来。然后,在 “Docker 到 Moby” 这个原本可以用来修正这个错误的时间点上,Docker 公司又毫无征兆地、以迅雷不及掩耳之势完成了 Docker 项目的重命名。至此,“社区再无 Docker”,就成了这个无比成功的项目最后的感慨。这也是 Github 上和 HN 上的开发者感觉被冒犯的主要原因。
大多数容器用户实际上并无需过分纠结 Docker 或者 Moby。免费的 Docker-CE 会一直存在,Moby 开源社区依然会活跃,而且模块化后,要 hack 还变容易了,何乐而不为?
一句话版本,后面的可以不看:
Docker公司直接把原Docker项目改名成了Moby,是为了将之前数年里构建出来的庞大的粉丝团体和Google搜索内容(Google search footprint)全部转移到Docker公司的商业产品上。
需要注意:
Docker公司的商业产品包括了Docker EE和Docker CE,前者是企业收费版,后者是社区免费版。
也就是说,以后大家用的(包括大家现在机器里已经安装的)都是Docker公司的产品(注意,并不是项目),这个产品名叫Docker CE(命名方式如Docker 17.XX)。Docker公司也会不遗余力的鼓励用户在试用后购买付费版本(这很正常)。
二、关于Moby
Moby会以一个开源组织(Github Org)的方式存在。
Docker CE这个产品,会由Moby组织下的Moby项目以及其他项目构建和编译出来的。
Moby组织下面的项目均由社区开发者共同维护。这也就意味着对于Moby社区的参与者来说,
你们今后的工作方式是:
贡献Moby下的项目,然后使用Docker公司的Docker CE产品。
你也应该明白了,并不会存在一个开源项目叫Docker CE。
因为Docker CE是一个产品,你一定得从Docker公司官网上来下载使用。
三、用户到底在抱怨什么?
拆分后的Moby项目们无论在Docker公司的投入上、新特性的开放程度上、还是开发者活跃程度上,都会受到不小的影响。
实际上,如果是正常的技术公司的话,一般会选择继续维护自己的开源项目,然后在自己公司里卖一个企业版以及企业服务。
这种例子太多了,几乎每个开源项目都是这个套路。
但是唯独Docker公司,它直接把Docker开源项目改名了,或者说的更直白一点,给抹去了。从这天开始,你再也不可能找到一个叫Docker的开源项目。你从Google上搜到所有跟『Docker』相关的信息,都会指向Docker公司的那两个产品。原先Docker项目庞大的粉丝群,直接变成了Docker公司的客户。
这也是为什么所罗门一再解释『原先的Docker用户并不受影响』但是很多人并不买账的原因。问题不在于什么项目要改名啦,依赖库不能用啦这种小问题。关键问题在于,原Docker开源项目的用户被实实在在地愚弄了一把。这是前所未有的(不知道过去20年里大家有没有类似的例子)。
四、为什么这样做?
过去的20年里,成功的开源项目数不胜数,但是这些项目背后成功的商业公司堪称寥寥。要较真说案例,也就RedHat这种能够
控制到操作系统层面的公司,才勉强算是个成功的例子。其他的项目,越往上层走,越难盈利(因为用户越难留住)。实际上,大多数开源项目的商业公司,能养活这个项目就已经很不错了,盈利简直是天方夜谭。这也是为什么这么多年了,业内还是没事儿就讨论一把『开源怎么挣钱』这个问题。一个字,难。
君不见,这个圈子里,无数来自伯克利、Google、手握着黑科技的开源公司都趴在地上起不来,Docker这个手里并不控制核心技术、靠着亲人的UI/UX拿了天下的项目,盈利前景又如何呢?
Docker公司不可能看不到这个问题。别忘了它本身就是从一个PaaS公司(dotCloud)出来的,现在真没什么心思考虑开源世界的理想抱负。他从Docker项目成功的第一天开始,就是奔着做下一个VMware去的。否则M$的40亿美金收购,他根本没理由拒绝掉。
我要卖产品,可是用户在哪里?原Docker项目那4w多个star就跟我招手了。
真就这么急吗?湾区这边一直有传言称Docker公司的投资方定下了严苛的盈利标准,看来并不是天方夜谭。一个做纯后端技术独角兽,确实有为难的一面,谁让咱的目标是NASDAQ上市呢。
五、关于Docker的未来
毫无疑问,Docker公司的未来是光明的,一个新的VMware正呼之欲出。但重要的是,这个新VMware构建在一种全新的、基于
开源的商业模式上,这其实正类似于新时代我们耳熟能详的:粉丝经济。
有人问:这么一来开发者也不是被得罪了不少吗?
傻孩子。真正愿意付钱给Docker公司的老板们,才没工夫上HackerNews和Github呢!
『Docker?嗯,我听说过,好像还挺火的。小刘,咱们也上一套吧!』
立志做VMware的Docker公司,并没有功夫关心国内卖『自研Docker企业版』的小伙伴们。什么『Docker原生』,你再原生还能原生的过Docker
EE?更何况,价格还不一定谁便宜呢。当然,国内有个信息闭塞的好处,大家还能拉着Docker公司的大旗,沾一下Docker庞大粉丝潮的光。
唯独阿里云这个家伙、堂堂世界第三的云,竟然甘做Docker公司的代理人卖起了Docker EE。活该它在DockerCon上的新闻被国内的现场直播员们屏蔽(逃)。
只是,对于开源社区的参与者来说,就真剩下一片呵呵的表情了。Docker这么大的项目说没就没,无数人点上RIP真不为过。Moby社区的活跃度确实是个问号。