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 进程的根目录:
流程
- 启用 Linux Namespace 配置;
- 设置指定的 Cgroups 参数;
- 切换进程的根目录(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的信息