Docker 容器实战 (一) : 封神 Server 端技术

本文涉及的产品
函数计算FC,每月15万CU 3个月
性能测试 PTS,5000VUM额度
应用实时监控服务-应用监控,每月50GB免费额度
简介: 回溯历史源头相比于盛极一时的 AWSOpenStack 以 Cloud Foundry 为代表的 PaaS 项目,却成了当时云计算技术中的一股清流。Cloud Foundry项目已经基本度过了最艰难的概念普及和用户教育阶段,开启了以开源PaaS为核心构建平台层服务能力的变革。本文将给大家详细讲解 Docker 的 Server 端技术。

原文作者:javaedge
原文链接
更多云原生技术资讯可关注阿里巴巴云原生技术圈

容器!容器!

回溯历史源头
相比于盛极一时的

  • AWS
    1.png
  • OpenStack
    2.png
  • 以Cloud Foundry为代表的PaaS项目,却成了当时云计算技术中的一股清流
    3.png

Cloud Foundry项目已经基本度过了最艰难的概念普及和用户教育阶段,开启了以开源PaaS为核心构建平台层服务能力的变革
只是,后来一个叫 Docker 的开源项目横空出世
当时还名叫dotCloudDocker公司,也是PaaS热潮中的一员
4.png
相比于Heroku、Pivotal、Red Hat等PaaS新宠,dotCloud微不足道,主打产品跟主流的Cloud Foundry社区脱节,门可罗雀!
dotCloud公司突然决定:开源自己的容器项目 Docker!!!
显然,这个决定在当时根本没人在乎。
“容器”这个概念从来就不是什么新鲜的东西,也不是Docker公司发明的。
即使在当时最热门的PaaS项目Cloud Foundry中,容器也只是其最底层、最没人关注的那一部分。
PaaS项目被大家接纳的一个主要原因是它提供“应用托管”能力
那时主流用户的普遍用法,就是租一批AWS或者OpenStack的虚拟机,然后像以前管理物理服务器那样,用脚本或者手工的方式在这些机器上部署应用。
当然,部署过程难免碰到云端虚拟机和本地环境不一致问题,当时的云计算服务,比的就是谁能更好模拟本地服务器环境,带来更好“上云”体验。
而PaaS开源项目的出现,就是当时解决这个问题的一个最佳方案。
虚拟机创建后,运维只需在这些机器上部署一个Cloud Foundry项目
然后开发者只要执行一条命令就能把本地的应用部署到云上

cf push "My APP"

Cloud Foundry这样的PaaS项目,最核心的组件就是应用的打包和分发机制
Cloud Foundry为每种主流编程语言都定义了一种打包格式,“cf push”等同于用户把应用的可执行文件和启动脚本打进一个压缩包内,上传到云上Cloud Foundry的存储中。
接着,Cloud Foundry会通过调度器选择一个可以运行这个应用的虚拟机
然后通知这个机器上的Agent把应用压缩包下载下来启动。
由于需要在一个虚拟机上启动很多个来自不同用户的应用,Cloud Foundry会调用操作系统的Cgroups和Namespace机制为每一个应用单独创建一个称作“沙盒”的隔离环境,然后在“沙盒”中启动这些应用进程
这样就实现了把多个用户的应用互不干涉地在虚拟机里批量地、自动地运行起来的目的。
这就是PaaS项目最核心的能力
这些Cloud Foundry用来运行应用的隔离环境,或者说“沙盒”,就是所谓的“容器”。
而Docker项目,实际上跟Cloud Foundry的容器并没有太大不同,所以在它发布后不久,Cloud Foundry的首席产品经理James Bayer就在社区里做了一次详细对比,告诉用户Docker实际上只是一个同样使用Cgroups和Namespace实现的“沙盒”而已,没有什么特别的黑科技,也不需要特别关注。
Docker项目迅速崛起。如此之快,以至于Cloud Foundry以及所有的PaaS社区还没来得及成为它的竞争对手,就直接出局
Docker项目确实与Cloud Foundry的容器在大部分功能和实现原理上都是一样的,可偏偏就是这剩下的一小部分不一样的功能,成了Docker项目接下来“呼风唤雨”的不二法宝。

