作者 | 徐杰承
审校 | 云昭
Docker刚刚度过了非常糟糕的一周。3月15日,Docker对外宣布了其最新的付费订阅计划,并向所有Free Team的Docker Hub用户发送了电子邮件,声称如果未在一个月内升级到付费团队,那么他们的账户将会被删除。
这在业界引起了轩然大波,鉴于来自多方组织的压力,Docker很快便进行了公开道歉:“我们在宣布Docker免费团队的终结方面做得很糟糕。”然而不出所料的是,这未能安抚用户们激烈的情绪,大量用户在对Docker这一行为进行批判的同时,也表示将放弃对Docker的使用与支持。
如今,无论是Docker始终未能解决的安全性问题,还是其早已千疮百孔并仍在不断恶化的生态环境,都在牵引着这头曾经被称为“硅谷宠儿”的“巨鲸”,慢慢游向一场无法避免的死区。
多年以来,Docker都是开发人员工具箱的重要组成部分,借由Docker的帮助,开发者能够以标准的方式构建、分发和部署应用程序。然而随着容器技术的发展以及越来越广泛的应用,Docker的安全性问题也变得越来越显著,并成为了用户逐渐抛弃Docker的一大核心理由。
由于Docker能够有效减少代码膨胀并提供更好的兼容性,因此其通常被用于代替虚拟机。也正是由于这一点,企业更加倾向于使用容器。但与虚拟机相比,Docker较低的隔离性势必会给用户带来一些安全性方面的困扰。
虚拟机通过创建离散状态机实现资源分配,每台计算机都有自己的操作系统,并通过虚拟机管理程序对其进行管理。在Docker中,这些容器构建在容器引擎之上,容器引擎则运行在主机操作系统的应用程序之中。此外,Linux中的chroot和cgroups等更新允许容器在资源划分方面更接近虚拟机。
Docker能够将这些特性打包成易于使用的服务,并添加图像、Docker文件和Docker CLI等概念,它还使系统管理员能够在服务器上快速部署大量容器。但这会带来一些安全隐患——系统管理员可以授予用户在预先部署的架构上运行Docker容器的权限。

