2020/04/30 K8S原理介绍1

在这里插入图片描述

容器技术的由来

在这里插入图片描述
容器是一种基础工具;泛指任何可以用于容纳其它物品的工具,可以部分或完全封闭,被用于容纳、储存、运输物品;物体
可以被放置在容器中,而容器则可以保护内容物;

借助容器的思想来解决it的工作的实际问题,比如有一台服务器,上面有一个init的进程,pid=1,派生出了很多子进程,有python进程,pid=2,java进程,pid=3,这个三个进程跑在一台机器上,三个进程没有做到隔离
在这里插入图片描述
现在想把三个进程放到三个地方,独立的,做到3个互不影响互不干扰,希望java程序就跑在java运行环境里
在这里插入图片描述
早些年是用虚拟化技术,server宿主机,
host os宿主机操作系统,
hypervisor 虚拟化中间层,可以虚拟出不同的虚拟机, 虚拟机A ,虚拟机B
虚拟机A安装guest os来宾操作系统,上面有程序依赖的bins二进制应用、libs库文件,然后才能部署程序

在这里插入图片描述
其实虚拟化技术已经完美解决了这个场景,需要不同程序跑的相对隔离
在这里插入图片描述
**但是这样消耗太大,可以用容器引擎把hypervisor取代掉,把来宾操作系统guest os抽走了,通过容器化引擎直接连接到宿主机上,避免了来宾操作系统的开销 **
在这里插入图片描述

Docker的起源

应用和应用的隔离,在操作系统上是通过namespace名称空间隔离来实现的,只有实现了下面6个层次的隔离,才能说应用A和应用B在物理上是隔离的。
PID 互相不干扰,独立
NET 网卡,协议栈也是独立的,应用A监听80端口,应用B一样也可以,这样才叫网络层面上是隔离的
IPC 进程间通信,应用A调用A内存,应用B调用B内存,应该是隔离的
MOUNT 文件系统,应用A看到应该是独立的文件系统
UTS 主机名和主机域 ,应用跑在容器里,应该有自己的主机名和域
USER 进程跑起来,linux系统里必须依赖用户,所以用户空间也是相互隔离的

这6点做到了隔离,才能说应用进行容器化封装了。
USER 隔离,在内核3.8以上才实现,,centos6是2.6.6,所以不能用6,cnetos7才可以

在这里插入图片描述
最早1979年对容器化技术进行探索,chroot切跟,实际上实现了一个应用程序和另外一个应用程序在文件系统层次上是隔离的。可以用chroot给一个应用程序切一个跟,指定一个文件系统的挂载点,应用程序在挂载点运行,就像在跟上运行一样
2000年实现的jals应用,通过监狱机制,让应用程序在不同层次和维度的空间内独立运行

**直到2007年的google,cgroup写入了linux内核,让操作系统内核可以控制应用程序可以使用独立的cpu资源,内存资源。2008年,对容器化有划时代意义的软件,LXC,linux container. **

2013年,docker出现,做出来容器的规范,做了统一的接口
在这里插入图片描述
docker的诞生和幕后的公司。
solomon 也就是所罗门提供了一个核心概念,build once,run anywhere,一次构建,到处使用

在这里插入图片描述

Docker是什么

**docker是基于容器技术的轻量级虚拟化解决方案,要用到容器技术来隔离,需要有6个层次的,PID
NET
IPC
MOUNT
UTS
USER **

在这里插入图片描述
**docker本身是容器引擎,把linux的cgroup,namespace等容器底层技术进行封装抽象为用户提供了创建和管理容器的便捷界面(包括命令行和api)
**

在这里插入图片描述
docker是一个开源项目,诞生于2013年初,基于google公司退出的go语言实现,docker和k8s都是go写的
在这里插入图片描述
红帽的openshift,;企业级运维管理平台,支持k8s和docker

在这里插入图片描述
docker提供了一个标准化,便捷
在这里插入图片描述

Docker技术的优势

左边是虚拟机实现的,右边是容器实现的,容器之间相互隔离,但是共享操作系统和它需要的适当的二进制工具和库文件

