Docker 入门基础(一)

首页 / 🐋Docker / 正文

docker

一、Docker 背景介绍🌹

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。Docker 项目后来还加入了 Linux 基金会,并成立推动开放容器联盟(OCI)。

Docker 使用 Google 公司推出的 Go 语言进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 OverlayFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 版本开始,则进一步演进为使用 runCcontainerd

img

runc 是一个 Linux 命令行工具,用于根据 OCI容器运行时规范 创建和运行容器。

containerd 是一个守护程序,它管理容器生命周期,提供了在一个节点上执行容器和管理镜像的最小功能集。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

img

二、容器与虚拟机 🍀

术语“容器”和“虚拟机”经常互换使用,然而,这往往是一种误解。但是,两者只是提供操作系统虚拟化的不同方法。

虚拟机 通常包括完整的操作系统、操作系统包,如果需要,还包括少量应用程序。这是通过为虚拟机提供硬件虚拟化的管理程序实现的。这允许单个服务器作为虚拟来宾运行许多独立的操作系统。一般来说,虚拟机是一个完全类似于计算机的系统。

容器 类似于虚拟机,只是容器不是完整的操作系统。容器通常只包含必要的操作系统包和应用程序。它们通常不包含完整的操作系统或硬件虚拟化,这就是它们“轻量级”的原因。容器通常用于隔离单个主机内正在运行的进程,以确保隔离的进程无法与同一系统内的其他进程交互。

结构对比

对比

性能对比

特性虚拟机容器
操作系统非常广泛Linux 为主
隔离策略HypervisorNamespace
启动时间分钟级毫秒级
资源损耗5-15%0-5%
镜像存储重量级 GB-TB轻量级 KB-MB
集群规模数百近万

三、Docker 核心组件 🌷

​ Docker 使用客户端-服务器架构。Docker客户端与 Docker 守护程序通信,Docker 守护程序侦听 Docker API 请求并管理 Docker 对象(如镜像、容器、网络和卷等),执行构建、运行和分发 Docker 容器的繁重工作。Docker 客户端和守护程序可以在同一个系统上运行,也可以将 Docker 客户端连接到远程 Docker 守护程序。Docker 客户端和守护程序使用 REST API 通过 UNIX 套接字或网络接口进行通信。另一个 Docker 客户端是 Docker Compose,它允许您使用由一组容器组成的应用程序。

Docker 架构图

(1)镜像(Image)

​ Docker镜像(Image)类似于虚拟机的镜像,可以将他理解为一个面向Docker引擎的只读模板,包含了文件系统。

​ 我们都知道,操作系统分为 内核用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:18.04 就包含了完整的一套 Ubuntu 18.04 最小系统的 root 文件系统。

​ 镜像是创建Docker容器的基础,通过版本管理和增量的文件系统,Docker提供了一套十分简单的机制来创建和更新现有的镜像。用户可以创建自己的镜像,也可以使用其他人创建并在 Docker 仓库发布的镜像。要构建自己的镜像,请使用简单的语法创建一个 Dockerfile,用于定义创建镜像并运行镜像所需的步骤。

​ Dockerfile 中的每个指令都会在镜像中创建一个层。当您更改 Dockerfile 并重新生成镜像时,只会重新生成已更改的那些层。与其他虚拟化技术相比,这是使镜像如此轻巧、小巧和快速的部分原因。

img

(2)容器(Container)

​ Docker容器(Container)类似于一个轻量级的沙箱子(因为Docker是基于Linux内核的虚拟技术,所以消耗资源十分少),Docker利用容器来运行和隔离应用。

​ 容器是镜像的可运行实例。您可以使用 Docker API 或 CLI 创建、启动、停止、移动或删除容器。可以将容器连接到一个或多个网络,将存储附加到该容器,甚至可以基于其当前状态创建新镜像。

​ 默认情况下,容器与其他容器及其主机相对隔离。您可以控制容器的网络、存储或其他底层子系统的隔离程度与其他容器或主机的隔离程度。

​ 容器由其镜像以及您在创建或启动容器时提供给它的任何配置选项定义。删除容器后,未存储在持久性存储中的对其状态所做的任何更改都将消失。

​ 容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间(namespace),具有隔离性。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间等。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全,从此再也不用担心本地多个应用需要不同版本的依赖导致的冲突问题了。

(3)仓库(Repository)

​ Docker 仓库(Repository)集中存放镜像文件的场所。

​ 有时候会看到有资料将Docker仓库和注册服务器(Registry)混为一谈,并不严格区分。实际上,注册服务器是存放仓库的地方,其上往往存放着多个仓库。每个仓库集中存放某一类镜像,往往包括多个镜像文件,通过不同的标签(tag)来进行区分。例如存放Ubuntu操作系统镜像的仓库,称为Ubuntu仓库,其中可能包括14.04,12.04等不同版本的镜像。

​ 根据存储的镜像公开分享与否,Docker仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等。如果用户不希望公开分享自己的镜像文件,Docker也支持用户在本地网络内创建一个只能自己访问的私有仓库。

​ 当用户创建了自己的镜像之后就可以使用push将它上传到指定的公有或则私有仓库。这样用户下次在另一台机器上使用该镜像时,只需将其从仓库pull下来就可以了。

四、参考文献 🌻

1️⃣Docker — 从入门到实践 (gitbook.io)

2️⃣一文看懂什么是 Docker 容器

3️⃣Docker Documentation | Docker Documentation

4️⃣Docker 镜像、容器、仓库的概念及应用详解 - html中文网

打赏
文章目录