文章目录
为什么要学习docker、k8s、prometus?
现在是云计算、云原生的时代。云计算的背后就是虚拟化,容器是目前为止最新最潮的虚拟化技术,学习最新最潮的技术,紧跟时代步伐。
各大互联网厂商、云计算公司都在加大对云原生相关的投入,docker、k8s等就是云原生相关的技术,并且他们都是用go语言开发的,想深入研究。
1、虚拟化
是云计算里面很底层的技术。
使用OpenStack将一堆的物理机器资源整合,用虚拟化软件虚拟出一台台机器给别人提供服务。云计算的背后就是虚拟化。
openstack官网
云服务背后也是虚拟化。
虚拟化的背后就牵扯到容器。容器是轻量级的虚拟化(轻量级的虚拟机),更加节省资源(cpu、内存、磁盘、带宽)。
docker:提供容器技术的软件
k8s:提供容器集群管理的软件。可以管理很多台服务器上的docker启动的容器。 容器集群编排工具
容器里面的k8s就相当于服务器领域的openstack。可以实现容器的分布式管理。
虚拟化技术:
KVM(基于Linux内核的虚拟机 ):通过Linux内核虚拟出很多机器,这个技术需要硬件的支持。开源,内核级别的
VMWare :和KVM同级别,但是要收费。openstack是基于它们之上的,它可以模拟出很多虚拟机,底层运用的是KVM。
VirtualBox: oracle公司的,同VMWare,但是VMWare更好用。
2、云计算
IaaS: Infrastructure as a Service 这层的作用是提供虚拟机或者其他资源作为服务提供给用户 -->卖基础设施–》卖云服务器 --》阿里云、腾讯云、华为云、aws(亚马逊云)、google云、azure(微软云)
PaaS: Platform as a Service 组件服务(比如存储、cdn、直播等等)–》背后有一个公司搭建好了平台,我们去购买服务就可以
在平台里买软件七牛云作为国内知名的云平台即服务(PaaS)提供商,提供海量文件存储、CDN内容分发、视频点播、互动直播及机器数据智能分析与处理等服务,致力于以数据科技全面驱动数字化未来,
SaaS: Software as a Service 这层的作用是将应用作为服务提供给客户。通过这种模式,用户只要接上网络,并通过浏览器,就能直接使用在云端上运行的应用,而不需要顾虑类似安装等琐事。
–》WPS提供多人编辑文档,存储 --》卖某个软件的使用权 WPS: 金山公司推出的办公软件 --》word,excel,ppt等软件
BaaS: BlockChain as a Service --》卖区块链服务的
3、容器和虚拟机
-
什么是虚拟机?
虚拟机(VM)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。简单讲是可以实现在一台物理计算机上模拟多台计算机运行任务。
常见的虚拟机软件:
Vmware Workstation、VirtualBox、KVM、Hyper-V、Xen 等
优点:
1、一台主机,通过安装不同系统环境的虚拟机、与运行单独的实体服务器相比是经济的。
2、虚拟机与主机操作系统隔离,虚拟机上的操作不影响主机 -
什么是容器?
容器是一种沙盒技术,主要目的是为了将应用运行在其中,与外界隔离;及方便这个沙盒可以被转移到其它宿主机器。通俗点的理解就是一个装应用软件的箱子,箱子里面有软件运行所需的依赖库和配置。开发人员可以把这个箱子搬到任何机器上,且不影响里面软件的运行
左侧是虚拟机的架构。可以看出,有 4 个操作系统(Operating System) ,分别是 Host
Operating System 和 3 个 Guest Operating System。每个虚机中都有一个独立的 Kernel.
右侧为容器架构,很明显图中只有一个操作系统,即只有一个独立的 Kernel。
虚拟机要多走一层,Hypervisor。容器直接调用宿主机的操作系统。
hypervisor
Hypervisor,又称虚拟机监视器(英语:virtual machine monitor,缩写为 VMM),是用来建立与执行虚拟机器的软件、固件或硬件。
被 Hypervisor 用来执行一个或多个虚拟机器的电脑称为主体机器(hostmachine),这些虚拟机器则称为客体机器(guest machine)。
hypervisor 提供虚拟的作业平台来执行客体操作系统(guest operating systems),负责管理其他客体操作系统的执行阶段;
这些客体操作系统,共同分享虚拟化后的硬件资源。
- 启动
docker是秒级别启动;
虚拟机需要几分钟; - 资源
docker需要的资源少,是在操作系统级别进行虚拟化。docker容器是和内核进行交互 - 量级
docker是轻量级的虚拟化软件,占用内存小;
虚拟机是重量级的,占用内存大; - 隔离性
docker隔离性弱,是进程之间的隔离;
虚拟机是系统级别的隔离; - 安全性
docker安全性更弱 - 可管理性
docker集中化管理工具弱于虚拟机;
虚拟机的管理工作很成熟; - 高可用和搞恢复性
docker对业务的高可用的支持,并通过快速重新部署来实现;
虚拟机具备负载均衡、高可用、容错的成熟机制; - 交付、部署
虚拟机可以通过镜像实现统一的支付,但镜像分发无法体系化;
docker的dockerfile中记录了容器的构建过程,可以集中实现快速分发和快速部署。 - 层次
虚拟机多封装了一层hypervisor
4、仓库&镜像&容器
仓库:集中存放镜像的地方
https://hub.docker.com/
http://hub.daocloud.io/ 国内的道云公司提供的镜像下载的地方
镜像:image, 就是打包好的软件
相当于安装系统的系统盘——centos.iso
就是软件单元: 里面包含app软件代码,微型的操作系统,相关的库 --》镜像理解为软件也可以
镜像是人制作出来的,里面有程序的源代码和其他的环境
组成:程序代码、基础系统、依赖关系的软件包、系统库、工具
nginx的镜像:nginx的程序代码、centos系统,gcc基本库,工具等——》包含了软件的微型系统
Docker容器镜像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、系统库和设置。
容器:运行镜像的地方
背后就是启动一个进程来运行镜像, 在容器里面不是所有的东西都有的
软件安装的方式: docker运行某个软件的容器,颠覆了传统的软件安装的方式
默认使用容器安装的系统,里面是一个微型的系统,很多命令都是没有的,但是我们可以自己去安装
5、Docker优缺点
在k8s中,
1.24版本之前: docker做容器;
1.24版本之后:containerd做容器。
那为什么还要学docker?
1、docker的有些功能containerd是无法实现的。比如:制作镜像的时候依赖于docker build
containers在k8s中主要负责启动pod
2、Docker就是容器的一个代表,相当于把服务打包到docker容器里
一个 Java 代码,需要通过 mvn 编译,编译源码之后会生成 war 包或者 jar 包,可以把 jar 包启动,就可以对外提供服务了(能正常访问页面,做操作)。如果是 war 包,需要弄到 tomcat 服务的 webapp 目录下,去启动。
没有用容器之前通常会出现如下问题:
1.开发环境没问题,测试环境报错---->排查后发现是启动脚本里 jdk 版本跟代码要求的版本不匹配
2.测试环境没问题,生产环境报错 -->排查发现是 tomcat 版本和 jdk 版本不匹配。
docker优点
- 启动速度快
- 资源消耗少
资源可以控制(cpu和内存,磁盘速度和iops等)
共享宿主机的内核,基础镜像(消耗的内存少) - 扩展方便
HPA,增加和减少容器
docker缺点:隔离性没有虚拟机好
6、Docker安装与配置
官网linux安装
1、卸载旧版docker
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、下载docker-ce的仓库文件,方便后面的安装
yum install -y yum-utils # 安装yum-utils得到yum-config-manager相关命令
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo # 下载docker-ce的仓库文件,方便后面的安装
3、Install Docker Engine 开始安装docker
yum install docker-ce docker-ce-cli containerd.io -y 安装
# docker-ce 核心软件,引擎
# docker-ce-cli 客户端工具,给用户使用的客户端工具集 client
# containerd.io --》管理容器运行时的工具 --》docker相关的组件
4、启动docker服务
# 启动docker服务
systemctl start docker
# 设置开机启动
systemctl enable docker
# 查看docker相关的进程 dockerd
ps aux|grep docker
7、Docker内核参数调优
1】开启包转发功能和修改内核参数。
内核参数修改:br_netfilter模块用于将桥接流量转发至iptables链,br_netfilter内核参数需要开启转发。
[root@xianchaomaster1 ~]# modprobe br_netfilter
[root@xianchaomaster1 ~]# cat > /etc/sysctl.d/docker.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
使参数生效 :sysctl -p /etc/sysctl.d/docker.conf
2】重启后模块失效,下面是开机自动加载模块的脚本
#在/etc/新建rc.sysinit 文件
cat /etc/rc.sysinit
#!/bin/bash
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file done
3】在/etc/sysconfig/modules/目录下新建文件如下
[root@xianchaomaster1 ~]#cat /etc/sysconfig/modules/br_netfilter.modules
modprobe br_netfilter
#增加权限
[root@xianchaomaster1 ~]#chmod 755 /etc/sysconfig/modules/br_netfilter.modules
重启机器模块也会自动加载
[root@xianchaomaster1 ~]#lsmod |grep br_netfilter
br_netfilter 22209 0
bridge 136173 1 br_netfilter
4】Docker 安装后出现:WARNING: bridge-nf-call-iptables is disabled 的解决办法:
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1:
将Linux系统作为路由或者VPN服务就必须要开启IP转发功能。当linux主机有多个网卡时一个网卡收到的信息是否能够传递给其他的网卡 ,如果设置成1 的话 可以进行数据包转发,可以实现VxLAN 等功能。不开启会导致docker部署应用无法访问。
systemctl restart docker
重启docker
8、Docker阿里云镜像仓库加速器配置
注册登录阿里云,开通镜像加速器,获取地址:
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
修改/etc/docker/damon.json
{
"registry-mirrors":["https://y8y6vosv.mirror.aliyuncs.com",
"https://registry.dockercn.com",
"https://docker.mirrors.ustc.edu.cn",
"https://dockerhub.azk8s.cn",
"http://hubmirror.c.163.com"]
}
让配置文件生效
sudo systemctl daemon-reload
sudo systemctl restart docker
[root@zabbix ~]# ps aux|grep container
/usr/bin/docker-proxy # 容器网络相关的进程,实现容器和其他容器宿主机网络通信的
/usr/bin/containerd-shim-runc-v2 #真正启动容器的进程
- 如何你的容器不能联网,排查思路
1.你的真实机器是否可以上网
2.重新启动docker服务
3.如果是访问国外的网站,考虑墙的问题,国内的镜像站点的问题
9、Docker镜像操作
docker search centos # 查找镜像
docker pull centos # 拉取镜像
docker images # 查看本地镜像
docker save -o centos.tar.gz centos # 打包镜像
docker load -i centos.tar.gz # 解压镜像
docker rmi -f centos:latest # 删除镜像
10、Docker容器操作
# 交互式启动并进入容器,exit退出后容器停止运行
docker run --name=hello -it centos /bin/bash
# 以守护进程方式启动容器,-t分配为终端,-d以守护进程方式
docker run --name=hello1 -td busybox
# 进入容器,退出后容器依然运行
docker exec -it hello1 /bin/sh
docker stop/start/logs 容器名
docker rm -f 容器名/id
docker --help # 查看所有docker命令,自己查看了解
11、Docker部署nginx服务
基于centos镜像运行容器,在容器里面安装nginx服务。
# 1、运行容器
docker run --name nginx -p 80 -itd centos
# 2、进入容器
docker exec -it nginx /bin/bash
# 3、查看容器的id
ip addr
# 4、yum安装nginx
rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-
8.5.2111.repo
yum install wget -y
yum install nginx -y
# 5、安装文本编辑器vim
yum install vim-enhanced -y
# 6、创建静态页面
mkdir /var/www/html -p
cd /var/www/html/
cat index.html
<html>
<head>
<title>nginx in docker</title>
</head>
<body>
<h1>hello,My Name is xianchao</h1>
</body>
</html>
# 7、修改nginx配置文件中的root路径,如下
vim /etc/nginx/nginx.conf
root /var/www/html/;
# 8、查看容器(能查看到nginx容器在物理机映射的端口是49153 )
[root@xianchaomaster1 ~]# docker ps | grep nginx
ecfa046e9681 centos "/bin/bash"
12 minutes ago Up 12 minutes 0.0.0.0:49153->80/tcp, :::49153->80/tcp nginx
# 9、直接访问curl http://192.168.40.180:49153
流量走向:
访问物理节点ip:port(容器在物理节点映射的端口)–→容器ip:port(容器里部署的服务的端口)-> 就可以访问到容器里部署的应用了