在这里插入图片描述
容器技术和虚拟机技术的优劣,容器的运行是直接运行在宿主机内核上,不同容器共享同一个linux内核,但是可以有自己的用户空间,二进制和库文件。
类似xen就是直接不用装宿主机操作系统了,但是kvm就不行,还需要安装一个centos,不管一层虚拟还是二层虚拟,都要运行在hypervisior上。
性能,容器接近本地进程,虚拟机肯定逊于主机,类似磁盘IO,是由KVM虚拟化出来的,损耗很大,docker是unionfs,所以磁盘的虚拟化由于虚拟机

在这里插入图片描述

Docker容器引擎介绍

现在docker引擎主要两个版本,企业版本和社区版
在这里插入图片描述
18.06.0-ce意思就是18年6月份发布的社区版

在这里插入图片描述
早些年,docker版本是遵循大版本号和小版本号,也急速和1.13会一下子蹦到17.x,x
在这里插入图片描述
现在准备一台centos7.6的虚拟机,内核最好在3.8以上
在这里插入图片描述

在这里插入图片描述
把base源安装上。epel源也装上
在这里插入图片描述

Docker 容器引擎安装部署配置

其实epel源里有docker相关的包
在这里插入图片描述
在这里插入图片描述
有docker的包,可以直接yum install
在这里插入图片描述
不过如果要安装ce版本的docker,就需要额外安装一些东西
在这里插入图片描述
add一个阿里云的docker ce的yum源

在这里插入图片描述
在这里插入图片描述
看看docker-ce
在这里插入图片描述
17.03代表17年3月发布的
在这里插入图片描述
阿里云只到19年3月,如果直接yum install docker-ce默然安装最新的,装特定版本就把版本号推进去
在这里插入图片描述
默认安装最新
在这里插入图片描述
**现在阿里云帮你做好yum源了,安装yum-utils,然后yum-config-manage add yum源 **

docker引擎设置开机启动并且启动
在这里插入图片描述
对docker引擎做一下配置文件
在这里插入图片描述
这里有一些配置
在这里插入图片描述
graph,docker工作目录放到/data/docker
storage-driver:overlay2存储驱动
insecure-registries:不安全仓库
registry-mirrors:托镜像需要一个国内加速源
bip:
exec-opts:
live-restore:

在这里插入图片描述
这台主机ip是10.4.7.5

在这里插入图片描述
docker的网络建议使用。172.7.5.0/24,docker的网络的地址建议和主机地址,要和主机的后两位地址一样,生产经验,让容器的地址和主机有一个对照关系,容器出了问题可以找到哪台主机上。
所以把bip docker跑的容器的地址172.7.5.0/24

exec-opts :启动的时候一些额外参数,指定了cgroupdriver (google写到linux内核里的,关于cpu内存资源的控制组)指定了systemd

live-restore :当docker容器引擎死掉了,用docker引擎起来的容器还能活着,跑的容器的本身不依赖于引擎的死活

在这里插入图片描述

Docker容器引擎启动及核查

配置好后,启动服务,如果失败,试试reset-failed
在这里插入图片描述
启动之后,用docker info看看第一个学的命令

在这里插入图片描述
在这里插入图片描述
containers现在一个容器都没有
server version 服务器版本19.03.4
storage driver 存储引擎 overlay2
backing filsystem 底层文件系统 xfs
cgroup 驱动 systemd

在这里插入图片描述
cpus 有几个cpu
docker root 配置在daemon .json里

在这里插入图片描述

这个需要优化下内核

在这里插入图片描述
现在尝试启动第一个容器
在这里插入图片描述
docker info可以看到当前docker启动是否正常,如果没启动,docker info是没有返回的,用docker version 也可以
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

启动第一个Docker容器并详解启动原理

现在完成了第一个容器的启动,叫做hello-world,查看这个做了哪些事情,有助于你理解docker引擎如何工作在这里插入图片描述
不能在本地找到hello-world:latest的镜像
在这里插入图片描述
下面有拉的动作
在这里插入图片描述
上面是md5校验,下面提示是下载完成了hello-world:latest的镜像

