1、什么是docker
容器化和虚拟化对比
▪开源的应用容器引擎,基于 Go 语言开发
▪容器是完全使用沙箱机制,容器开销极低
▪Docker就是容器化技术的代名词
▪Docker也具备一定虚拟化职能
docker三大核心:
-
Docker Engine: 提供了一个可以用来运行和管理容器的平台,它由客户端和服务端组成。
-
Docker Compose: 用于定义和运行多容器Docker应用的工具(单机)。
-
Docker Swarm: 用于管理Docker集群的工具,可以将多个Docker主机组成的系统转换为单一的虚拟Docker主机(集群)。
2、容器与镜像
▪镜像: 镜像是文件,是只读的,提供了运行程序完整的软硬件资源,是应用程序的"集装箱"
▪容器: 是镜像的实例,由Docker负责创建,容器之间彼此隔离
3、docker执行流程
4、docker常用指令
docker pull 镜像名<:tags> - 从远程仓库抽取镜像
docker images - 查看本地镜像
docker run 镜像名<:tags> - 创建容器,启动应用
docker ps - 查看正在运行中的镜像
docker rm <-f> 容器id - 删除容器
docker rmi <-f> 镜像名:<tags> - 删除镜像
--容器中执行的命令
格式:docker exec [-it] 容器id 命令
exec 在对应容器中执行命令
-it 采用交互方式执行命令
实例:docker exec -it 0738ed2fe68b /bin/bash
5、Dockerfile构建镜像
▪Dockerfile是一个包含用于组合镜像的命令的文本文档
▪Docker通过读取Dockerfile中的指令按步自动生成镜像
▪docker build -t 机构/镜像名<:tags> Dockerfile目录
tomcat部署应用的dockerfile
FROM tomcat:latest
MAINTAINER ccp
WORKDIR /usr/local/tomcat/webapps --设置工作目录
ADD docker-web ./docker-web --复制文件(从宿主机复制到容器)
xxl-job对应的dockerfile
FROM openjdk:8-jre-slim
MAINTAINER xuxueli
ENV PARAMS=""
ENV TZ=PRC --设置环境常量
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
--RUN 相当于在Build构建时执行命令
ADD target/xxl-job-admin-*.jar /app.jar --复制文件
ENTRYPOINT ["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]
--ENTRYPOINT 容器启动时执行的命令
--CMD 容器启动后执行默认的命令或参数
6、镜像分层(layer)
7、dockerFile执行命令
ENV 设置环境常量
RUN 相当于在Build构建时执行命令
ADD 复制文件
ENTRYPOINT 容器启动时执行的命令
CMD 容器启动后执行默认的命令或参数
8、容器间通信
Link单向通信
Bridge网桥双向通信
网桥实现原理--虚拟网卡
9、容器间数据共享(volumn)
格式:
docker run --name 容器名 -v 宿主机路径:容器内挂载路径 镜像名
实例:
docker run --name t1 -v /usr/webapps:/usr/local/tomcat/webapps tomcat
▪创建共享容器
▪docker create --name webpage -v /webapps:/tomcat/webapps tomcat /bin/true
▪共享容器挂载点
▪docker run --volumes-from webpage --name t1 -d tomcat
10、Kubernetes的职责
▪自动化容器的部署和复制
▪随时扩展或收缩容器规模
▪容器分组Group,并且提供容器间的负载均衡
▪实时监控, 即时故障发现, 自动替换
10.1、基本概念
10.2、pod的概念
▪POD是"容器"的容器,可以包含多个"Container"
▪POD是K8S最小可部署单元,一个POD就是一个进程
▪POD内部容器网络互通,每个POD都有独立虚拟IP
▪POD都是部署完整的应用或模块
▪Pause容器是基于Docker的pause镜像实现的,它本身不包含任何业务逻辑,但为其他容器提供了网络、存储卷和其他资源的共享访问。Pause容器充当Pod中其他容器的父进程,帮助管理它们的生命周期。它还负责创建和配置Pod的网络命名空间,确保Pod内容器之间的网络通信
10.3、service
-
Service 主要用于提供网络服务,通过 Service 的定义,能够为客户端应用提供稳定的访问地址(域名或 IP 地址)和负载均衡功能,以及屏蔽后端 Endpoint 的变化,是 K8s 实现微服务的核心资源。
利用Rinetd(端口转发工具)实现service的负载均衡
▪Rinetd是Linux操作系统中为重定向传输控制协议工具
▪可将源IP端口数据转发至目标IP端口
▪在Kubernetes中用于将service服务对外暴露
10.4、文件集群共享(NFS)
▪NFS,是由SUN公司研制的文件传输协议
▪NFS主要是采用远程过程调用RPC机制实现文件传输
▪yum install -y nfs-utils rpcbind
10.5、kubeadm/kubelet/kubectl区别
▪kubeadm是kubernetes集群快速构建工具
▪kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现
▪kubectl:kubectl是kubenetes命令行工具,提供指令
10.6、部署(Deployment)
▪部署是指Kubernetes向Node节点发送指令,创建容器的过程
▪Kubernetes支持yml格式的部署脚本
▪kubectl create -f 部署yml文件 #创建部署
部署yml样例
与部署相关命令
▪kubectl create -f 部署yml文件 #创建部署
▪kubectl apply -f 部署yml文件 #更新部署配置
▪kubectl get pod [-o wide] #查看已部署pod
▪kubectl describe pod pod名称 #查看Pod详细信息
▪kubectl logs [-f] pod名称 #查看pod输出日志
▪kubectl delete deployment|service #删除部署(Deployment)|服务(Service)
资源限定
containers:
- name: tomcat-cluster
image: tomcat:latest
resources:
requests:
cpu: 1
memory: 500Mi
limits:
cpu: 2
memory: 1024Mi
10.7、pod自动扩缩容
手动模式:通过 kubectl scale 命令,这样需要每次去手工操作一次,而且不确定什么时候业务请求量就很大了,所以如果不能做到自动化的去扩缩容的话,这也是一个很麻烦的事情。
自动模式:
1、kubernetes HPA(Horizontal Pod Autoscaling):根据监控指标(cpu 使用率、磁盘、自定义的等)自动扩容或缩容服务中的pod数量,当业务需求增加时,系统将无缝地自动增加适量 pod 容器,提高系统稳定性。
2、kubernetes KPA(Knative Pod Autoscaler):基于请求数对 Pod 自动扩缩容,KPA 的主要限制在于它不支持基于 CPU 的自动扩缩容。
3、kubernetes VPA(Vertical Pod Autoscaler):基于 Pod 的资源使用情况自动设置 pod 的 CPU 和内存的 requests,从而让集群将 Pod 调度到有足够资源的最佳节点上。
各节点CPU、内存等资源的 metrics 信息可以通过 Metrics API 来获取,用户可以直接获取这些 metrics 信息(例如通过执行 kubect top 命令),HPA 使用这些 metics 信息来实现动态伸缩。