学习 Docker(一):初识 Docker

Docker 是一种虚拟化技术,对比 VM(Virtual Machine 虚拟机)是一种更轻量级的实现。

VM VS Docker

VM 使用虚拟化技术,在宿主操作系统(Host OS)虚拟化了多个操作系统。Docker 使用容器化技术,在宿主操作系统创建了多个容器。

通常,在 VM 中会部署一至多个应用,而在容器中只部署一个应用。

VM VS Docker

架构

Docker Architecture

Docker 采用了 client-server 模式。

Docker 客户端通过 REST API 和 Docker Deamon 进行通讯,并由 Docker Deamon 执行镜像和容器的管理工作。

Docker 服务端包含了以下五个主要的组件:

  • dockerd 其实就是 Docker Deamon
  • containerd 容器运行时
  • runc 创建容器的 CLI 工具
  • docker-containerd-shim 容器父进程,解耦 containerd 和容器
  • docker-proxy

Docker Component

CGroup 和 Namespace

Docker 的实现依赖于 Linux Kernel 的两个特性:

  • Control Group(CGroup)限制进程可以使用的资源(包括 CPU、内存、存储和网络等);
  • Namespace 确保进程只能看到其所属的系统视图(包括文件、进程、网络接口、主机名等)。

CGroup

执行 mount -t cgroup 查看挂载的 CGroup 子系统,常用的 CGroup 子系统如下:

  • cpu 限制 CPU;
  • memory 限制内存;
  • ……

在 CentOS 7 的 /sys/fs/cgroup/ 目录,Docker 在各个子系统下创建了 docker 组,并为启动的 Docker 容器在 docker 组下创建子组。

启动一个 Docker 容器:

docker run -i -t --rm busybox --cpu-quota 10000 /bin/sh  

查看 Docker 容器完整 ID:

docker ps --no-trunc  

在 /sys/fs/cgroup/cpu/docker 目录下可以找到该容器 ID。

查看进程 ID:

cat /sys/fs/cgroup/cpu/docker/<container id>/tasks  

查看进程 CPU 配额:

cat /sys/fs/cgroup/cpu/docker/<container id>/cpu.cfs_quota_us  

Namespace

Linux Namespace 包括以下几类:

  • Mount(mnt)控制挂载点;
  • Process ID(pid)PID 隔离;
  • Network(net)虚拟化网络栈;
  • Interprocess Communication(ipc)进程间通讯隔离;
  • UTS 主机和域名;
  • User ID(user)用户认证和权限隔离。

启动一个 Docker 容器:

docker run -i -t --rm busybox /bin/sh  

查看进程命令空间:

ls -l /proc/<pid>/ns  

CentOS 7 安装 util-linux 包:

yum install util-linux  

进入 Namespace:

nsenter --target <pid> --mount --uts --ipc --net --pid  

参考