Docker | 基础知识学习笔记
Contents
Docker要求64bit系统(x86 or arm)
Docker要求Linux内核:3.10+
Docker简介
Docker
:Go 实现,对进程进行封装隔离,操作系统层面的虚拟化技术。
Docker虚拟技术
:容器内的应用进程直接运行在宿主的内核, 容器没有自己的内核,也没有虚拟硬件资源。
传统虚拟技术
:Hypervisor: 虚拟一套硬件—>运行一个操作系统—>运行应用进程
Dcoker & VM Compare
Docker基本概念
Engine
Docker Engine是Docker的主程序,主要包含Docker Client和Docker Server,可以创建Docker镜像并运行Docker容器。Docker Engine里最主要的命令是 Docker Cli(docker) 和 Docker Daemon(dockerd)
Image
Docker镜像(Image),特殊的
文件系统
, 提供容器运行时所需的程序、库、资源、配置文件等外, 还包括运行时的一些配置文件(匿名卷、环境变量、用户);镜像不包含任何动态数据,其内容构建好后不会发生变化。分层存储,Docker Image采用分层存储架构,其实体由多层文件系统联合组成。
相关技术介绍:
Container
Docker容器:镜像运行的实体(类&类的实例),其实质是
进程
——运行在自己独立的命名空间Namespace
,拥有自己的root文件系统,网络配置,进程空间,用户空间等;该进程运行在一个与宿主机环境隔离的空间内,不受宿主影响。容器存储层:容器以镜像为基础,在其上创建的一个为容器运行时进行读写而准备的存储层。
容器生命周期:容器消亡,容器存储层也消亡;故容器存储层要求保持无状态化——即在其上不存储任何数据。
数据卷生命周期:独立于容器,不会随容器消亡而消亡;推荐文件写入使用数据卷或绑定宿主机目录,这些位置的读写会跳过容器存储层。
Repository
Docker Registry
Docker Registry:集中存储,分发镜像的服务。 一个
Docker Registry
可包含多个仓库
(Repository),一个Repository可包含多个标签
(Tag),每个标签对应一个镜像。仓库命名:
<用户名>/<软件名>
——boyzhe/ubuntu
,boyzhe——Docker Registry用户名,ubuntu——软件名镜像命名:
<仓库名>:<标签>
,指定哪个软件哪个版本的镜像,如果Tag未给出则表示latest(ubuntu:14.04 | ubuntu:16.04 | ubuntu:latest)Docker Registry 公开服务
Docker Registry 私有服务
Docker核心元件
Linux核心
- Namespace - 隔离不同Container的执行空间
- Cgroup - 分配硬件资源
- AUFS(chroot) - 建立不同Container的档案系统
- SELinux - 确保Container网络安全
- Netlink - 确保Container间的进程通信
- Netfilter - 网络防火墙封包过滤
- AppArmor - 保护Container的网络及执行安全
- Linux Bridge - 让不同主机上的不同Container通信
Docker核心
- Docker Client - 调用Docker Daemon(运行在本机或其他客户端)
- Docker Daemon - Docker守护进程,执行Docker功能(本机)
- Libcontainer - 和Linux核心通信的library(本机)
- Docker image - 建立容器的镜像库(本机或云端)
Docker+Linux核心系统架构图
Docker执行
Docker执行过程
- 安装了Docker的Linux及硬件
- 执行Docker Client, 呼叫Docker Daemon(unix:///var/run/docker.sock)
- Docker Daemon响应Client, 通过Libcontainer要求Linu核心建立Container
- Linux核心响应请求,启动核心namespace建立独立空间(pid, network, IPC, UTS, mount等);Daemon根据client参义分配CPU,记忆体或磁盘IO等。
注:此时Container没有任何东西
- Daemon检查本机现有镜像列表,看是否有符合要求的本地镜下载使用过
- 如果step-5有,Daemon则直接载入本地镜像到step-4的建空Container,至此Container启动完成
- 如果step-5没有,Daemon则到Docker Registry下载Client参数要求的Image
- 填入step-7下载的Image到step-4建立的空Container,Container启动完成
从以上流程可知,Docker Container执行的调度方式就是Client的参数;事实上,执行Docker时的参数就是决定Linux核心建立Namespace以及设定网络,存储的方法。
*注*:Docker Client和另一台主机的Daemon连接可以用https
取代unix
, 但十分危险,要确保安全性后才可以这样做!
Docker执行过程图
Docker执行实例
See Also
Thanks to the authors 🙂