Docker&K8S学习笔记

直接在百度上搜索Docker,可以看到类似这样不知所云的描述:

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker和虚拟机

Docker是基于容器化理念的一个实现工具。这种看上去像是虚拟机的技术,和虚拟机还是有很大的不同的:

  • 虚拟机大概像这样:

    img

    虚拟机可以隔离出很多“子电脑”,但占用空间更大,启动更慢,一些商业虚拟机软件可能还要花钱。

    虚拟机的虚拟化单位是电脑,虚拟机运行的是一个完成的操作系统,通过虚拟机管理程序对主机资源进行虚拟访问,相比之下需要的资源更多。

  • Docker的容器化概念像是构造一个沙盘:

    img

    它启动时间很快,几秒钟就能完成。而且,它对资源的利用率很高(一台主机可以同时运行几千个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

img

可以用造房子来比喻Docker的功能:

我们在一片空地上建房子,于是我们收集材料一顿操作把房子盖好了。但是住了一段时间, 我们感到无聊,想要搬到另一块空地上去,可是房子是不能被直接扛起来跟我一起走的,按照传统的方法就只能再重复一遍之前的工作。

这时候来了一个叫Docker的魔法师,他带来了一种魔法,可以把我盖好的房子复制成一个“镜像”存起来。到了其他地方,我就可以直接拿出这个“镜像”复制一套房子,拎包入住。

Docker的核心概念

  • 镜像
  • 容器
  • 仓库

刚才我的比喻中,放在包里的镜像就是Docker镜像。而装它的背包则是Docker仓库,在空地上用魔法复制出来的这个房子,就是一个Docker容器

说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。

也就是说,每次用魔法复制的房子是一样的,但房子里摆放的家具则是由不同居住者添置的。

而Docker仓库则是存储各种各样风格、类型的房子模板,可以在不同情况下使用。

但是公开仓库的模板是人人可能添加的,所以我们需要保证没有人放入一些有问题的镜像,这个管理服务则由Docker Registry服务来提供。

什么是K8S

K8S,全称kubernetes,在百度上直接搜索很容易搜到一段简单的描述:

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

可以把K8S粗略理解为一个管理工具。

它的架构类似这个样子:

一个K8S系统,通常称为一个**K8S集群。

这个集群主要包括两个部分:

  • 一个Master节点(主节点)
  • 一群Node节点(计算节点)

20201123160834

其中,Master节点主要负责管理和控制,Node节点则是工作负载节点,里面是具体的一些容器。

我们首先来看看Master节点:

image-20201123160941628

Master节点包括API Server、Scheduler、Controller manager、etcd。

API Server是整个系统的对外接口,供客户端和其它组件调用,直接对外提供工具,相当于“营业厅”。

Scheduler负责对集群内部的资源进行调度,相当于“调度室”。

Controller manager负责管理控制器,相当于“总负责”。

img

每个Controller通过API Server提供的接口实时监控整个集群的每个资源对象的当前状态,当发生各种故障导致系统状态发生变化时,会尝试将系统状态修复到“期望状态”。

然后我们再把目光放到Node节点

image-20201123161126550

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
image-20201124132021681

而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
image-20201124132117468

安装一些其他的依赖项:

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.Docker.com/linux/centos/Docker-ce.repo
image-20201124132241093

安装Docker(这里用到的是社区版):

yum install -y Docker-ce
image-20201124132217194

启动Docker:

systemctl start Docker

用hello-world测试:

Docker run hello-world
image-20201124132423557

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