在这里插入图片描述
看到这条消息,说明部署工作成功
在这里插入图片描述
为了产生这个信息,docker引擎做了以下几件事情。
1.有docker客户端链接到docker的服务端,服务端守护进程,docker是典型cs架构软件
2。本地没有hello-world镜像,就从docker-hub pull一个hello-world下来
3.docker服务端帮你基于拉下来的镜像创建了一个新的容器,容器帮你执行了你能看到的信息的一段脚本
4.docker服务端把这些信息流,返回到了客户端,然后在客户端展示出来

这就是容器启动最核心的原理

在这里插入图片描述

Docker镜像的结构详解

docker有三个核心理念,images镜像,container容器,repository仓库

本地是存镜像和容器的,远端是仓库。容器是由镜像实例化出来的,容器也可以提交成镜像。镜像和仓库可以推送拉取
在这里插入图片描述
镜像的结构。registry_name远端仓库地址url/repository_name分类仓库名字/imgae_name镜像名:tag_name标签。
仓库可分级 ,1级2级,一般标签用镜像版本或者时间戳,代码的统一id,传统都是用版本号

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

DockerHub注册演示

dockerhub是全球最大的docker镜像,现在开始注册
terms of service 服务条款,privacy policy隐私策略,data processing terms 数据运营条款

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
确认注册

在这里插入图片描述
登录

在这里插入图片描述
profile档案,自己的仓库repositories
在这里插入图片描述
自建仓库不管是用git还是nexus都是github的开源实现,注册好dockerhub只是第一步

在这里插入图片描述
docker login

在这里插入图片描述
输入你的dockerhub的用户名和密码就成功了

在这里插入图片描述
登录信息是存在
在这里插入图片描述
是base64编码

在这里插入图片描述
docker的认证信息是放在 root/.docker/config.json,是管理你登录信息的,登录多个也都放在这个文件里
在这里插入图片描述

Docker的镜像管理实战

下一个命令是docker search

在这里插入图片描述
搜索镜像docker search

在这里插入图片描述
alpine,就是linux发行版,找到的其实都是dockerhub提供的
在这里插入图片描述
这个是alpine官方

在这里插入图片描述
在这里插入图片描述

建议用官方的

在这里插入图片描述
可以在docker命令行检索镜像,也可以在网页上检索镜像
在这里插入图片描述
下载镜像

在这里插入图片描述
现在已经下载下来了

在这里插入图片描述
从docker.io/library/alpine:latest下载的镜像。
docker.io是registry,library 是repository,alpine是镜像

registry_name远端仓库地址url/repository_name分类仓库名字/imgae_name镜像名:tag_name标签。
在这里插入图片描述
不加tag 默认最新版,也可以下载指定tag
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

library是docker.io默认公开仓库,可以省略 直接pull alpine就行,也可以写全,如果写 了自有仓库就需要写圈了
在这里插入图片描述
registry_name远端仓库地址url/repository_name分类仓库名字/imgae_name镜像名:tag_name标签。
在这里插入图片描述
查看本地镜像
在这里插入图片描述
新版的ce可以 image ls,但是老版还是习惯 images,把本地镜像列举出来了,hello-world是latest的标签,image id是哈希的字符串,created这个镜像何时被做出来的

在这里插入图片描述
3.10.3和latest的image的id一样,说明对应的是一个镜像,只是标签不一样,latest就是个指针,可以指向3.10.3,有可以执行3.10.1

在这里插入图片描述

在这里插入图片描述
给镜像打标签,给3.10.3打一个标签,刚才的仓库其实就是创建的dockerhub用户名
在这里插入图片描述
想要把打好标签的镜像推送上去
在这里插入图片描述
本身dockerhub有这个镜像id,我们其实只是推了一个tag过去
在这里插入图片描述
自己账户的profile里就有镜像了

在这里插入图片描述
在这里插入图片描述
这就是一个推送镜像的操作

在这里插入图片描述
再打一个标签

在这里插入图片描述
现在有4个alpine镜像

在这里插入图片描述
在这里插入图片描述

再次推送这个latest的镜像,拉镜像和推镜像默认走https协议。,自建的如果不走https,就配置insecure
在这里插入图片描述
现在就有了

在这里插入图片描述
这两个实际上是指向同一版的镜像