但在默认情况下,Docker会将根级权限授予用户,而基于Linux的根级用户访问权限类似于Windows中的管理员访问权限,但其功能更加强大。通过根级用户访问权限,攻击者可以删除整个文件系统,或将普通用户提升为具有根级权限的用户,并在没有通知或警报的情况下安装其他恶意软件。
通过访问不安全的Docker容器,攻击者可以在获得运行权限及访问权限后轻松控制其中的代码。这就意味着心怀不轨的攻击者可以随意控制非特权账户的权限,从而开启一系列新的攻击媒介。
诸如此类攻击在Docker社区中并不新鲜,并且时至今日,攻击者仍在利用这样的方式在Docker系统中发掘更多可利用的漏洞。在近日由ZDNET所发布的一份报告中也提到:由于寻找管理员访问权限暴露的错误配置非常简单,因此自2021年以来,Docker已成为了网络犯罪分子最主要的攻击目标之一。
不可否认的是,Docker的势头在其刚发布的几年,非常火爆,大量业内人士也表示很少见到如此吸引行业兴趣的新兴技术。然而,随着兴奋转化为实际部署,大量企业开始注意到Docker的安全漏洞。尤其是当Docker涉及到安全运营与管理以及具有保密性、完整性和可用性的通用控件的支持时,其表现令大多数人十分失望。
如果说由于自身漏洞与架构缺陷所带来的安全性问题,是生来便拴在这条“鲸鱼”尾部的一条锁链。那么近年来Docker生态系统的不断流失,则可以算的上是一块被人为捆绑在锁链另一端的巨石。
纵观Docker的整个发展历程,其早期所取得的成功使该公司围绕Docker产品建立了一个庞大的社区,并推动了一轮又一轮的融资。而这也使得Docker公司上下变得愈发自大,时至Kubernetes的出现给了他们迎头一击。Docker在处理开源社区宠儿Kubernetes时没能给自己带来任何好处。
尽管Kubernetes最初更倾向于Docker容器,但彼时傲慢的Docker对这位背靠Google的新朋友摆出了敌对姿态,并一意孤行的推出了自己的容器编排平台Docker Swarm。然而就在不久之后,Kubernetes就免费提供了Swarm的所有功能与更多优化,在Docker自己创建的游戏中击败了它。
伴随着Kubernetes这颗新星不断上升,Docker团队也逐渐意识到了自己所犯下的错误。在此后的一次采访中,Docker创始团队员工Jérôme Petazzoni表示:“Docker本可以让Kubernetes成为GitHub上一流的Docker项目,但我们错过了Kubernetes。我们处于集体思维的泡沫中,在内部我们认为Kubernetes太复杂了,Swarm会更成功。没有意识到这一点是我们集体的失败。”
虽然不久之后,Docker于2015年通过创建开放容器标准(OCI)试图再次领导整个行业的发展趋势,但事实证明Docker的这一举动最终变成了搬起石头砸自己的脚。不可否认的是,创建开放标准确实对Docker的生态发展起到了短暂的帮助,但这也为Docker的对手提供了一张免费的入场券,此后的长期竞争使得Docker的行业地位受到了严重侵蚀。
最终在2019年,由于市场、财务等多方面原因,Docker解雇了大批员工,并选择将几乎全部核心业务出售给Mirantis。而这次出售所带来的一系列仓促的商业化改革、收入流限制以及对此前所达成协议的许可条款变更,再度对Docker本就岌岌可危的生态系统造成了一定的影响。随后不久,Kubernetes v1.2版本也宣布了将彻底弃用Docker。至此,Docker这颗曾经耀眼的明星彻底丧失了光芒。
虽然目前的Docker依然称得上是业内最流行的容器构建工具之一,并拥有极为庞大的用户群体。但大量开发人员已慢慢开始转向其他替代方案例如Podman或Containerd。尤其是在如今Docker更改其开源计划后,这一趋势一定将会在未来变得更加快速且明显。
对于Docker如今的处境,一位Reddit用户发表了这样的总结:Docker如今正在经历着慢性死亡,无论是Docker技术还是其背后的公司,都已经几乎失去了再度走向辉煌的可能性,因为它们已经没有什么能够再提供的了。
如今可以遇见的是,在未来的几年内Docker依然能够在容器市场中占有一定的比例,但很明显,十年后的IT环境将不会再把Docker作为开发者技术堆栈中的必备部分。也许届时一些其他依赖于OCI的容器化软件将占据市场领导者的位置,但从Docker目前的发展轨迹来看,这份名单中将不会再有它的身影。
当然,我们也看到Docker在努力挽救,比如从以往的企业导向变为更加注重开发者,但大势所趋,积重难返。最后,只想说,伟大的事物往往不是被别人击溃的,而是自取败亡。
参考链接:
https://analyticsindiamag.com/kubernetes-parting-ways-with-docker-what-does-it-really-mean/
https://analyticsindiamag.com/kubernetes-docker-container-orchestration-race/
1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里
我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss
我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目
我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了
开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建
测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境 转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境 随着微服务化的进
1.现象服务重启后,通过dockerstart方式无法启动实例,报出错误:Errorresponsefromdaemon:errorcreatingoverlaymountto/var/lib/docker/overlay2/xxx/merged:nosuchfileordirectorydockersave导出镜像也报出2.网上各种尝试摸索无效果修改daemon.json中的storage-driver为overlay,重启无效果。禁用selinux,临时或永久方式都无效果。修改/etc/docker/daemon.json中的storage-driver为overlay2,无效果。修改/l
homeassistant久仰大名,据说可以一统各大物联网平台的设备,家里各平台的设备都有一点,控制起来很不方便,于是乎我也来尝尝~homeassistant官网https://www.home-assistant.io/HACShttps://github.com/hacs/integration准备1.Linux系统(Window)其实也类似2.安装好dockerdocker安装homeassistant官方有几个版本可供选择,安装方式可以:直接刷HA的系统,也可以用Docker安装,还可以直接安装在物理机上,具体区别如下:我采用的是Docker进行安装,也就是Container,从上图也
文章目录前言一、迁移步骤前言Docker安装的东西多了或者目录分配大小未提前规划好,就容易出现磁盘空间不足的问题,可以采用软链接的方式迁移数据目录空间。一、迁移步骤要使用软连接的方式修改Docker数据存储目录,需要执行以下步骤:1、使用systemctlstopdocker命令停止Docker服务;2、创建文件夹:mkdir/home/docker(/home/docker为新磁盘目录名);3、移动/var/lib/docker/目录到新目录中:mv/var/lib/docker/*/home/docker;4、使用rm-rf/var/lib/docker命令删除原有的Docker数据目录;
一、Docker介绍Docker中⽂社区⽂档:https://www.docker.org.cn/index.html Docker是⼀个开源的软件部署解决⽅案。 Docker也是轻量级的应⽤容器框架。 Docker可以打包、发布、运⾏任何的应⽤。 Docker就像⼀个盒⼦,⾥⾯可以装很多物件,如果需要某些物件,可以直接将该盒⼦拿⾛,⽽不需要从该盒⼦中⼀件⼀件的取。 Docker是⼀个客户端-服务端(C/S)架构程序。客户端只需要向服务端发出请求,服务端处理完请求后会返回结果。Docker包括三个基本概念:镜像(Image) Docker的镜像概念类似于虚拟机⾥的镜像,是⼀个只读的