引言
如今 Docker 的使用已经非常普遍,特别是在一线互联网公司。使用 Docker 技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力。在云服务概念兴起之后,Docker 的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker 的完美组合,更加方便微服务架构运维部署落地。
一、Docker 概述
1. 什么是Docker?
Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动 开放容器联盟(OCI)。
-
Docker 是世界领先的软件容器平台。开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。
-
Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。
总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。
2. 为什么用 Docker
容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
-
更快速的交付和部署
对开发和运维人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。 -
更高效的虚拟化
Docker 容器的运行不需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。 -
更轻松的迁移和扩展
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。 -
更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
3. Docker VS 虚拟机
-
VM 是一个运行在宿主机之上的完整的操作系统,VM 运行自身操作系统会占用较多的 CPU、内存、硬盘资源。
-
Docker 不同于 VM,只包含应用程序以及依赖库,基于 libcontainer 运行在宿主机上,并处于一个隔离的环境中,这使得 Docker 更加轻量高效,启动容器只需几秒钟之内完成。由于 Docker 轻量、资源占用少,使得Docker可以轻易的应用到构建标准化的应用中。
-
但 Docker 目前还不够完善,比如隔离效果不如 VM,共享宿主机操作系统的一些基础库等;网络配置功能相对简单,主要以桥接方式为主;查看日志也不够方便灵活。
-
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。
-
作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多;Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。
不同点 | container | VM |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生,直接在内核中运行10%~20% | 50%左右损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别,更加彻底 |
操作系统 | 主要支持Linux | 几乎所有 |
封装程度 | 只封装目标代码和依赖关系,共享宿主机内核 | 完整的操作系统,与宿主机隔离 |
4. Docker 应用场景
- 打包应用程序简单部署
- 可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从腾讯云迁移到阿里云
- 持续集成和持续交付(CI/CD):开发到测试发布
- 部署微服务
- 提供 PAAS 产品(平台即服务)
OpenStack的云主机类似于阿里云的 ECS,属于IAAS;Docker (K8S) 属于PAAS
5. Docker 引擎
Docker Engine 是具有以下主要组件的 C/S 客户端—服务器应用程序
- server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)
- CLIENT端:REST API,它指定程序可以用来与守护程序进行通信并指示其操作的接口
通过client客户端传入命令
docker run:运行
docker start:开启
docker rm:删除
与sever端进行交互,控制server端进行应命令的操作
6. Docker 三大组件
-
镜像(Image)
Docker 镜像是创建容器的基础,类似于虚拟机的快照,可以理解为是一个面向 Docker 容器引擎的只读模板 -
容器(Docker container)
Docker 的容器是从镜像创建的运行时状态,它可以被启动、停止和删除,容器即服务;
创建的每一个容器都是相互隔离、互不可见的,相互之间隔离性超强,从而保证平台的安全性;
可以把容器看做是一个简易版本的 Linux 环境,Docker 可以利用容器来运行和隔离一个个应用 -
仓库(Docker reqistry)
Docker 仓库是用来集中保存镜像的地方,创建完自己的镜像后,可以使用push
命令将其上传至公共仓库(public)
或私有仓库(Private)
,之后在另一台机器上需要使用这个镜像,直接pull
下来就可以了;
仓库注册服务器Registry
是存放仓库的地方,其中包含了多个仓库,每个仓库存放某一类镜像,并使用不同的标签tag
来区分它们
目前最大的公共仓库是
Docker Hub
7. 名称空间(Namespaces)
Docker 使用一种称为 namespaces 提供容器的隔离工作区的技术,运行容器时,Docker 会为该容器创建一组名称空间,这些名称空间提供了一层隔离,容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间
docker 引擎对内核版本是有要求的,至少要求3.8+,因为docker 需要cgroups 的资源管理功能
-
容器完美的实现了6个名称空间隔离 (namespace资源隔离—用容器化技术封装)
mount:文件系统,挂载点
user:操作进程的用户和用户组
pid:进程编号
uts:主机名和主机域
ipc:信号量、消息队列,共享内存(理解,不同的应用调用的时候应该使用不同的内存空间)
net:网络设备、网络协议栈、端口等 -
控制组(Control groups):资源管理功能,将应用程序限制为一组特定的资源
控制组允许 Docker Engine 将可用的硬件资源共享给容器,并有选择地实施限制和约束