第一课 docker 容器基础
虚拟化类型:
- 主机级虚拟化:程序的运行要经过两层内核,资源开销太大。
- 容器级虚拟化 :在宿主机内核上运行一个管理程序,划分出多个相互隔离的用户空间,程序则运行在这个隔离的空间中。
追求的目标:资源的最大化利用;资源的隔离。
需要隔离的资源:
- UTS(主机名和域名)
- Mount(文件系统,也叫挂载点)
- IPC(进程间通信,包括信号量、消息队列、共享内存)
- PID(进程树)
- User(用户和用户组)
- Net(网络设备、网络栈、端口等)
以上资源的隔离由 Linux 内核级的命名空间(namespace)和 chroot 支持。
除此之外,内核还必须提供机制来限制每一个用户空间的可用资源总量。这可以通过 Linux 的 cgroups (control groups)来实现。将用户空间划分成不同的组,在组内进行资源的分配。
综上,容器依托的三种内核提供的关键技术为:namespace,chroot,cgroups。
在隔离性方面,容器的隔离性不如主机级虚拟化。
容器技术解决方案
- LXC(Linux Container):通过模板创建容器。
- Docker:通过镜像来创建容器,简化了容器的使用。早期基于 LXC 进行二次封装与改进,后期开发了自己的容器引擎 libcontainer。后来形成了开放标准 runC 容器引擎。
dockers 推荐一个容器只运行一个程序
好处在于:
- 每个程序运行在独立的用户空间中。
- 分发与部署更容易。
坏处在于:
- 不同容器存在重复的文件,占用空间更大。
- 程序的调试和管理更难,增加了运维管理复杂度。
docker镜像:分层构建,联合挂载。
容器编排工具:
- machine+swarm+compose
- mesos+marathon
- kubernetes(占据主导)