一、入门篇
Docker container和普通的虚拟机Image相比, 最大的区别是它并不包含操作系统内核. 普通虚拟机将整个操作系统运行在虚拟的硬件平台上, 进而提供完整的运行环境供应用程序运行, 而Docker则直接在宿主平台上加载运行应用程序. 本质上他在底层使用LXC启动一个Linux Container,通过cgroup等机制对不同的container内运行的应用程序进行隔离,权限管理和quota分配等。每个container拥有自己独立的各种命名空间(亦即资源)包括: PID 进程, MNT 文件系统, NET 网络, IPC , UTS 主机名等。
与LXC有什么不同 基本上你可以认为目前的Docker是LXC的一个高级封装,提供了各种辅助工具和标准接口方便你使用LXC,你可以依靠LXC和各种脚本实现与docker类似的功能,就像你不使用APT/yum等工具也可以自己搞定软件包安装一样,你使用他们的关键原因是方便易用!
实际使用中,你一般不用关心底层LXC的细节,同时也不排将来docker实现基于非LXC方案的可能性 在LXC的基础上, Docker额外提供的Feature包括:标准统一的打包部署运行方案, 历史版本控制, Image的重用,Image共享发布等等 为了最大化重用Image,加快运行速度,减少内存和磁盘footprint, Docker container运行时所构造的运行环境,实际上是由具有依赖关系的多个Layer组成的。例如一个apache的运行环境可能是在基础的rootfs image的基础上,叠加了包含例如Emacs等各种工具的image,再叠加包含apache及其相关依赖library的image,这些image由AUFS文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer用作记录对当前运行环境所作的修改。 有了层级化的Image做基础,理想中,不同的APP就可以既可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等 Docker体系
DockerEngine创建和运行Docker容器
DockerCompose定义多容器应用
DockerRegistry 开源的docker镜像分发中心
DockerSwarm 主机集群和容器调度
Docker生态链:网络、仓库、服务发现、安全、Dashboard、监控、编排。
可以参考这个链接 https://github.com/weaveworks/scope 可视化调用关系
Docker生态体系:Docker网络 Sandbox:对应一个容器中的网络环境,包括相应的网卡配置、路由表、DNS配置等。CNM很形象的将它表示为网络的『沙盒』,因为这样的网络环境是随着容器的创建而创建,又随着容器销毁而不复存在的; Endpoint:实际上就是一个容器中的虚拟网卡,在容器中会显示为eth0、eth1依次类推; Network:指的是一个能够相互通信的容器网络,加入了同一个网络的容器直接可以直接通过对方的名字相互连接。它的实体本质上是主机上的虚拟网卡或网桥。 二层VLAN网络和Overlay网络 简单来说,二层VLAN网络的解决跨主机通信的思路是把原先的网络架构改造为互通的大二层网络,通过特定网络设备直接路由,实现容器点到点的之间通信。这种方案在传输效率上比Overlay网络占优,然而它也存在一些固有的问题。 这种方法需要二层网络设备支持,通用性和灵活性不如后者; 由于通常交换机可用的VLAN数量都在4000个左右,这会对容器集群规模造成限制,远远不能满足公有云或大型私有云的部署需求; 大型数据中心部署VLAN,会导致任何一个VLAN的广播数据会在整个数据中心内泛滥,大量消耗网络带宽,带来维护的困难。 Overlay网络是指在不改变现有网络基础设施的前提下,通过某种约定通信协议,把二层报文封装在IP报文之上的新的数据格式。这样不但能够充分利用成熟的IP路由协议进程数据分发,而且在Overlay技术中采用扩展的隔离标识位数,能够突破VLAN的4000数量限制,支持高达16M的用户,并在必要时可将广播流量转化为组播流量,避免广播数据泛滥。因此,Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。 虚拟可扩展LAN(VXLAN)、采用通用路由封装的网络虚拟化(NVGRE)和无状态传输协议(SST),其中以VXLAN的支持厂商最为雄厚,可以说是Overlay网络的事实标准。 而在这三种标准以外还有许多不成标准的Overlay通信协议,例如Weave、Flannel、Calico等工具都包含了一套自定义的Overlay网络协议(Flannel也支持VXLAN模式),这些自定义的网络协议的通信效率远远低于IETF的标准协议[5],但由于他们使用起来十分方便,一直被广泛的采用而造成了大家普遍认为Overlay网络效率低下的印象。然而,根据网上的一些测试数据来看,采用VXLAN的网络的传输速率与二层VLAN网络是基本相当的 所有Swarm节点的Linux系统内核版本不低于3.16.需要一个额外的配置存储服务,例如Consul、Etcd或ZooKeeper 所有的节点都能够正常连接到配置存储服务的IP和端口 所有节点运行的Docker后台进程需要使用『–cluster-store』和『-–cluster-advertise』参数指定所使用的配置存储服务地址 IPVS 是在 Linux 内核中构建的传输层,4层网络上的负载均衡,也被称为 4 层转发,IPVS 在宿主机上可以像一个负载均衡器一样,在多个实际的 Server的前端做 TCP/UDP等方面的转发,从而使多个 RS 对外暴露一个单独的 VS,IPVS 已经被融合进 LVS。 由 Dockerfile 生成 呈现层级结构 每层镜像包含:镜像文件以及镜像 json 元数据信息 FROM ubuntu:14.04:设置基础镜像,此时会使用基础镜像 ubuntu:14.04 的所有镜像层,为简单起见,图中将其作为一个整体展示。 ADD run.sh /:将 Dockerfile 所在目录的文件 run.sh 加至镜像的根目录,此时新一层的镜像只有一项内容,即根目录下的 run.sh。 VOLUME /data:设定镜像的 VOLUME,此 VOLUME 在容器内部的路径为 /data。需要注意的是,此时并未在新一层的镜像中添加任何文件,但更新了镜像的 json 文件,以便通过此镜像启动容器时获取这方面的信息。 CMD ["./run.sh"]:设置镜像的默认执行入口,此命令同样不会在新建镜像中添加任何文件,仅仅在上一层镜像 json 文件的基础上更新新建镜像的 json 文件。 参考文档:http://docs.daocloud.io/allen-docker/docker-image
Docker的常用命令
<span class="MathJax" id="MathJax-Element-1-Frame" tabindex="0" data-mathml="sudodockerps−lCONTAINERIDf08f0408f0b3" role="presentation" style="box-sizing: border-box; display: inline; line-height: normal; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;">sudodockerps−lCONTAINERIDf08f0408f0b3sudodockerps−lCONTAINERIDf08f0408f0b3 sudo docker exec -it f08f0408f0b3 'hostname' 可以输出指定容器的主机名
sudo docker exec -it <span class="MathJax" id="MathJax-Element-2-Frame" tabindex="0" data-mathml="containerNamebashsudodockerlogs" role="presentation" style="box-sizing: border-box; display: inline; line-height: normal; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; position: relative;">containerNamebashsudodockerlogscontainerNamebashsudodockerlogscontainerName
sudo docker ps -a
sudo docker stats $containerName 可以实时监控这台容器的CPU变化
官方文档 DockerFile FROM: 你这个镜像基于哪个镜像来做
MAINTAINER:这个镜像的维护者是谁
RUN:就是执行shell指令,非交互式的
COPY/ADD: 加文件到镜像镜像中
WORKDIR:镜像启动的时候的workdir
ENV: 镜像运行时候的环境变量
ENTRYPOINT:镜像的启动指令
VOLUME: 指定目录挂载到宿主机上面
CMD: 执行指令
|