首页 > 代码库 > docker

docker

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

Docker可以自动化打包和部署任何应用、创建一个轻量级私有PaaS云、搭建开发测试环境、部署可扩展的Web应用等;

尽管虚拟化和云计算以及大规模运算已经取得快速发展,但新服务的创建效率却未与时俱进!

Docker 发端于一个名为 dotcloud 的开源项目;随着编写者不断挖掘它的潜力,它迅速变成了一个炙手可热的项目。它由 GO 语言编写的,并且只支持 Linux。它基于 Linux 容器(LxC)来创建一个虚拟环境。请注意:虚拟环境 VE ( Virtual Environment ) 和 虚拟机( VM )很不一样。虚拟机是由虚拟工具或者模拟器( HyperV 、 VMWare 等)创建的,是一个全镜像的主机源,其中包括操作系统、硬盘调整、网络和虚拟进程。过于臃肿的结构吃掉了大量的硬盘空间同时拖慢了运行和开机速度。

Docker 通过自己与操作系统内核相分离的特点很好的解决了这个问题。它会首先创建一个与机器内核相分离的 “等级0” 包裹。任何之后的改变都被保存为 namespace 的快照,并且像虚拟系统那样在单独的容器内运行。“快照”只捕捉“基本模版”的改动,而不是整个机器上面的设置(不像是VM的快照功能)。从这一点我们可以看出 namespace 能够储存并在部署了 Docker 的主机中创建完整环境。

Docker 不会通过建立独有的操作系统、进程和对硬件进行模拟来创建属于自己的虚拟机。一台 VE 就像是轻量级的 VM ;它在已有的内核关于底层硬件的镜像上建立一个可以用来运行应用的‘容器’。它也可以用来创建操作系统,因为所谓的操作系统也不过是一个跑在内核上的应用 而已。可以把 Docker 想象成 LxC 的一个强化版,只是了以下 LxC 所不具有的特性:

强大的可移植性:你可以使用 Docker 创造一个绑定了你所有你所需要的应用的对象。这个对象可以被转移并被安装在任何一个安装了 Docker 的 Linux 主机上。

版本控制: Docker 自带 git 功能,能够跟踪一个容器的成功版本并记录下来,并且可以对不同的版本进行检测,提交新版本,回滚到任意的一个版本等功能等等。

组件的可重用性: Docker 允许创建或是套用一个已经存在的包。举个例子,如果你有许多台机器都需要安装 Apache 和 MySQL 数据库,你可以创建一个包含了这两个组件的‘基础镜像’。然后在创建新机器的时候使用这个镜像进行安装就行了。

