Docker&K8S学习笔记
直接在百度上搜索Docker,可以看到类似这样不知所云的描述:
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker和虚拟机
Docker是基于容器化理念的一个实现工具。这种看上去像是虚拟机的技术,和虚拟机还是有很大的不同的:
-
虚拟机大概像这样:
虚拟机可以隔离出很多“子电脑”,但占用空间更大,启动更慢,一些商业虚拟机软件可能还要花钱。
虚拟机的虚拟化单位是电脑,虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。
-
Docker的容器化概念像是构造一个沙盘:
它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个Docker容器)。此外,它占的空间很小,虚拟机一般要几GB到几十GB的空间,而容器只需要MB级甚至KB级。
Docker的虚拟化单位是容器,容器在本机运行,并与其他容器共享主机的内核,它运行的一个独立的进程,不占用其他任何可执行文件的内存,非常轻量。
-
两者的一个简单对比:
特性 虚拟机 容器 隔离级别 操作系统级 进程级 隔离策略 Hypervisor CGroups 系统资源 5~15% 0~5% 启动时间 分钟级 秒级 镜像存储 GB-TB KB-MB 集群规模 上百 上万 高可用策略 备份、容灾、迁移 弹性、负载、动态
继续了解Docker
了解了Docker和虚拟机等虚拟化技术的区别之后,我们再来看看Docker本身:
首先,Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。
Docker官方的口号是:
Build, Ship and Run
也就是搭建、发送、运行。
以及Build once,Run anywhere
可以用造房子来比喻Docker的功能:
我们在一片空地上建房子,于是我们收集材料一顿操作把房子盖好了。但是住了一段时间, 我们感到无聊,想要搬到另一块空地上去,可是房子是不能被直接扛起来跟我一起走的,按照传统的方法就只能再重复一遍之前的工作。
这时候来了一个叫Docker的魔法师,他带来了一种魔法,可以把我盖好的房子复制成一个“镜像”存起来。到了其他地方,我就可以直接拿出这个“镜像”复制一套房子,拎包入住。
Docker的核心概念
- 镜像
- 容器
- 仓库
刚才我的比喻中,放在包里的镜像就是Docker镜像。而装它的背包则是Docker仓库,在空地上用魔法复制出来的这个房子,就是一个Docker容器。
说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
也就是说,每次用魔法复制的房子是一样的,但房子里摆放的家具则是由不同居住者添置的。
而Docker仓库则是存储各种各样风格、类型的房子模板,可以在不同情况下使用。
但是公开仓库的模板是人人可能添加的,所以我们需要保证没有人放入一些有问题的镜像,这个管理服务则由Docker Registry服务来提供。
什么是K8S
K8S,全称kubernetes,在百度上直接搜索很容易搜到一段简单的描述:
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。
可以把K8S粗略理解为一个管理工具。
它的架构类似这个样子:
一个K8S系统,通常称为一个**K8S集群。
这个集群主要包括两个部分:
- 一个Master节点(主节点)
- 一群Node节点(计算节点)
其中,Master节点主要负责管理和控制,Node节点则是工作负载节点,里面是具体的一些容器。
我们首先来看看Master节点:
Master节点包括API Server、Scheduler、Controller manager、etcd。
API Server是整个系统的对外接口,供客户端和其它组件调用,直接对外提供工具,相当于“营业厅”。
Scheduler负责对集群内部的资源进行调度,相当于“调度室”。
Controller manager负责管理控制器,相当于“总负责”。
每个Controller通过API Server提供的接口实时监控整个集群的每个资源对象的当前状态,当发生各种故障导致系统状态发生变化时,会尝试将系统状态修复到“期望状态”。
然后我们再把目光放到Node节点。
Pod是Kubernetes最基本的操作单元。一个Pod代表着集群中运行的一个进程,它内部封装了一个或多个紧密相关的容器。
Docker,用于创建容器。
Kubelet,监控所在Node节点的Pod操作,包括创建、修改、监控、删除等。
Kubelet组件运行在Node节点上,维持运行中的Pods以及提供kuberntes运行时环境,主要完成以下使命:
1.监视分配给该Node节点的pods
2.挂载pod所需要的volumes
3.下载pod的secret
4.通过Docker/rkt来运行pod中的容器
5.周期的执行pod中为容器定义的liveness探针
6.上报pod的状态给系统的其他组件
7.上报Node的状态
Kube-proxy,主要负责为Pod对象提供代理。
在k8s中,提供相同服务的一组pod可以抽象成一个service,通过service提供的统一入口对外提供服务,每个service都有一个虚拟IP地址(VIP)和端口号供客户端访问。kube-proxy存在于各个node节点上,主要用于Service功能的实现,具体来说,就是实现集群内的客户端pod访问service,或者是集群外的主机通过NodePort等方式访问service。
Fluentd,主要负责日志收集、存储与查询。
在阿里云ECS上安装Docker
之前以学生身份在阿里云领取了一个三个月的ECS服务器,本来拿来部署博客用,学习Docker的过程中正好想到可以尝试在ECS上安装试试:
我这个ECS是用的Centos8,我初始尝试使用yum命令直接安装Docker:
yum install Docker |
发现报错:Unable to find a match: Docker,百度一番才发现是yum版本的问题,首先update一下yum:
yum -y update |

而Centos8又默认用podman代替Docker,所以还需要containerd.io:
yum install https://download.Docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm |

安装一些其他的依赖项:
yum install -y yum-utils device-mapper-persistent-data lvm2 |

安装Docker(这里用到的是社区版):
yum install -y Docker-ce |

启动Docker:
systemctl start Docker |
用hello-world测试:
Docker run hello-world |

可以看到,Docker从远程仓库拉取了hello world镜像,Docker安装成功。