docker理论

基本概念:

docker是一个容器引擎,源代码托管在Github上,基于Go语言并遵从Apache2.0协议开源。

Container是容器,完全使用沙箱机制,互相之间没有接口。几乎没有性能开销。

 

Docker让开发者可以打包他们的应用以及依赖包到一个可移植的container中,然后发布到任何流行的Linux机器上。

LXC为Linux Container的简写。Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。

LXC主要通过来自kernel的namespace实现每个用户实例之间的相互隔离,通过cgroup实现对资源的配额和度量。

镜像 ID 是镜像的唯一标识,一个镜像可以对应多个标签。

docker images 列表包含了仓库名、标签、镜像 ID、创建时间以及所占用的空间

 网络:

 当 Docker 启动时,会创建 docker0 虚拟网桥负责转发信息。并且为docker0 接口和新创建的容器随机分配同一网段的地址。
    创建Docker 容器的同时会创建一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0 ;另一端在本地并被挂载到docker0 网桥,名称以 veth 开头(例如 vethAQI2QT )。通过这种方式就可以主机和容器,容器和容器通信。
     docker将虚拟文件挂载到容器的 3 个相关配置文件,配置容器的主机名和 DNS 配置。 从而容器的DNS和宿主主机的 DNS 信息一致。
  在容器中mount 后的挂载信息:
# 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 学习笔记

图: Docker - container and lightweight virtualization

Dokcer 通过使用 Linux 桥接提供容器之间的通信,docker0 桥接接口的目的就是方便 Docker 管理。当 Docker daemon 启动时需要做以下操作:

  • 如果 docker0 不存在则创建
  • 搜索一个与当前路由不冲突的 ip 段
  • 在确定的范围中选择 ip
  • 绑定 ip 到 docker0
posted @ 2017-09-14 09:19  linuxws  阅读(133)  评论(0编辑  收藏  举报