在这里插入图片描述
删除镜像

在这里插入图片描述
删除镜像,先删除本地的latest标签,rmi remove images,虽然用rmi,但是提示是untag,只是把标签去除了,并没有实质删除镜像
在这里插入图片描述
在这里插入图片描述
标签虽然没了,但是这个镜像还在

在这里插入图片描述
想要彻底删除镜像 ,rmi -f强制删除,先把是所有tag删除掉,然后再帮你把镜像删除
在这里插入图片描述
在这里插入图片描述
因为没有操作dockerhub,所以dockerhub上的还在

在这里插入图片描述
想要本地再回来,docker pull
在这里插入图片描述

Docker的镜像管理详解

主要是镜像和仓库之间的操作关系

镜像管理,查看本地镜像,docker images,拉pull,给镜像打标签tag,推送镜像,docker push,删除镜像,rmi(先删除镜像标签,彻底删除镜像,需要删除image id,同时有多个镜像,还需要-f,强制删除)
在这里插入图片描述
在这里插入图片描述
**实际上基于aufs来构建镜像的,docker镜像是典型的分层,最底层有bootfs,是整个docker镜像的,底层依赖的库和内核去交互的基础。
base image 基础镜像
add emacs emacs就是属于加的软件,文本编辑器 **

每一层镜像的下面一层称为其父镜像,真正的容器在最顶层。writeable就是可写的,可写的层才叫容器层。下面所有层都是readonly。
docker的镜像除了最上一层,其他都是只读的,所以就特别容易分层挂载,from base image派生很多镜像出来,当推送到仓库 时候,base image这一层有自己的image id的,不管往自建仓库推送,还是远程都是只推送增量部分,非常少。
生产中一个镜像加入1G,base image很大,但是每次变更的很小,其实也是很轻量,每次推拉就只是增量部分,这就是aufs最帮的优点

在这里插入图片描述

Docker容器基本操作1

容器的操作,之前是镜像的管理。
容器是由镜像实例化来的

在这里插入图片描述
在这里插入图片描述
docker ps是列出本地启动容器的进程,-a不管死活都列出来
在这里插入图片描述
如果是死的是列不出来,需要加-a,exited,就是容器已经退出了,进程消亡

在这里插入图片描述
再重新run一次
在这里插入图片描述
再次ps就是两个了,5秒之前死了一个,3小时之前也死了一个。
image就是对应的镜像

在这里插入图片描述
其实对应的就是这个镜像,看到镜像就要相处仓库名,分类仓库这个全称,作为基本要素
在这里插入图片描述
docker run是日常使用最频繁的命令之一

在这里插入图片描述
通过哪个镜像去启动,实例化这个容器,command就是命令,arg就是参数

在这里插入图片描述
-i表示启动一个可交互的容器,并且持续打开标准输入
-t 表示使用终端关联到容器的标准输入输出上,一般-i -t一起使用
-d表示将容器放在后台运行
–rm 退出后就删除容器
–name 定义容器名称
IMAGE 表示要运行的镜像
COMMAND ,表示启动容器时要运行的命令

在这里插入图片描述
不指定–name。就随机生成字符串
在这里插入图片描述

在这里插入图片描述
现在alpine镜像还在的

在这里插入图片描述

用交互式方式运行一个容器,容器之前申明的地址就是172.7.5.0/24
在这里插入图片描述

现在是up状态
在这里插入图片描述
现在用exit退出容器

在这里插入图片描述
现在就是exited状态
在这里插入图片描述
可以用非交互式的方法去启动一个容器

在这里插入图片描述
在这里插入图片描述
运行结束后查看ps -a,因为加了–rm,退出的时候自己就把 自己从 ps -a里删除了,所以只要一次性运行的容器用–rm还是比较好的
在这里插入图片描述

在这里插入图片描述
可以直接运行在后台,-d,可以不给/bin/sh,或者.bin/echo
在这里插入图片描述
这里显示之前退出了,名字式myalpine
在这里插入图片描述
如果在alpine这个镜像里没有指定特定的,就直接一个shell就退出了init为1 的pid就消亡了,如果真想启动容器在后台可以指定命令
在这里插入图片描述
在这里插入图片描述
现在就是up的,5分钟以后才挂掉,-d就是挂在后台

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
其实在宿主机上也能查到这个进程,docker虽然式隔离名称空间,但是在宿主机上依然可以查到进程

