Docker 的操作围绕镜像、容器、仓库三大核心概念。下面我们通过解决三个问题:1、容器是什么;2、容器与虚拟机的区别;3、Docker 的三个核心概念是什么,掌握Docker入门技术。
容器:在Linux中,容器技术是一种进程隔离的技术,应用可以运行在一个个相互隔离的容器中,与虚拟机相同的是,可以为这些容器设置计算资源限制,挂载存储,连接网络,而与虚拟机不同的是,这些应用运行时共用着一个Kernel。(我们在操作系统中的各项工作其实都是通过某个PID来达成的,包括常用对的bash环境)
Docker:由于docker非常的火,很多人一开始把docker等同于容器。Docker实际上是一家公司,在2013年这家公司还叫做DotCloud。Docker是他们公司的一个容器管理产品, 2013年初,dotCloud决定将Docker开源,Docker在短短几个月间风靡全球, DotCloud公司随后也把自己更名为Docker。
Docker 是基于 Linux 内核的 Namespace 技术实现资源隔离的,所有的容器都共享主机的内核。其实这与以虚拟机为代表的云计算时代还是有很多区别的,比如虚拟机有着更好的隔离性和安全性,而容器的隔离性和安全性则相对较弱。
从上图可以看出,虚拟机是通过管理系统(Hypervisor)模拟出 CPU、内存、网络等硬件,然后在这些模拟的硬件上创建客户内核和操作系统。这样做的好处就是虚拟机有自己的内核和操作系统,并且硬件都是通过虚拟机管理系统模拟出来的,用户程序无法直接使用到主机的操作系统和硬件资源,因此虚拟机也对隔离性和安全性有着更好的保证。
而 Docker 容器则是通过 Linux 内核的 Namespace 技术实现了文件系统、进程、设备以及网络的隔离,然后再通过 Cgroups 对 CPU、 内存等资源进行限制,最终实现了容器之间相互不受影响,由于容器的隔离性仅仅依靠内核来提供,因此容器的隔离性也远弱于虚拟机。
Q1:既然虚拟机安全性这么好,为什么我们还要用容器呢?
A1:这是因为容器与虚拟机相比,容器的性能损耗非常小,并且镜像也非常小,而且在业务快速开发和迭代的今天,容器秒级的启动等特性也非常匹配业务快速迭代的业务场景。
Namespace 是 Linux 内核用来隔离内核资源的方式,是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程,对其他 namespace 中的进程没有影响。
具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux 内核的 namespace 特性为我们提供了以下资源的隔离能力:
我们在Linux中输入指令:
[root@localhost docker]# ll /proc/$$/ns
镜像、容器、仓库,三者之间的联系:
Docker 整体架构采用 C/S(客户端 / 服务器)模式,主要由客户端和服务端两大部分组成。客户端负责发送操作指令,服务端负责接收和处理指令。
Docker客户端和服务端通信有多种方式,既可以在同一台机器上通过UNIX套接字通信,也可以通过网络连接远程通信。
Docker 客户端其实是一种泛称。其中 docker 命令是 Docker 用户与 Docker 服务端交互的主要方式。
除了使用 docker 命令的方式,还可以使用直接请求 REST API 的方式与 Docker 服务端交互,甚至还可以使用各种语言的 SDK 与 Docker 服务端交互。
Docker 服务端是 Docker 所有后台服务的统称。其中 dockerd 是一个非常重要的后台管理进程,它负责响应和处理来自 Docker 客户端的请求,然后将客户端的请求转化为 Docker 的具体操作。
Docker服务端的两个至关重要的组件:runC和containerd。
纸上得来终觉浅,后续我们将会通过实操,深入了解Docker容器的基本操作,搭建我们自己的仓库,监控并允许我们的容器。Good Luck!
—END—