Docker镜像

恐怕连Docker项目作者都没想到,这个小小的创新,在短短几年内就如此迅速地改变了整个云计算领域的发展历程。
PaaS之所以能够帮助用户大规模部署应用到集群里,是因为提供了一套应用打包的功能。偏偏打包功能,成了PaaS日后不断遭到用户诟病的一个“软肋”。
一旦用上了PaaS,用户就必须为每种语言、每种框架,甚至每个版本的应用维护一个打好的包。
这个打包过程,没有任何章法可循,更麻烦的是,明明在本地运行得好好的应用,却需要做很多修改和配置工作才能在PaaS里运行起来。而这些修改和配置,并没有什么经验可以借鉴,基本上得靠不断试错,直到你摸清楚了本地应用和远端PaaS匹配的“脾气”才能够搞定。
最后结局就是,“cf push”确实是能一键部署了,但是为了实现这个一键部署,用户为每个应用打包的工作可谓一波三折,费尽心机。
Docker镜像解决的,恰恰就是打包这个根本性的问题
Docker镜像,其实就是一个压缩包。但是这个压缩包里的内容,比PaaS的应用可执行文件+启停脚本的组合就要丰富多了
大多数Docker镜像是直接由一个完整操作系统的所有文件和目录构成的,所以这个压缩包里的内容跟你本地开发和测试环境用的操作系统是一样的。
假设你的应用在本地运行时,能看见的环境是CentOS 7.2操作系统的所有文件和目录,那么只要用CentOS 7.2的ISO做一个压缩包,再把你的应用可执行文件也压缩进去,那么无论在哪里解压这个压缩包,都可以得到与你本地测试时一样的环境。当然,你的应用也在里面!!!
这就是Docker镜像最厉害的地方:只要有这个压缩包在手,你就可以使用某种技术创建一个“沙盒”,在“沙盒”中解压这个压缩包,然后就可以运行你的程序了。
更重要的是,这个压缩包包含了完整的操作系统文件和目录,也就是包含了这个应用运行所需要的所有依赖,所以你可以先用这个压缩包在本地进行开发和测试,完成之后,再把这个压缩包上传到云端运行。在这个过程中,你完全不需要进行任何配置或者修改,因为这个压缩包赋予了你一种极其宝贵的能力:本地环境和云端环境的一致!
这是Docker镜像的精髓。
有了Docker镜像,PaaS里最核心的打包系统一下子就没了用武之地,最让用户抓狂的打包过程也随之消失了。
相比之下,在当今的互联网里,Docker镜像需要的操作系统文件和目录,可谓唾手可得。
所以,你只需要提供一个下载好的操作系统文件与目录,然后使用它制作一个压缩包即可,这个命令就是:

docker build "我的镜像"

一旦镜像制作完成,用户就可以让Docker创建一个“沙盒”来解压这个镜像,然后在“沙盒”中运行自己的应用,这个命令就是:

docker run "我的镜像"

