以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我
为什么要用 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、底层技术支持
6.1、Namespace
命名空间,用于资源隔离
6.2、Cgroups
Linux 内核功能,用于资源限制,包括 systemd、cgroupfs 两种类型,推荐类型为 systemd(Kylin系统除外)
6.3、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