在这里插入图片描述
在这里插入图片描述
这里可以看到容器id

在这里插入图片描述

可以通过docker exec命令,进入到一个在up状态的容器,pid为1 的进程就是/bin/sleep
在这里插入图片描述
exec可以用交互式的方式,给一个容器id就可以进入容器

在这里插入图片描述
在这里插入图片描述
现在还在up状态

在这里插入图片描述
用stop可以停止,附上容器id

在这里插入图片描述
stop之后就变成exited了
在这里插入图片描述
再次启动,start
在这里插入图片描述
也可以restart重启
在这里插入图片描述
如果没有–name指定容器名字,就要容器id

在这里插入图片描述
用容器名字也可以
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
删除容器可以用容器id 也可以用容器名字
在这里插入图片描述
删除别的,都可以删除
在这里插入图片描述
不能删除这个容器,因为正在运行

在这里插入图片描述
只能强制删除

在这里插入图片描述
生产中比较有意思的操作就是,过滤所有退出的容器,进行删除
在这里插入图片描述
在这里插入图片描述

Docker容器基本操作2

再次run一个容器
在这里插入图片描述
现在对这个容器进行交互,创建文件,退出
在这里插入图片描述

1.txt实际上是写到了容器的writeable 可写层 ,如果重启容器,1.txt就没了,只是在容器的可写层,不在镜像里
在这里插入图片描述
想要把这个文件固化到容器里,需要commit,-p创建过程暂停,不会有其他写进来了,类似一个mysqldump参数,保持这个定点的数据,之后发生的数据不备份了,–signal-procession/-S
在这里插入图片描述

commit成一个新的镜像
在这里插入图片描述
下次启动这个镜像,就有1.txt,因为固化到只读层了
在这里插入图片描述
这样只是暂时把1.txt放到读写层

在这里插入图片描述
在这里插入图片描述
可能sed 1d 多余了,删除第一行

在这里插入图片描述
在这里插入图片描述
这样就没了
在这里插入图片描述
这就是提交和修改容器

在这里插入图片描述
现在想把这个镜像导出
在这里插入图片描述
可以用save,一般用镜像的image id多一些,使用>大于号或者-O都可以,一般以tar结尾
在这里插入图片描述
把这个镜像删除

在这里插入图片描述
可以把直接导出的,导回来,load回来,但是没有标签
在这里插入图片描述
加个标签就回来了
在这里插入图片描述
再次run起来,有1.txt说明,固化到镜像里了,可以把镜像导出为文件,也可以把文件导入成镜像
在这里插入图片描述
加了–rm,退出以后就删除了

在这里插入图片描述
在这里插入图片描述
命令总结

在这里插入图片描述
标准错误输出,重定向到标准输出,然后打入到/dev/null
在这里插入图片描述
现在有一个已经退出的容器进程
在这里插入图片描述
logs+containerid

在这里插入图片描述
直接run是直接在终端上打印出来信息,现在追加到/dev/null。等于日志

在这里插入图片描述
等于不在当前linux主机上输出了
在这里插入图片描述
用logs就可以看到容器的标准输出是什么
在这里插入图片描述
如果外面把信息传递掉了,但是想看这个容器做了什么,就用logs

在这里插入图片描述
-f,类似tail -f,监视动态输出

在这里插入图片描述
到后面的k8s,kubectl logs和docker logs效果一样,程序运行会有stdout,你要看是否正常,就可以用 docker logs,比较容易看到容器是否运行正常

常用的容器命令
在这里插入图片描述
进入容器,提交容器

在这里插入图片描述
导入,导出
在这里插入图片描述
docker还有很多不常用的
attach,附加到一个容器里,类似exec
build 制作dockerfile
create 创建一个空的容器,一般都是from基础镜像去做容器
diff 比较容器的差别
events 看事件
export,学会commit即可
import和export都不如load 和save用的多
kill 不需要杀,rm -f相当于先kill再rm、

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值