为什么要学习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(容器里部署的服务的端口)-> 就可以访问到容器里部署的应用了

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