可分享的类库:已经有上千个可用的容器被上传并被分享到一个共有仓库中( http://index.docker.io/)

https://registry.hub.docker.com/

docker集群配置工具也需注意一下;

。考虑到 AWS 对于不同环境下的调试和发布,这一做法是十分聪明的。

如果希望更加详细地了解 Docker 的功能,请点击 这里。

标准的配置方法

每个 LXC "容器" 之间或许不兼容,但是 docker 采用了一种标准的配置方法使得由不同 docker 创建出的 LXC 能够完全兼容。

基于应用

LXC 的定位是作为一种虚拟机的替代方案。虽然所有的软件都可以安装在由 LXC 或者 docker 管理的容器中,但是 docker 更倾向于在一个容器中运行一个应用。

自动构建

Docker 的容器是根据 dockerfile 构建的,你可以在构建 image 的过程根据需要中运行任何命令和程序。 

这意味着你不用调整现有的 image 构建方式,如果你使用 puppet,你可以在生成容器的时候执行 puppet 命令。

版本控制

Docker 实现了类似 git 的容器版本管理方法,并且能够进行增量更新。

组件复用

可以创建 base image 并将其保存在远程仓库 (repository) 中以便复用,其他容器可以在其基础上进行修改并保存为新的 image。

远程仓库

Docker 管理着一个公开的 image 库方便用户分享 image,同时公司也可以构造自己私有的 image 库。

生态系统

因为 docker 越来越流行,有大量的方法能够将其轻易地集成到开发过程中,比如可以采用统一的方法来构造用于持续集成的环境和开发环境的容器。

目前有不少反对者声称 docker 还是一个非常年轻的项目,并不能用于生产环境。但 docker 只是将一些已有的技术进行封装和组合并增加其业务逻辑,来避免大家直接使用 LXC 需要面对的一些麻烦。我相信如果直接使用 LXC ,会最终做出和 docker 功能类似的工具,然而不会得到已经转向 docker 的开发者社区的青睐。

Vagrant

Vagrant 基于行业技术标准提供了易于配置、可量产、并且可移植的工作环境,并且由一个统一的工作流程进行控制,从而使你和团队的工作效率和灵活性得以最大化。
为了实现这些特性, Vagrant 站在巨人的肩膀上,诸如 VirtualBox 、 VMware 、 AWS 等顶级供应商以及其他供应商。同时业界标准的供应工具,诸如 shell scripts 、 Chef 或者 Puppet 也都能在机器上自动安装和配置软件。

简言之, vagrant 能够将一个文件( vagrantfile )安装进操作系统中(任意操作系统,一般来说是用来运行服务和云终端的系统),同时也能将最终应用中运行程序和处理进程所需要用到的库和软件一起装上。换句话来说, vagrant 能够安装操作系统和 Docker 应用,然后 Docker 容器就可以在你电脑和服务器上运行。

所有的这些特性允许你创造相近的环境(不是完全相同而是指他们相互之间十分接近)用来测试你的应用。

因此,可以这样认为:

Vagrant 技术能够让你以一种方便简单的方式安装开发应用所需的一切。

Docker

Docker 是一个能让你在任何应用中都能轻松创建轻量级、可移植、自足容器的开源项目。一个在笔记本上编译和调试的容易能够大规模应用在虚拟机、 bare metal 、 OpenStack 集群、公有云等不同的生产环境中。
译者注:译者认为此处的 bare metal又称为bare machine , 是指没有安装任何操作系统的计算机。

简单来说,Docker 技术允许你在容器中运行你的应用(这有点类似于虚拟机,但是事实上还是有很大的区别),从而确保该应用所需要的所有库和包能够在任何情况下都有效运行,而不管你将他们跑在什么样的机器上。这就意味着你给 Memcache 和 Redis 分别定制的容器,在任何一个 Linux 的发行版上(包括你电脑和服务器上那些安装了 Vagrant 的系统),它们都会有相同的运行效果。

译者注:这里的 Memcache是指一种分布式缓存系统;而 Redis是指键值型数据存储数据库,一般也可指数据服务器。这两项技术的共同点都是使用键值存储的方式存储数据。

总结:Docker 技术可以允许你通过将应用程序运行在一个容器中的方式来消除对于各种依赖和库的担忧。

如何将这两种技术同时应用到你的生产环境中

如果此刻你还不能相信可以同时将两种技术整合到一起,那么让我给你举个例子:

在你的电脑上安装与服务器有相同操作系统的 Vagrant 虚拟机(一般来说是 Ubuntu Linux 12.04 LTS 64 位版)。这意味着你可以在任何你想要的操作系统上编程,并且期待这些程序也可以在服务器上运行。

通过在你虚拟机上安装 Docker 从而为 Vagrant 创造一个 Docker 容器。如果你能通过脚本来实现安装的话会更好。

在你的容器中安装应用程序( Nginx 、 Memcached 、 MongoDB 等 )

配置一个 shell 脚本、 Puppet 或者 Chef 脚本并安装 Docker 。每次 Vagrant 启动时运行 Docker 容器。

在你安装了 Vagrant 的虚拟机上测试你的容器。

现在你只需要怀着对提供者感激的心情使用同一个文件(你的 Vagrant 文件)并且敲下

vagrant up -provider = “ provider ”

(此处的 provider 是指你的镜像源),之后 Vagrant 会帮你完成一切的。比如你选择 AWS 作为你的镜像源,之后 Vagrant 将会连接到你的 AWS 中的 AMI,安装一个和你电脑上使用的操作系统相同的系统,安装上 Docker 容器并启动它,之后给你返回一个 ssh 会话。

测试你在 AWS 中的容器并且观察他们是否得到你预想的运行效果。

译者注:上面提到的 AWS 是指 Amazon Web Services ,是一个 Amazon 提供的云主机服务

你可以看出, Vagrant 和 Docker 并不是相互竞争,而是互补的关系。因此,如果你不知道应该学哪一个的话,我的建议是两个都学,这样的话你可以同时从两个技术中受益。

目前我在用 Docker 为哪些对 DevOPS/SysOPping 一无所知的人们准备开发环境,而编写 Dockerfiles 充满乐趣(不过偶尔也会有大坑)。 :)) LXC 表现如何呢?通过搭配 Ansible 使用,我能管理多个服务器资源(比如 VPN 、 DNS 、一些网页服务等)。有趣、速度快,并且非常稳定,让工作和生活简单多了。

谁是赢家?

不过对于我这种宁可用 fdisk 也不用 gparted (用 virsh 而不用 virt-manager )的人来说,Docker 并不是一个管理服务的好例子。老实来讲,我依然在找寻这个 问题的答案。经过对 Dokcer 几周的研究(和数月对 LXC 的研究),我可以告诉你一件明显的事,LXC 相比 Docker 还是简单些(例如在 spartan-like 这样的 Docker 镜像里运行 daemon 非常艰难,特别在某些库或者依赖缺失的情况下。)然而创建和运行 Dockerfile 却十分容易,就像创建 Ansible playbook 一样。

我觉得自己要做一件几年前已经做过的事情,那时我将 XEN 和KVM 共同运行在 FOSS full-virt race (免费开源项目全虚拟化竞赛)里。现在我打算同时使用 Docker 和 LXC 以观后效。 Docker 非常容易和完美地管理应用(因此使用 Docker 进行持续开发会是一个杀手级功能),而在一些基础服务( Gitlab 、 DNS 、 VPN 等)中我会使用 LXC/Ansible 。不过为了好玩,我会让它们并行工作,比如我在 LXC 下部署 Gitlab 的时候也会顺便创建一个对应的 Dockerfile 。