Author:rab
前言
Docker 采用 C/S 网络应用模型,其核心组件包括:Docker 客户端(Client)、Docker 服务端(Docker Daemon)、Docker 镜像(Image)、Docker 仓库(Registry)及 Docker 容器(Container)。接下来通过架构图,详细说明一下 Docker 架构组件的功能及作用。
一、架构
流程:Docker 客户端(Client)向 Docker 服务端(Docker Daemon)发起请求(如 docker pull/run/build … 等),Docker 服务端(Docker Daemon)收到请求后就会做出响应。假如是一个 pull 请求,那 Docker 服务端(Docker Daemon)就会向 Docker 仓库(Registry)拉取指定的镜像至 Host 本地进行存储,最后再根据 Docker 客户端(Client)的请求决定是否运行容器或做其他请求操作。
二、组件
2.1 客户端(Client)
Docker 客户端(Client)
,即 Docker 的客户端管理命令(如上图所示),Docker 客户端(Client) 可以与 Docker 服务端(Daemon)处于同个 Host 下,也可以分开(然后可通过 socket/RESET API 进行交互)。Docker 客户端(Client)向 Docker 服务端(Daemon)发起请求,然后 Docker 服务端(Daemon)负责构建、运行和分发容器。
2.2 服务端(Daemon)
Docker 服务端(Daemon)
,即以 Linux 后台服务方式运行的服务器组件,作为服务端,其为 Docker 客户端(Client)的相关请求提供服务和响应,并为客户端的请求负责创建、运行容器,及镜像构建与存储等。下图为后台运行的状态:
systemctl status docker.service
Docker 服务端(Daemon)只能响应本地 Host 的 Docker 客户端(Client)请求,如果需要运行远程客户端的请求,需要启用 TCP 监听服务,具体步骤如下:
1、修改 Docker 配置文件
vim /etc/systemd/system/multi-user.target.wants/docker.service
# 追加 -H tcp://0.0.0.0
2、重启 Docker 服务端(Daemon)
systemctl daemon-reload
systemctl restart docker.service
3、远程请求 Docker 服务端(Daemon)
docker -H 10.150.16.95 info
# 10.150.16.95:远程Docker服务端(Daemon)的IP地址
2.3 镜像(Image)
在前面的博文已经提到,Image 是一种分层结构的只读镜像,它可通过服务端运行(run)为容器。而什么是镜像呢?又如何创建镜像呢?我们说,镜像是容器的基础。首先要了解镜像就先要了解一个概念——base 镜像
,我们的任何镜像都是基于一个基础(base)镜像构建而成的。
而什么又是基础镜像呢?你需要明确基础镜像的两个特点:
- 基础镜像不依赖于其他镜像,也即是说它是镜像的基本单元;
- 其他镜像就可以以基础镜像为基准进行构建。
那这些(基础)镜像又存储于什么位置呢?一般我们可以通过创建自己的私有 docker 镜像仓库(如 Harbor)或直接使用官方的镜像仓库来实现基础镜像及其他镜像的存储,这就是接下来即将说到的 docker 仓库(Registry)。关于如何拉取 docker 仓库(Registry)中的镜像或其他镜像管理指令,大家可以自行看官方文档,这里不作为重点。
如下图就是从镜像仓库中拉取下来的镜像:
那问题来了:既然镜像只读,那我其他镜像又是如何基于某个基础镜像来进行构建的呢?
关于这个问题我也已经做了总结,大家可以看看我前面的文章《Docker 的 Copy-on-Write 特性》
2.4 仓库(Registry)
在镜像一节中我们说了,仓库(Registry)就是用来存放镜像(Image)的,它分为私有镜像仓库和公有镜像仓库,所谓的私有镜像仓库就是你个人或你们公司内部搭建的镜像仓库(如 Harbor),只有你个人或你公司内部相关技术人员可使用。而公有镜像仓库默认是 Docker Hub,由 Docker 公司进行维护,该镜像仓库所有人都可进行下载使用。
关于如何部署一个私有 Docker 镜像仓库,大家可以参考我这篇部署文档《Harbor 私有镜像仓库部署》
2.5 容器(Container)
有了以上的基础后,紧接着就是通过镜像(Image)来运行一个容器实例了,用户可通过 Docker 客户端工具来运行、停止、删除容器了。如下图就是运行中的一个 Nginx 容器实例:
以上就是 Docker 的基础架构及各组件的功能介绍。