Docker的理解
- Docker
- 为什么用Docker?
- 1.提升系统资源利用率
- 2.更快速的交付和部署
- 3.高效的部署和扩容
- 4.更简单的管理
- Docker核心技术
- Docker镜像
- Docker容器
- Docker仓库
- Docker实现原理
- Linux Namespace
- Cgroup
- Union FS
- Docker的应用场景
- 1.微服务架构
- 2.持续集成
- 3.快速部署和伸缩
- 4.环境部署
Docker
Docker是容器的一种,容器指的是:一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。
容器技术本质上是:对计算机资源的隔离与控制,可以理解为一种沙盒技术,沙盒就像集装箱一样。
Docker是一个开源的容器引擎,是容器概念的落地实现,诞生于2013年初,最初是dotCloud公司内部的一个业余项目。
为什么用Docker?
作为一种新型的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。
Docker在如下几个方面具有较大的优势:
1.提升系统资源利用率
Docker容器是一种轻量级的虚拟化技术,目的和虚拟机一样,都是为了创造"隔离环境",但是它不像VM采用操作系统级的资源隔离,容器采用的是进程级的系统隔离。
比较上面两张图,我们发现虚拟机是携带操作系统,本身很小的应用程序却因为携带了操作系统而变得非常大,很笨重。
Docker是不携带操作系统的,所以Docker的应用就非常的轻巧,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Docker容器。
2.更快速的交付和部署
Docker容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
3.高效的部署和扩容
Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。
这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
4.更简单的管理
使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所以的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
Docker核心技术
Docker技术的三大核心概念分别是:Docker镜像、Docker容器、Docker仓库。掌握这三个组件的概念有助于我们进一步了解Docker的工作原理。
三个组件的关系
下图是三者之间的关系:
这三个组件组成了Docker的整个生命周期。
Docker镜像
Docker镜像是一种轻量级可执行的独立软件包,Docker镜像提供容器运行时所需的程序、库、资源、配置等文件,组成了Docker容器的静态文件系统运行环境。
简单的理解为:Docker镜像是Docker容器的静态视角,Docker镜像是启动Docker容器的基础。
我们可以使用docker images来列出本地主机上的Dokcer镜像:
docker images
示例:
[root@Master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jdk8 v2.0 a24a58951a04 16 months ago 433MB
nginx 1.22 08a1cbf9c69e 20 months ago 142MB
rancher/rancher v2.6.5 f944ac578a0e 2 years ago 1.47GB
rancher/rancher v2.5-head c1aff654545a 2 years ago 1.07GB
tomcat 8 2d2bccf89f53 2 years ago 678MB
mysql 5.7 c20987f18b13 2 years ago 448MB
alpine latest c059bfaa849c 2 years ago 5.59MB
centos 7 eeb6ee3f44bd 2 years ago 204MB
alpine 3.10 e7b300aee9f9 3 years ago 5.58MB
参数介绍:
- REPOSITORY: 表示镜像的仓库源;
- TAG: 镜像的标签;
- IMAGE ID: 镜像ID;
- CREATED: 镜像创建时间;
- SIZE: 镜像大小;
Docker容器
容器就是一个存放东西的地方,就像书包可以装各种文具、衣柜可以放各种衣服、鞋架可以放各种鞋子一样.
我们现在所说的容器存放的东西,更偏向于应用比如:网站、程序甚至是系统环境.
容器技术本质上是: 对计算机资源的隔离与控制,可以理解为一种沙盒技术,沙盒就像集装箱一样.
Docker是容器的一种,除此之外: 还有其他容器, 比如: CoreOs的rkt, Docker是一个开源的容器引擎.
Docker仓库
Docker仓库, 英文名Repository, 就是集中存放Docker镜像的地方.
Docker官方维护了一个公共仓库: https://hub.docker.com , 这里提供了可以满足大部分需求的Docker镜像(从2024年开始这个仓库闭源了)。
除了Docker官方提供了Docker Hub的镜像服务, 国内一些云服务商也提供类似于Docker Hub的公开服务。
比如: 阿里云、腾讯云、网易云、DaoCloul等镜像服务,这些镜像服务被成为加速器。
我们可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器。
比如使用阿里云,配置如下:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://registry.docker-cn.com","https://s3d6l2fh.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
Docker实现原理
Docker容器的实现原理就是通过Namespace命名空间实现进程隔离、UnionFileSystem联合文件系统实现文件系统隔离、ControlGroups控制组实现资源隔离。
Docker利用Linux中的核心分离机制, 例如Cgroups,以及Linux的核心Namespace(命名空间)来创建独立的容器。
一句话概括起来Docker就是利用Namespace做资源隔离,用Cgroup做资源限制,利用Union FS做容器文件系统的轻量级虚拟化技术。
Linux Namespace
Linux Namespace, 即Linux命名空间,是Linux内核Kernel提供的功能,它可以隔离一系列的系统资源,如 进程ID、User ID、Network、文件系统等。
Docker利用Linux Namespace功能,实现多个Docker容器相互隔离, 实现进程隔离。
Cgroup
Cgroup, 全称Linux Control Groups, 可以对一组进程及这些进程的子进程进行资源限制。
比如: 包括 CPU、内存、存储、网络、设备访问权限等, 通过Cgroups可以很轻松的限制某个进程的资源占用并且统计该进程的实时使用情况。
Docker容器就是: 通过Cgroups控制组实现资源隔离的。
Cgroups由3个组件构成: 分别是 cgroup(控制组)、subsystem(子系统)、以及hierarchy(层级树), 3者相互协同作用。
- cgroup是对进程分组管理的一种机制, 一个cgroup通常包含一组(多个)进程, Cgroups中的资源控制都以cgroup为单位实现。
- subsystem是一组(多个)资源控制的模块, 每个subsystem会管理到某个cgroup上, 对该cgroup中的进程做出相应的限制和控制。
- hierarchy会将一组(多个)cgroup构建成一个树状结构, Cgroups可以利用该结构实现继承等功能。
Union FS
Docker容器是通过UnionFileSystem(Union FS)联合文件系统实现文件系统隔离。
我们都知道Docker镜像是一种分层结构, 每一层构建在其它层之上, 从而实现增量增加内容的功能, 这是如何实现的?
要理解这个问题, 首先需要理解 Union File System (简称: UnionFS), 它是为Linux系统设计的将其它文件系统联合到一个联合挂载点的文件系统服务。UnionFS使用branch(分子)将不同文件系统的文件和目录透明叠加覆盖, 形成一个单一一致的文件系统, 此外UnionFS使用写时复制(Copy on Write,简称, CoW)技术来提高合并后文件系统的资源利用。
Docker使用的第一种存储驱动为AUFS(Advanced Multi-layered unification filesystem), AUFS完全重写了早期的UnionFS,目的是提高其性能与可靠性,此外还引入了如branch负载均衡等新功能。
与UnionFS类似, AUFS可以在基础的文件系统上增量的增加新的文件系统,通过叠加覆盖的形式最终形成一个文件系统。通过AUFS最上层是可读可写层, 而其它层只是只读层,每一层都只是一个普通的文件系统。
Docker镜像分层、增量增加等功能正是通过利用AUFS的分层文件系统结构、增量增加等功能实现, 这也导致了运行Docker容器如果没有指定volume(数据卷)或bind mount, 则Docker容器结束后,运行时产生的数据便丢失了。
Docker的应用场景
1.微服务架构
Docker容器适用于构建和管理微服务应用程序, 每个微服务可以在自己的容器中运行, 独立进行扩展和更新, 而不影响整个应用程序。
2.持续集成
Docker可以与CI/CD工具集成, 使得构建、测试和部署流程更加灵活和可靠, 容器可以在各个阶段轻松部署, 确保环境一致性。
3.快速部署和伸缩
Docker容器可以在几秒钟内启动, 因此可以更快速部署和扩展应用程序。
4.环境部署
Docker可以确保测试环境和生产环境的一致性, 从而减少由于环境差异而引起的问题, 这个功能是Docker流行的非常重要的原因, 就是开发环境与线上环境一致。