docker理论
基本概念:
docker是一个容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。
Container是容器,完全使用沙箱机制,互相之间没有接口。几乎没有性能开销。
Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。
LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。
LXC主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。
镜像 ID 是镜像的唯一标识,一个镜像可以对应多个标签。
docker images 列表包含了仓库名、标签、镜像 ID、创建时间以及所占用的空间
网络:
# mount /dev/disk/by-uuid/1fec...ebdf on /etc/hostname type ext4 ... /dev/disk/by-uuid/1fec...ebdf on /etc/hosts type ext4 ... tmpfs on /etc/resolv.conf type tmpfs ...
docker是借助于cGroup和namespace技术来实现资源控制和隔离的,docker在网络上利用namespace的大致过程是这样的:
1、创建一个Net Namespace netns1。
2、创建一对veth,将peer加入到netns1,将别一端接入到网桥bridge0中。
3、为这两个veth分配IP。
4、用netns1启动容器中的程序比如/bin/bash。
docker在网络这里用到了Net namespace,veth和网桥bridge。
######################################
图: Docker - container and lightweight virtualization
Dokcer 通过使用 Linux 桥接提供容器之间的通信,docker0 桥接接口的目的就是方便 Docker 管理。当 Docker daemon 启动时需要做以下操作:
- 如果 docker0 不存在则创建
- 搜索一个与当前路由不冲突的 ip 段
- 在确定的范围中选择 ip
- 绑定 ip 到 docker0