《Go程序设计语言》、《the way to go》
命令 格式 说明
FROM FROM :
多个镜像构建过程写一个Dockerfile文件。
镜像 docker save
docker load
容器 docker export
docker import
1)分层
镜像由一系列镜像层组成,镜像层分为只读层和读写层。分层使不同镜像之间共享镜像层,使docker镜像轻量。
2)写时复制
Copy-On-Write策略,使多个容器之间可以共享镜像。每个容器启动时,将所有镜像层挂载到一个挂载点,再覆盖一个可读写的容器层。减少磁盘占用和容器启动时间。
3)内容寻址
根据文件内容来索引(sha256哈希值)镜像和镜像层,最为镜像层的唯一标志。
4)联合挂载
联合挂载技术:在一个挂载点同时挂载多个文件系统,整合挂载内容,使得最终可见的的文件系统包含各层文件和目录。
联合文件系统(union filesystem):实现联合挂载技术的文件系统。
联合挂载,用于将多个镜像层的文件系统挂载到一个挂载点来实现一个统一文件系统。
registry用于保存Docker镜像,其中还包括镜像层次结构和关于镜像的元数据。Docker从registry中下载镜像保存在宿主机上,然后启动容器。
1)公有registry
Docker Hub:Docker官方维护的公共仓库;
阿里云docker仓库
2)私有registry
Docker Registry:官方提供的工具,用于构建私有的镜像仓库;
Docker Harbor:an open source trusted cloud native registry project that stores, sings, and scans content. 一般作为企业级Registry服务;
repository是由具有某个功能的Docker镜像的所有迭代版本构成的镜像组。
registry是repository的集合,repository是image的集合。
manifest(描述文件),存在于registry中作为镜像的元数据文件。镜像被pull到宿主机时,自动转化为镜像配置文件。
image:存储镜像相关的元数据信息;
layer:镜像层;
参考1.4.2.1 registry 章节
Docker daemon 通过调用libnetwork网络库的API完成网络的创建和管理等功能。
libnetwork实现了5种内置驱动,以bridge/host 驱动为例:
bridge driver:Docker的默认驱动,容器连接到Docker网桥(Docker0)上,与外界通信需要使用NAT(network address translation, 网络地址转换);
host driver:容器不进行network namespace网络隔离,容器中的进程处于宿主机的网络环境,使用宿主机的网卡、ip和端口。host模式解决了容器与外界通信的地址转换,可以直接使用宿主机的IP。
$ docker network -h
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
// TODO
Docker容器实质上是宿主机上的进程。Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制实现了高效的文件操作。
linux内核实现namespace的一个主要目的,就是实现轻量级虚拟化服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛置身于一个独立的系统环境中,以达到独立和隔离的目的。
namespace的6项隔离
namespace 系统调用参数 隔离内容
UTS CLONE_NEWUTS 主机名与域名
IPC CLONE_NEWIPC 信号量、消息队列、共享内存
PID CLONE_NEWPID 进程编号
Network CLONE_NEWNET 网络设备、网络栈、端口等
Mount CLONE_NEWNS 挂载点(文件系统根目录)
User CLONE_NEWUSER 用户和用户组
cgroups是linux内核提供的一种机制,可以根据需求把一系列系统任务及其子任务按资源划分等级的不同组内,从未为系统资源管理提供一个统一的框架。
cgroups限制、记录任务组所使用的物理资源(CPU、Memory、IO),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。
Kubernetes脱胎于Google的大规模集群管理工具Borg,管理跨主机Docker容器,实现了应用部署、高可用管理和弹性伸缩功能,并封装了一套RESTful API对外提供服务。
Kubernetes设计哲学之一,维护应用容器集群一直处于用户所期望的状态。
kubernetes中,能够被创建、调度和管理的最小单元是pod,而非单个容器。一个pod是由若干个Docker容器构成的容器组(pod意为豆荚,容纳多个豆子,很形象)。
同一个pod中的容器有两个特性:
通过localhost直接访问另一个容器;
$ kubectl get pods –n root –l name=nginx
kubernetes中的其他对象,如deployment、service,同样可以根据label对pod进行定位和组织。
在kubernetes中,label是一种重要的且被广泛应用的组织、分类和选择kubernetes对象的机制。
label不直接作为系统内部唯一标识kubernetes对象的依据,因为不同于对象名和uuid,label并不保证唯一性。
label selector 是kubernetes核心的分组机制,通过label selector 能够识别一组有共同属性的kubernetes对象。有两种label selector 查询条件:基于子集的查询条件;in notin
replication controller(副本控制器)决定了一个pod有多少个同时运行的副本,并保证这些副本的当前状态与期望状态一致。
RC的典型场景:
replica set
新一代副本控制器,也是用于保证与label selector匹配的pod数量维持在期望状态。
replica set和replication controller 区别在于:replication controller 仅支持基于值相等的selector查询,replica set引入了基于子集的selector查询条件;
Deployment
Deployment用于 为pod和replica set提供更新,并可以方便的跟踪观察其所属的replica set 或者 pod 数量以及状态的变化。即,deployment是为了应用的更新而设计的。
为什么需要service?
什么是service?
service主要由一个固定IP地址和一个label selector组成。通过创建service,可以为一组具有相同功能的容器应用提供一个统一的入口地址,并将请求进行负载均衡到后端的各个容器应用上。
如何定义一个service?
Pod、RC、Service的关系图
通过实例学习一下操作:
APIServer
APIServer负责对外提供kubernetes API 服务,作为系统管理指令的统一入口,统揽全局,任何对资源进行ACID操作都交个APIServer处理后才能提交给etcd。
scheduler
scheduler 根据特定的调度算法将pod调度到指定的工作节点上(即绑定bind)。
controller manager
controller manager 管理集中的各种控制器(如replication controller、node controller),负责控制管理对应的资源,确保资源保持在用于预期的状态。
kubelet
kubelet是kubernetes集群的工作节点上最为重要的组件进程,负责管理和维护在这台主机上运行着的所有容器,使得pod的运行状态status与期望值spec一致。
kube-proxy
kube-proxy是kubernetes服务发现和反向代理服务的底层实现。
服务发现:kube-proxy使用etcd的watch机制,监控集群中service和endpint对象数据的动态变化,并维护一个从service到endpoint的映射关系,从而保证了后端pod的ip变化不会对访问者造成影响。
方向代理:kube-proxy支持TCP/UDP连接转发,默认使用Round Robin算法(依次从可用工作节点列表中选取一个工作节点)将流量转发到与service对应的一组后端pod。
创建pod
创建RC
创建service
原文:https://www.cnblogs.com/walkinginthesun/p/10423799.html