【发布时间】:2013-08-02 02:17:48
【问题描述】:
如果你看一下 Docker 的特性,大部分都是 LXC 提供的。
那么 Docker 增加了什么?为什么我要使用 Docker 而不是普通的 LXC?
【问题讨论】:
如果你看一下 Docker 的特性,大部分都是 LXC 提供的。
那么 Docker 增加了什么?为什么我要使用 Docker 而不是普通的 LXC?
【问题讨论】:
来自Docker FAQ:
Docker 不是 lxc 的替代品。 “lxc”指的是 linux 内核的功能(特别是命名空间和控制组),它们允许将进程相互沙盒化,并控制它们的资源分配。
在内核功能的这种低级基础之上,Docker 提供了一个具有多种强大功能的高级工具:
跨机器的可移植部署。 Docker 定义了一种格式,用于将应用程序及其所有依赖项捆绑到一个对象中,该对象可以传输到任何支持 docker 的机器上,并使用保证暴露给应用程序的执行环境是相同的。 Lxc 实现了进程沙箱,这是可移植部署的一个重要前提条件,但仅此一点还不足以进行可移植部署。如果您向我发送了一份安装在自定义 lxc 配置中的应用程序的副本,它几乎肯定不会像在您的机器上那样在我的机器上运行,因为它与您机器的特定配置相关:网络、存储、日志记录、发行版、等。Docker 为这些特定于机器的设置定义了一个抽象,以便完全相同的 docker 容器可以在许多不同的机器上运行 - 不变 - 具有许多不同的配置。
以应用程序为中心。 Docker 针对应用程序的部署进行了优化,而不是机器。这反映在其 API、用户界面、设计理念和文档中。相比之下,lxc 辅助脚本专注于将容器作为轻量级机器——基本上是启动速度更快且需要更少内存的服务器。我们认为容器不仅仅如此。
自动构建。 Docker 为开发人员提供了一个工具,可以从他们的源代码自动组装一个容器,完全控制应用程序依赖项、构建工具、打包等。他们可以免费使用 make、maven、chef、puppet、salt、debian 包、rpms、源tarball 或以上的任意组合,无论机器的配置如何。
版本控制。 Docker 包含类似 git 的功能,用于跟踪容器的连续版本、检查版本之间的差异、提交新版本、回滚等。历史还包括 容器是如何组装的以及由谁组装的,因此您可以从生产服务器一直到上游开发人员获得完整的可追溯性。 Docker 还实现了增量上传和下载,类似于“git pull”,因此只需发送 diff 即可传输容器的新版本。
组件重用。任何容器都可以用作“基础映像”来创建更专业的组件。这可以手动完成,也可以作为自动构建的一部分。例如,您可以准备理想的 Python 环境,并将其用作 10 个不同应用程序的基础。您理想的 postgresql 设置可以重新用于您未来的所有项目。以此类推。
共享。 Docker 可以访问公共注册表 (https://registry.hub.docker.com/),成千上万的人在其中上传了有用的容器:从 redis、couchdb、postgres 到 irc 保镖再到 rails 应用服务器的任何东西将 hadoop 作为各种发行版的基础映像。注册表还包括由 docker 团队维护的有用容器的官方“标准库”。注册表本身是开源的,因此任何人都可以部署自己的注册表来存储和传输私有容器,例如用于内部服务器部署。
工具生态系统。 Docker 定义了一个 API,用于自动化和自定义容器的创建和部署。有大量工具与 docker 集成以扩展其功能。类 PaaS 部署(Dokku、Deis、Flynn)、多节点编排(maestro、salt、mesos、openstack nova)、管理仪表板(docker-ui、openstack Horizon、shipyard)、配置管理(chef、puppet)、持续集成(jenkins、strider、travis)等。Docker 正在迅速将自己确立为基于容器的工具的标准。
我希望这会有所帮助!
【讨论】:
让我们看看list of Docker's technical features,看看哪些是LXC提供的,哪些不是。
1) 文件系统隔离:每个进程容器运行在一个完全独立的根文件系统中。
提供普通的 LXC。
2) 资源隔离:可以使用 cgroups 将 cpu 和内存等系统资源分配给每个进程容器。
提供普通的 LXC。
3) 网络隔离:每个进程容器在自己的网络命名空间中运行,具有自己的虚拟接口和 IP 地址。
提供普通的 LXC。
4) Copy-on-write:根文件系统是使用 copy-on-write 创建的,这使得部署速度非常快,内存和磁盘都很便宜。
这是由 AUFS 提供的,它是 Docker 所依赖的联合文件系统。您可以使用 LXC 手动设置 AUFS,但 Docker 将其用作标准。
5) 日志记录:收集并记录每个流程容器的标准流(stdout/stderr/stdin),以便实时或批量检索。
Docker 提供了这个。
6) 变更管理:对容器文件系统的变更可以提交到新镜像中并重新用于创建更多容器。无需模板或手动配置。
“模板化或手动配置”是对 LXC 的引用,您需要了解这两方面的知识。 Docker 允许您像处理虚拟机一样处理容器,而无需了解 LXC 配置。
7) 交互式 shell:docker 可以分配一个伪 tty 并附加到任何容器的标准输入,例如运行一次性的交互式 shell。
LXC 已经提供了这个。
我才刚刚开始学习 LXC 和 Docker,所以我欢迎任何更正或更好的答案。
【讨论】:
unshare 更易于使用工具(或直接使用clone() 系统调用)。同样,Docker 使这些东西更易于使用(并带来了更多功能,例如推/拉图像的能力)。我的 2c。
update-index 和 read-tree 之类的命令使用 Git,而没有 add、commit 和 merge 等熟悉的工具。 Docker 在 LXC 的“管道”之上提供了“瓷器”层,使您能够处理更高层次的概念,而不必担心低层次的细节。
随着LXD continues to enhance LXC 的发展,上述帖子和答案正在迅速过时。是的,我知道 Docker 也没有停滞不前。
LXD 现在为 LXC 容器镜像实现了一个存储库,用户可以从中推送/拉取以贡献或重用。
LXD 到 LXC 的 REST api 现在支持本地和远程使用非常简单的命令语法创建/部署/管理 LXC 容器。
LXD 的主要特点是:
有NCLXD plugin now for OpenStack allowing OpenStack 使用 LXD 将 LXC 容器部署/管理为 OpenStack 中的虚拟机,而不是使用 KVM、vmware 等。
不过,NCLXD 还支持混合了传统硬件虚拟机和 LXC 虚拟机的混合云。
OpenStack nclxd 插件支持的功能列表包括:
stop/start/reboot/terminate container
Attach/detach network interface
Create container snapshot
Rescue/unrescue instance container
Pause/unpause/suspend/resume container
OVS/bridge networking
instance migration
firewall support
到 2016 年 4 月发布 Ubuntu 16.04 时,将会有其他很酷的功能,例如块设备支持、实时迁移支持。
【讨论】:
Docker 使用分层构建的图像。这在可移植性、共享、版本控制和其他功能方面增加了很多。这些图像非常容易移植或传输,并且由于它们是分层的,因此后续版本中的更改以层的形式添加到先前的层上。因此,在多次移植时,您不需要移植基础层。 Docker 拥有运行这些包含执行环境的镜像的容器,它们将更改添加为新层,从而提供简单的版本控制。
除此之外,Docker Hub 是一个很好的注册表,包含数千个公共镜像,您可以在其中找到安装了操作系统和其他软件的镜像。因此,您可以为您的应用程序获得一个很好的开端。
【讨论】:
要保持这个简洁,这已经被问到并回答了above。
不过,我会退后一步,回答稍有不同,docker 引擎本身添加了编排作为其附加功能之一,这是破坏性的部分。一旦您开始将应用程序作为跨多个容器引擎“某处”运行的容器组合来运行,它就会变得非常令人兴奋。鲁棒性、水平扩展、从底层硬件中完全抽象出来,我可以继续……
不仅仅是 Docker 提供了这个功能,事实上,事实上的容器编排标准是 Kubernetes,它有很多不同的风格,一个 Docker,还有 OpenShift、SuSe、Azure、AWS...
那么在 K8S 之下还有替代的容器引擎;有趣的是 Docker 和 CRIO——最近构建的无守护进程,旨在作为专门用于 Kubernetes 但不成熟的容器引擎。我认为它们之间的竞争将是容器引擎真正的长期选择。
【讨论】: