第一次见Docker,原来你是这样的!

一、Docker的前世今生

2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫 dotCloud 的公司。dotCloud 的平台即服务(Platform-as-a-Service, PaaS)提供商。底层技术上,dotCloud 平台利用了Linux 的LXC容器技术。
在这里插入图片描述

为了方便创建和管理这些容器,dotCloud 基于Google公司推出的Go语言开发了一套内部工具,之后被命名为Docker 。Docker就是这样诞生的。
如同Docker的Logo一样, Docker 的思想来源于集装箱。集装箱解决了什么问题?在一艘大船上,可以把货物规整的摆放起来,并且各种各样的货物被集装箱标准化,集装箱与集装箱之间互不影响。那么就不需要专门运送水果的船和专]运送化学用品的船了。只要这些货物封装在不同的集装箱里,就可以用一艘大船把它们都运走。
Docker技术诞生之后,并没有引起行业的关注。而dotCloud公司,作为一家小型创业企业,在激烈的竞争之下,也步履维艰。
正当他们快要坚持不下去的时候,脑子里蹦出了“开源”的想法。什么是“开源”?开源,就是开放源代码。也就是将原来内部保密的程序源代码开放给所有人,然后让大家一起参与进来,贡献代码和意见。
有的软件一开始就是开源的。也有的软件是混不下去,创造者又不想放弃,所以选择开源。自己养不活,就吃“百家饭”嘛。
2013年3月,dotCloud 公司的创始人之一, Docker之父, 28 岁的Solomon Hykes 正式决定,将Docker项目开源。
在这里插入图片描述
不开则已,一开惊人。越来越多的IT工程师发现了Docker的优点,然后蜂拥而至,加入Docker开源社区。Docker 的人气迅速攀升,速度之快,令人瞠目结舌。
开源当月,Docker0.1 版本发布。此后的每一个月, Docker 都会发布一个版本。到2014年6月9日,Docker 1.0版本正式发布。
此时的Docker,已经成为行业里人气最火爆的开源技术,没有之一。甚至像Google、微软、Amazon、 VMware 这样的巨头们都对它青睐有加,表示将全力支持。
Docker火了之后,dotCloud 公司干脆把公司名字也改成了Docker Inc

二、为什么选择 Docker

1、更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

2、更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而Docker容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大的节约了开发、测试、部署的时间。

3、一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些bug并未在开发过程中被发现。而Docker的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现上述问题。

4、持续交付和部署
对开发和运维(DevOps) 人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用Docker可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过Dockerfile来进行镜像构建,并结合持续集成(Continuous Integration)系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合持续部署(Continuous Delivery/Deployment)系统进行自动部署。
而且使用Dockerfile使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的在生产环境中部署该镜像。

5、更轻松的迁移
由于Docker确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。 因此用户可以很轻易的将在一个平台 上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

6、更轻松的维护和扩展
Docker使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。 此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制, 大大的降低了应用服务的镜像制作成本。

三、容器与传统虚拟机之间的比较

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。
在这里插入图片描述
与传统的虚拟机相比,Docker 优势体现为启动速度快、占用体积小。
在这里插入图片描述

扫描二维码关注公众号,回复: 12783540 查看本文章

四、Docker 组成

通过下图可以得知,Docker 在运行时分为 Docker 引擎(服务端守护进程)和 客户端工具,我们日常使用的各种 Docker 命令,其实就是在使用 客户端工具 与 Docker 引擎进行交互。
在这里插入图片描述
registry:仓库也叫注册中心(可以是公共的也可以是私有的)
docker_host:docker主机也叫docker引擎
client:客户端也叫宿主机

1、 Client客户端
Docker是一个客户端服务器(C/S) 架构程序。Docker 客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker 提供了一个命令行工具Docker以吸一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

2、Host主机 (Docker引擎
一个物理或者虚拟的机器用于执行Docker守护进程和容器。

3、Image镜像
什么是Docker镜像?简单的理解,Docker 镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。
通过镜像启动一个容器,一个镜像就是一个可执行的包, 其中包括运行应用程序所需要的所有内容:包含代码,运行时间,库,环境变量和配置文件等。
Docker把APR文件打包成为一个镜像,并且采用类似多次快照的存储技术,可以实现:
● 多个APR可以共用相同的底层镜像(初始的操作系统镜像) ;
● App运行时的10操作和镜像文件隔离;
● 通过挂载包含不同配置/数据文件的目录或者卷(Volume) ,单个ApR镜像可以用来运行无数个不同业务的容器。

4、Container容器
镜像(Image)和容器(Container) 的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。.

Docker 面向对象
镜像
容器 对象

5、镜像分层
Docker支持通过扩展现有镜像,创建新的镜像。实际上,Docker Hub中99%的镜像都是通过在base镜像中安装和配置需要的软件构建出来的。
在这里插入图片描述

从上图可以看到,新镜像是从base镜像一层一层叠加生成的。每安装一个软件, 就在现有镜像的基础上增加一层。
镜像分层最大的一个好处就是共享资源。比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host只需在磁盘上保存一份base镜像;同时内存中也只需加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如/etc下的文件,这时其他容器的/etc是不会被修改的,修改只会被限制在单个容器内。这就是容器Copy-on-Write特性。

6、Volume数据卷
实际上我们的容器就好像是一个简易版的操作系统,只不过系统中只安装了我们的程序运行所需要的环境,前边说到我们的容器是可以删除的,那如果删除了,容器中的程序产生的需要持久化的数据怎么办呢?容器运行的时候我们可以进容器去查看,容器一旦删除就什么都没有了。
所以数据卷就是来解决这个问题的,是用来将数据持久化到我们宿主机上,与容器间实现数据共字,简单的说就是将宿主机的目录映射到容器中的目录,应用程序在容器中的目录读写数据会同步到宿主机上,这样容器产“生的数据就可以持久化了,比如我们的数据库容器,就可以把数据存储到我们宿主机上的真实磁盘中。

7、Registry注册中心
Docker用Registry来保存用户构建的镜像。Registry 分为公共和私有两种。Docker 公司运营公共的Registry叫做Docker Hub。
用户可以在Docker Hub注册账号,分享并保存自己的镜像。
Docker公司提供了公共的镜像仓库https://hub.docker.com (Docker 称之为Repository)提供了庞大的镜像集合供使用。
一个Docker Registry中可以包含多个仓库(Repository) ;每个仓库可以包含多个标签(Tag) ;每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像, 而标签对应该软件的各个版本。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest 作为默认标签。

猜你喜欢

转载自blog.csdn.net/Gengchenchen/article/details/115009645