当然,docker run创建的“沙盒”,也是使用Cgroups和Namespace机制创建出来的隔离环境
Docker提供了一种非常便利的打包机制。直接打包了应用运行所需要的整个操作系统,保证了本地环境和云端环境的高度一致,避免了用户通过“试错”来匹配两种不同运行环境之间差异的痛苦过程。
不过,Docker项目固然解决了应用打包的难题,但正如前面所介绍的那样,它并不能代替PaaS完成大规模部署应用的职责。
遗憾的是,考虑到Docker公司是一个与自己有潜在竞争关系的商业实体,再加上对Docker项目普及程度的错误判断,Cloud Foundry项目并没有第一时间使用Docker作为自己的核心依赖,去替换自己那套饱受诟病的打包流程。
反倒是一些机敏的创业公司,纷纷在第一时间推出了Docker容器集群管理的开源项目(比如Deis和Flynn),它们一般称自己为CaaS,即Container-as-a-Service,用来跟“过时”的PaaS们划清界限。
而在2014年底的DockerCon上,Docker公司雄心勃勃地对外发布了自家研发的“Docker原生”容器集群管理项目Swarm,不仅将这波“CaaS”热推向了一个前所未有的高潮,更是寄托了整个Docker公司重新定义PaaS的宏伟愿望。
在2014年的这段巅峰岁月里,Docker公司离自己的理想真的只有一步之遥。

总结

2013~2014年,以Cloud Foundry为代表的PaaS项目,逐渐完成了教育用户和开拓市场的艰巨任务,也正是在这个将概念逐渐落地的过程中,应用“打包”困难这个问题,成了整个后端技术圈子的一块心病。
Docker项目的出现,则为这个根本性的问题提供了一个近乎完美的解决方案。这正是Docker项目刚刚开源不久,就能够带领一家原本默默无闻的PaaS创业公司脱颖而出,然后迅速占领了所有云计算领域头条的技术原因。
而在成为了基础设施领域近十年难得一见的技术明星之后,dotCloud公司则在2013年底大胆改名为Docker公司。不过,这个在当时就颇具争议的改名举动,也成为了日后容器技术圈风云变幻的一个关键伏笔。

参考

  • docker官网
  • Docker实战
  • 深入剖析Kubernetes

阿里巴巴云原生关注微服务、Serverless、容器、Service Mesh 等技术领域、聚焦云原生流行技术趋势、云原生大规模的落地实践,做最懂云原生开发者的技术圈。”

相关文章
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
282 93
|
7天前
|
安全 持续交付 云计算
课时5:阿里云容器服务:最原生的集成Docker和云服务
阿里云容器服务以服务化形式构建容器基础设施,大幅提升开发效率,简化应用部署流程。通过Docker容器和DevOps工具(如Jenkins),实现自动化部署与迭代,优化企业内部复杂部署问题。该服务支持GPU调度、混合云架构无缝迁移,并与阿里云产品体系无缝集成,提供安全防护、网络负载均衡等多重功能支持。凭借微服务架构,帮助企业突破业务瓶颈,提高资源利用率,轻松应对海量流量。
课时5:阿里云容器服务:最原生的集成Docker和云服务
|
27天前
|
网络协议 API Docker
Docker+consul容器服务的更新与发现
通过本文的介绍,我们详细探讨了如何结合Docker和Consul来实现容器服务的更新与发现。通过Consul的服务注册和发现功能,可以高效地管理和监控容器化服务,确保系统的高可用性和可扩展性。希望本文能帮助您在实际项目中更好地应用Docker和Consul,提高系统的可靠性和管理效率。
64 23
|
1月前
|
消息中间件 Linux 数据中心
Docker核心技术:Docker原理之Namespace
通过以上内容,您可以深入了解Docker中的Namespace机制及其在资源隔离中的应用,从而更好地理解和应用Docker技术。
79 25
|
27天前
|
Ubuntu API 网络虚拟化
ubuntu22 编译安装docker,和docker容器方式安装 deepseek
本脚本适用于Ubuntu 22.04,主要功能包括编译安装Docker和安装DeepSeek模型。首先通过Apt源配置安装Docker,确保网络稳定(建议使用VPN)。接着下载并配置Docker二进制文件,创建Docker用户组并设置守护进程。随后拉取Debian 12镜像,安装系统必备工具,配置Ollama模型管理器,并最终部署和运行DeepSeek模型,提供API接口进行交互测试。
335 15
|
2月前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
215 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
3月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
106 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
2月前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
76 17
|
2月前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
135 12
|
2月前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
308 11