你需要的 Docker 知识点都在这里了。
1、写在开头
Docker 的操作围绕镜像、容器、仓库三大核心概念。
下面我们通过围绕四个问题:
1、容器是什么;
2、容器与虚拟机的区别;
3、Namespace 技术是什么;
4、Docker 的三个核心概念是什么;
来入门掌握 Docker。
2、容器是什么?
容器:在 Linux 中,容器技术是一种进程隔离的技术,应用可以运行在一个个相互隔离的容器中,与虚拟机相同的是,可以为这些容器设置计算资源限制,挂载存储,连接网络,而与虚拟机不同的是,这些应用运行时共用着一个 Kernel。(我们在操作系统中的各项工作其实都是通过某个 PID 来达成的,包括常用对的 bash 环境)
Docker:由于 docker 非常的火,很多人一开始把 docker 等同于容器。Docker 实际上是一家公司,在 2013 年这家公司还叫做 DotCloud。
Docker 是他们公司的一个容器管理产品, 2013 年初,dotCloud 决定将 Docker 开源,Docker 在短短几个月间风靡全球, DotCloud 公司随后也把自己更名为 Docker。
3、容器与虚拟机区别是什么?
Docker 是基于 Linux 内核的 Namespace 技术实现资源隔离的,所有的容器都共享主机的内核。其实这与以虚拟机为代表的云计算时代还是有很多区别的,比如虚拟机有着更好的隔离性和安全性,而容器的隔离性和安全性则相对较弱。
从上图可以看出,虚拟机是通过管理系统(Hypervisor)模拟出 CPU、内存、网络等硬件,然后在这些模拟的硬件上创建客户内核和操作系统。这样做的好处就是虚拟机有自己的内核和操作系统,并且硬件都是通过虚拟机管理系统模拟出来的,用户程序无法直接使用到主机的操作系统和硬件资源,因此虚拟机也对隔离性和安全性有着更好的保证。
而 Docker 容器则是通过 Linux 内核的 Namespace 技术实现了文件系统、进程、设备以及网络的隔离,然后再通过 Cgroups 对 CPU、 内存等资源进行限制,最终实现了容器之间相互不受影响,由于容器的隔离性仅仅依靠内核来提供,因此容器的隔离性也远弱于虚拟机。
Q1:既然虚拟机安全性这么好,为什么我们还要用容器呢?
A1:这是因为容器与虚拟机相比,容器的性能损耗非常小,并且镜像也非常小,而且在业务快速开发和迭代的今天,容器秒级的启动等特性也非常匹配业务快速迭代的业务场景。
4、Namespace 技术是什么?
Namespace 是 Linux 内核用来隔离内核资源的方式,是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux 内核的 namespace 特性为我们提供了以下资源的隔离能力:
Linux 在很早的版本中就实现了部分的 namespace,比如内核 2.4 就实现了 mount namespace。大多数的 namespace 支持是在内核 2.6 中完成的,比如 IPC、Network、PID、和 UTS。还有个别的 namespace 比较特殊,比如 User,从内核 2.6 就开始实现了,但在内核 3.8 中才宣布完成。同时,随着 Linux 自身的发展以及容器技术持续发展带来的需求,也会有新的 namespace 被支持,比如在内核 4.6 中就添加了 Cgroup namespace。
我们在 Linux 中输入指令:
这些 namespace 文件都是链接文件。链接文件的内容的格式为 xxx:[inode number]。其中的 xxx 为 namespace 的类型,inode number 则用来标识一个 namespace,我们也可以把它理解为 namespace 的 ID。
5、仓库、镜像、容器是什么?
镜像、容器、仓库,三者之间的联系:
镜像: 镜像是什么呢?通俗地讲,它是 一个只读的文件和文件夹组合 。它包含了容器运行时所需要的所有基础文件和配置信息,是容器启动的基础。所以你想启动一个容器,那首先必须要有一个镜像。镜像是 Docker 容器启动的先决条件。
容器: 容器是镜像的运行实体 。镜像是静态的只读文件,而容器带有运行时需要的可写文件层,并且容器中的进程属于运行状态。 即容器运行着真正的应用进程,容器有初建、运行、停止、暂停和 删除五种状态。
仓库: Docker 的镜像仓库类似于代码仓库,用来存储和分发 Docker 镜像。 镜像仓库分为公共镜像仓库和私有镜像仓库 。
6、Docker 架构
Docker 整体架构采用 C/S(客户端 / 服务器)模式,主要由客户端和服务端两大部分组成。客户端负责发送操作指令,服务端负责接收和处理指令。
Docker 客户端和服务端通信有多种方式,既可以在同一台机器上通过 UNIX 套接字通信,也可以通过网络连接远程通信。
Docker 客户端
Docker 客户端其实是一种泛称。其中 docker 命令是 Docker 用户与 Docker 服务端交互的主要方式。
除了使用 docker 命令的方式,还可以使用直接请求 REST API 的方式与 Docker 服务端交互,甚至还可以使用各种语言的 SDK 与 Docker 服务端交互。
Docker 服务端
Docker 服务端是 Docker 所有后台服务的统称。其中 dockerd 是一个非常重要的后台管理进程,它负责响应和处理来自 Docker 客户端的请求,然后将客户端的请求转化为 Docker 的具体操作。
Docker 服务端的两个至关重要的组件:runC 和 containerd。
runC 是 Docker 官方按照 OCI 容器运行时标准的一个实现。通俗地讲,runC 是一个用来运行容器的轻量级工具,是真正用来运行容器的。
containerd 是 Docker 服务端的一个核心组件,它是从 dockerd 中剥离出来的 ,它的诞生完全遵循 OCI 标准,是容器标准化后的产物。containerd 通过 containerd-shim 启动并管理 runC,可以说 containerd 真正管理了容器的生命周期。
7、总结
纸上得来终觉浅,后续我们将会通过实操,深入了解 Docker 容器的基本操作,搭建我们自己的仓库,监控并允许我们的容器。Good Luck!
8、延伸阅读
《源码系列》
《经典书籍》
《Java并发编程实战:第2章 影响线程安全性的原子性和加锁机制》
《Java并发编程实战:第3章 助于线程安全的三剑客:final & volatile & 线程封闭》
《服务端技术栈》
《算法系列》
《设计模式》
版权声明: 本文为 InfoQ 作者【后台技术汇】的原创文章。
原文链接:【http://xie.infoq.cn/article/ba89764f2d51a549e589c311a】。文章转载请联系作者。
评论