为什么要用 Docker

传统应用部署的方式是直接在服务器环境中进行安装,这就涉及到如何适配各类操作系统,如何根据实际情况安装各种依赖,而这个过程中往往会遇到各种难以解决的套娃问题,特别是当开发环境和实际生产环境使用的操作系统不同时,安装依赖的方式也会发生变化,使得部署复杂度上升。

Docker 同传统的虚拟机比较类似,但是更加轻量级、更加方便。Docker 的作用实际上就是抹平各类操作系统的差异,使得应用如何适配操作系统转变为操作系统如何安装 Docker,相比起来后者容易很多,而且更具有通用性。

同时由于使用了 Docker,原先一台服务器部署一个应用,也变成了可以部署多个应用,提高了服务器的资源利用率。


基本架构简介

先上个比较经典的图。

1、Docker Daemon

Docker 守护进程,即 Dockerd 或 Containerd

用于监听 Docker API 请求,管理 Docker 对象,如镜像、容器、网络、数据卷

2、Docker Client

Docker 客户端

用户通过命令行与 Docker Daemon 进行交互的最主要的方式

3、Docker Registry

Docker 镜像仓库

用于存放和管理 Docker 镜像

附 DockerHub 地址:https://hub.docker.com/search?type=image

4、Images

Docker 镜像,是创建 Docker 容器的模版

镜像是只读的,并带有创建 Docker 容器的说明

5、Containers

Docker 容器,是 Docker 镜像运行的实例

容器的本质是进程,但运行于独立的命名空间,拥有自己的 root 文件系统、网络配置、进程空间,甚至用户 ID 空间

6、底层技术支持

  • Namespace

命名空间,用于资源隔离

  • Cgroups

Linux 内核功能,用于资源限制,包括 systemd、cgroupfs 两种类型,推荐类型为 systemd(Kylin系统除外)

  • UnionFS

联合文件系统,用于镜像和容器的分层


附录

1、Dockerd 与 Containerd

Containerd 调用链更短,组件更少,占用节点资源更少,更稳定。

k8s中建议选择 Containerd。当遇到以下情况时,需要选择 Dockerd 作为运行时:

- 如需使用 docker in docker

- 如需使用 docker build/push/save/load等命令

- 如需调用 docker API

- 如需使用 docker-compose 或 docker-swarm

2、其它概念

Container Runtime:容器运行时

Container Runtime Interface:CRI,容器运行时接口

Container Network Interface:CNI,容器网络接口(flannel、calico等)

Container Storage Interface:CSI,容器存储接口


3、Docker 安装教程

https://docs.docker.com/get-docker