一年之后重新审视 Docker —— 根本性缺陷和炒作

简介:

Dockerfile

Dockerfile 有很多问题,丑陋、约束、矛盾还有从根本上的缺陷。比方说在一个仓库里生成多个镜像,所有的镜像都需要同样的依赖环境,但是其中一个包含调试工具。Docker不支持这个(per #9198),你也不能扩展Dockerfile(per #735),使用子目录会破坏创建环境同时会阻止你使用ADD/COPY命令(per #2224),因为dockerfile使用管道方式读入的(per #2112),你也不能使用环境变量在生成镜像的时候根据条件来改变指令(per #2637)。

我们的团队曾经创建了一个基础镜像,两个特定环境的镜像,还有一些makefile脚本用来做批量改名和sed替换。一些不期望的“特性”会导致环境变量$HOME消失,然后返回无用的错误信息。实在是太恶心了。
Docker 缓存/层

Docker有通过使用COW(写时复制)文件系统缓存Dockerfile指令的能力。和LVM快照类似,并且直到至今只支持AuFS,这个有无数的问题。接下来在0.7发布版中不同于COW实现被引入了来改善稳定性和性能,详情。

然而这个缓存系统是不智能的,导致了一些令人惊讶的负效应,不能阻止来自缓存的单指令(per #1996)。它也慢的痛苦,从这一点来说,如果阻止缓存和使用层,会让构建快一些。缓慢的上下载速度使Docker Hub的性能变得更糟糕。接下来详细描述。

这些问题都是由Docker作为一个完全的强制行线性指令执行甚至在它完全不适合的条件下的架构设计导致的。作为一个慢速构建的工作环境,你可以使用第三方工具支持异步执行,比如Salt Stack, Puppet 或者 甚至是 bash, 完全打败层的目标和使他们一无是处。

Docker Hub

Docker鼓励通过Docker Hub进行社区协作,在Docker Hub上你可以以公开或私有的方式发布你的Dockerfile,这样其他用户可以通过FROM命令来使用或者扩展你的Dockerfile,而不是复制粘贴。但是这样做也是有问题的。Dockerfile不支持多个FROM命令(per #3378, #5714 and #5726),意味着你只能继承一个镜像。Docker Hub也没有强制的版本,比如dockerfile/ubuntu:14.04的作者可以更换标签对应的内容,这就像使用一个没有强制版本的打包管理器。而且它TMD还有速度限制,这个下面会提到。

Docker Hub还有一个自动构建系统,它会检查你仓库中新的提交然后触发一个容器构建。这是完全无用的。构建配置几乎没有什么定制的能力,甚至没有最基础的构建前/后的脚本钩子。这迫使我们创建一个特殊的项目结构,在项目的根目录放一个单独的Dockerfile,这破坏了我们之前提到的构建环境,而且构建时间太TMD长了。

我们的小组曾近使用CircleCI,一个很特别的托管CI平台,它可以根据Makefile触发Docker的构建然后上传到Docker Hub上。这个也没有解决龟速的问题,看来唯一的选择就是使用我们自己的Docker仓库,但是这个实在是太复杂了。

安全性

Docker最初使用LXC作为基础的运行环境,但是从0.9版开始他们使用自己的容器库。通过它可以调整命名空间的性能、权限,而且可以通过定制LXC配置使用适当的exec-driver。

它需要在宿主机上启动一个守护进程,Docker上有很多安全上的缺陷,比如CVE-2014-6407 和 CVE-2014-6408,坦白说这些缺陷都不应该出现在第一位。甚至当Gartner看到他们跟踪记录上可怜的评估时,对Docker的不完善和安全问题表示了关注。

从设计上来说,Docker太信任命名空间的能力,而命名空间相比普通的hypervisor有太多的漏洞,像Xen现在有129个公开的漏洞,而Linux里有1279个漏洞。在一些场景下这是可以接受的,比如在Travis CI上的公开构建,但是在多用户的私有环境里是非常危险的。

容器不是虚拟机

Namespaces 和 cgroups 非常 强大,它们允许一个进程以及它的子进程从共享的内核资源(入网络栈和进程列表)里获得一个仅自己可见的视图。这种细粒度的控制和隔离,配合chroot jailing和 grsec,可以提供一层非常完美的保护。一些程序即使不用 docker 也可以获得这种好处,比如 uWSGI;一些不支持 Namespace 的程序则可以使用 firejail 从而运行在沙箱之中。
集装箱化的项目,比如 LXC 和 Docker,利用这些特性可以非常有效的在同一个内核空间里运行多个发行版。与 hypervisors 相比,这样的优势在于更低的内存占用,更快的启动速度,但是会降低安全性、稳定性和兼容性。一个极端的情况就是 Linux 内核接口,在内核和命名空间中运行不相容的或者未经测试的 glibc 可能产生一些无法预测的操作。

文章转载自 开源中国社区 [http://www.oschina.net]

相关文章
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
250 93
|
14天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
52 23
|
14天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
228 15
|
2月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
317 78
|
1月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
180 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
2月前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序
|
2月前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
235 35
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
99 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
69 17