docker容器化历史与原理

87 阅读2分钟

1.容器历史

OpenStack

开源的云计算管理平台项目

paas

Cloud Foundry

  • 应用“打包”困难这个问题
  • 2013~2014 年

docker

Docker 镜像通过技术手段解决了 PaaS 的根本性问题;

容器编排

docker发布

  • dokcer-Swarm
  • Machine
  • docker-compose (Fig开源项目改名)

Mesosphere发布

  • Mesos
  • Marathon

goolge发布

  • k8s(2014发布)

2.容器相关知识

  • 进程:一个程序运起来后的计算机执行环境的总和
  • 容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”

容器结论

  • 容器只是一种特殊的进程
  • 容器是一个“单进程”模型

Volume 机制

允许你将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。

3.容器隔离实现

Namespace

Namespace 包含 Mount Namespace ,network Namespce 等等

Mount Namespace

Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的改变,一定是伴随着挂载操作(mount)才能生效

chroot 的命令

change root file system,即改变进程的根目录到你指定的位置

chroot $HOME/test /bin/bash
ls /
#我们将使用 $HOME/test 目录作为 /bin/bash 进程的根目录:

流程

  1. 启用 Linux Namespace 配置;
  2. 设置指定的 Cgroups 参数;
  3. 切换进程的根目录(Change Root)。

修改进程视图的主要方法

int pid = clone(main_function, stack_size, SIGCHLD, NULL);
int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); # 传入CLONE_NEWPID 参数
# 例子 通过在系统执行ps和docker容器里执行ps两个的pid是独立的没有共享

缺点

  • 既然容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
  • 时间不能被隔离

Cgroups

  • 制造约束的主要手段
  • 限制CPU、内存、磁盘、网络带宽
cat /sys/fs/cgroup/cpu/container/cpu.cfs_quota_us #cpu限制

#例子
while : ; do : ; done & ;//死循环
top # 查看
docker run -it --cpu-period=100000 --cpu-quota=20000 ubuntu /bin/bash

rootfs(根文件系统)

  • 只是一个操作系统所包含的文件、配置和目录
  • 就是容器镜像
  • 操作系统所包含的文件、配置和目录
  • UnionFS 最主要的功能是将多个不同位置的目录联合挂载(union mount)到同一个目录下
  • 也是基于Mount Namespace

例子

docker inspect --format '{{ .State.Pid }}' 4ddf4638572d #查看当前 Docker 容器的进程号(PID):
ls -l /proc/25686/ns # 会列出所有namespace的信息