十分钟快速入门docker+k8s,简单实操+注意事项+底层原理
十分钟快速入门docker+k8s,简单实操+注意事项+底层原理
容器技术现在使用已经非常普遍了,好处多多,此处不赘述,但对于普通开发者来说,从0学起来还是比较有坡度的,主要是容器技术偏运维操作更多一些,一般项目程序员直接和容器打交道的机会比较少,加上docker+k8s 涉及到的概念、工具、命令太多,让初学者容易陷进去,一下子迷失了方向。其实我们弄清楚了底层基本原理,然后命令一点点学,逐层递进,效果就很好了。
文本目标:
a. 介绍一条快捷的入门路径, 可以快速跑通整个流程。
b. 对各个工具的底层原理做简单介绍,否则基础不牢地动山摇。
顺便介绍一种学习方法: 3W学习法 , 我自认为3W学习法是我们每个人学习知识必由路径,只是我们自己没感觉到而已。
介绍 | 举例说明 | 注意点 |
---|---|---|
what | 是什么:能干什么,优缺点是什么 | docker 是什么,能干什么 |
how | 怎么用 | docker 的安装、使用 |
why | 为什么,底层原理 | docker 是怎么工作的 |
因为docker+k8s细节太多,所以本文主要介绍what 和 why
入门路径:
由于wsl+docker+k8s网上安装教程比较多,大家可以根据自己环境自行安装,本部分只重点介绍安装注意事项。
环境和工具:
win10 专业版+ dockerdesktop +kubectl
dockerdesktop 是一个桌面软件
kubectl : go 语言写的k8s 客户端(命令行工具),k8s官网下载, 直接配置到环境变量即可。
Dockerdesktop安装注意事项:
安装前windows 系统需要开启wsl2 (windows subsystem linux) ,可以通过控制面板操作,也可以用命令,效果等同,操作完了操作系统要重启, 然后安装desktop 的时候选择 wsl2
Dockerdesktop 启动k8s 注意事项:
启动k8s 前需要确保网络可以访问k8s 镜像库, dockerdesktop 设置Resources 是可以设置proxy的。
因为需要拉去k8s 相关镜像,可能需要比较长的时间
启动成功后:
启动后,会在本机生成一个配置文件,这个是kubectl 访问k8s apiserver 的token
C:\Users\Administrator.kube\config
将server 的地址 改成 127.0.0.1 即可, docker 会把6443 端口映射到本机
kubeclt 其实就相当于一个postman ,从C:\Users\Administrator.kube\config读取认证信息 ,然和 apiserver 之间用http 通信。
测试kubectl :
底层逻辑:
Linux 内核是什么?与容器关系是?
我们通常说的linux 系统一般是两部分 : 内核(kernel )+ 壳应用(ubuntu、centos等)
内核:负责cpu 内存 线程调度、网络等
外壳:我们平时运行的软件 命令等都属于外壳应用
平常我们所接触的 centos linux 系统实际上是内置了一个kernel 的, 核和壳是一对一的关系。
由于linux 内核 namespace 的隔离机制,实际上一个 内核是可以对应多个外壳的, docker 核心原理就是基于这一点做的。
如下图,win10机器上我启动了wsl2, 然后装了一个docker desktop 和一个 ubuntu ,这两个壳系统实际上共用了wsl2 这一个 linux 内核。
进一步验证,docker desktop 里面的容器的内核也是这个 wsl 2
WSL 是什么?
wsl微软官方为Windows操作系统开发的一个linux子系统,只要你启动了wsl ,那么你的机器上相当于运行了两个操作系统内核(windows内核 +linux内核)
我们通常说的linux 发版版 是在 linux 内核上开发的。
有了 wsl ,那么windows 既可以同时当做windows 和 linux 两个系统用了,两个系统无缝衔接。
使用场景:比如我们开发go 程序, 我们习惯在windows中用vscode 代码编写, 由于go 里面的一些工具命令(比如kubebuilder)在windows 下无法运行,那么我们直接用wsl ubuntu就行了,所有磁盘会自动挂在过去。
就基本上不再需要windows安装虚拟软件,在虚拟机里面跑linux 了, 甚至wsl ubutnu 都可以不装,直接用dokcer ,效果是一样的,自己docker run 命令的时候把windows目录挂载进去, 下图中的 /data 目录是直接挂载的windows 目录:
Docer 镜像是什么?
docker 镜像其实就是一个压缩包,分层文件系统将所有层级的文件叠加起来,一个docker容器就是一个在内核上运行的壳系统(包括许多文件和运行的进程)
操作系统文件:壳操作系统-centos 等
你的软件运行环境:jdk 等
你写代码: 编译后的jar
可以简单理解为:一个docker镜像就是一个特定的壳操作系统, 一个容器就是这个壳操作系统运行实例, 由于内核namespace的隔离机制,一个内核之上可以运行多个不同的壳操作系统,他们之间互不干扰。这也就是为什么docker比传统虚拟机方案节省资源的原因。
K8S 是什么?
标准答案:容器编排
支持多种容器技术,但大多数用的都是docker.
生产环境中,不会像上面介绍的一样,所有软件运行在同一台机器的同一个docker上,需要很多台机器组成的docker 集群 。
k8s 就是把这些资源集中管理,需要创建一个容器的时候,k8s知道那台机器有资源可用,让后让容器在某一台或几台机器上启动起来,当然还包括容器的启停、监控等其他复杂功能。