414

如果你看一下 Docker 的特性,其中大部分已经由 LXC 提供。

那么 Docker 增加了什么?为什么我要使用 Docker 而不是普通的 LXC?

4

5 回答 5

555

Docker 常见问题解答

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 Horizo​​n、shipyard)、配置管理(chef、puppet)、持续集成(jenkins、strider、travis)等。Docker 正在迅速将自己确立为基于容器的工具的标准。

我希望这有帮助!

于 2013-08-13T11:54:43.530 回答
73

我们来看看Docker的技术特性列表,看看哪些是LXC提供的,哪些不是。

特征:

1)文件系统隔离:每个进程容器运行在一个完全独立的根文件系统中。

提供普通的 LXC。

2)资源隔离:cpu 和内存等系统资源可以使用 cgroups 以不同的方式分配给每个进程容器。

提供普通的 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,所以我欢迎任何更正或更好的答案。

于 2013-08-01T08:50:42.633 回答
17

随着LXD 的发展不断增强 LXC,上述帖子和答案正在迅速过时。是的,我知道 Docker 也没有停滞不前。

LXD 现在为 LXC 容器镜像实现了一个存储库,用户可以从中推送/拉取以贡献或重用。

LXD 到 LXC 的 REST api现在使用非常简单的命令语法支持本地和远程创建/部署/管理 LXC 容器。

LXD 的主要特点是:

  • 设计安全(非特权容器、资源限制等等)
  • 可扩展(从笔记本电脑上的容器到数千个计算节点)
  • 直观(简单、清晰的 API 和清晰的命令行体验)
  • 基于图像(不再有分发模板,只有好的、受信任的图像)实时迁移

OpenStack 现在有NCLXD 插件,允许 OpenStack利用 LXD 将 LXC 容器作为 OpenStack 中的 VM 部署/管理,而不是使用 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 发布时,将会有其他很酷的功能,例如块设备支持、实时迁移支持

于 2015-12-19T14:29:07.387 回答
4

Docker 使用分层构建的图像。这在可移植性、共享、版本控制和其他功能方面增加了很多。这些图像非常容易移植或传输,并且由于它们是分层的,因此后续版本中的更改以层的形式添加到先前的层上。因此,在多次移植时,您不需要移植基础层。Docker 拥有运行这些镜像的容器,其中包含执行环境,它们将更改添加为新层,从而提供简单的版本控制。

除此之外,Docker Hub 是一个很好的注册表,包含数千个公共镜像,您可以在其中找到安装了操作系统和其他软件的镜像。因此,您可以为您的应用程序获得一个很好的开端。

于 2015-05-29T08:07:44.430 回答
0

要保持这个简洁,这已经在 上面被问过和回答了。

但是,我会退后一步,并以稍微不同的方式回答它,docker 引擎本身添加了编排作为其附加功能之一,这是破坏性的部分。一旦您开始将应用程序作为跨多个容器引擎“某处”运行的容器组合运行,它就会变得非常令人兴奋。鲁棒性、水平扩展、从底层硬件的完全抽象,我可以继续……

不仅仅是 Docker 给了你这个,事实上,事实上容器编排标准是 Kubernetes,它有很多风格,一个 Docker,还有 OpenShift、SuSe、Azure、AWS ......

然后在 K8S 之下有替代的容器引擎;有趣的是 Docker 和 CRIO - 最近构建的无守护进程,旨在作为专门用于 Kubernetes 但不成熟的容器引擎。我认为这些之间的竞争将是容器引擎真正的长期选择。

于 2018-06-29T09:12:18.643 回答