赞
踩
Docker 是一个开源项目, 诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0协议, 项目代码在 GitHub 上进行维护。Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc。Redhat 已经在其 RHEL6.5 中集中支持 Docker;Google 也在其 PaaS 产品中广泛应用。Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容( LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装, 让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
官方解释:
作为一种新兴的虚拟化方式, Docker 跟传统的虚拟化方式相比具有众多的优势。首先, Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而 Docker 只需要启动 10 个隔离的应用即可。具体说来, Docker 在如下几个方面具有较大的优势:
对比传统的虚拟机docker的好处:
镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
2.容器(Container)
容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
3.仓库(Repository)
仓库是集中存放镜像文件的场所。有时候会把仓库和仓库注册服务器( Registry)混为一谈,并不严格区分。 实际上,仓库注册服务器上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签( tag)。仓库分为公开仓库( Public)和私有仓库( Private) 两种形式。
最大的公开仓库是 Docker Hub(https://hub.docker.com)存放了数量庞大的镜像供用户下载。 国内的公开仓库包括 Docker Pool(http://dockerpool.com) 等,可以提供大陆用户更稳定快速的访问。
当然,用户也可以在本地网络内创建一个私有仓库。当用户创建了自己的镜像之后就可以使用 push 命令将它上传到公有或者私有仓库,这样下次在另外一台机器上使用这个镜像时候,只需要从仓库上 pull 下来就可以了。
yum install docker
systemctl enable docker
systemctl start docker
apt-get update
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
apt-get update
apt-cache madison docker-ce
#安装指定版
#apt-get install docker-ce=17.12.0ce-0ubuntu
#安装最新版
apt-get install docker-ce
systemctl enable docker
systemctl start docker
1,docker info: 查看当前docker的所有配置信息 2,docker pull [镜像名称]: 远程拉取image. eg: [docker pull library/hello-world -等同于-> docker pull hello-world]其中library是image所在的组,docker官方的 镜像都在这个组内.docker pull hello-world等同于 docker pull hello-world. 拉取DockPool镜像: docker pull dl.dockerpool.com:5000/{IMAGE_NAME}:{TAG} 3,docker build 创建image docker build -f cenosAddVimDockerfile -t mycentos:1.0 . 4,docker images: 列出本地所有的image docker load -i 镜像名称.tar docker tag [镜像id] [新镜像名称]:[新镜像标签] 5,docker run: 运行容器container docker run [可选参数] image 命令 #启动容器(无镜像会先下载镜像) #参数说明 --name = "Name" 容器名字 -c 后面跟待完成的命令 -d 以后台方式运行并且返回ID,启动守护进程式容器 -i 使用交互方式运行容器,通常与t同时使用 -t 为容器重新分配一个伪输入终端。也即启动交互式容器 -p 指定容器端口 -p 容器端口:物理机端口 映射端口 -P 随机指定端口 -v 给容器挂载存储卷 -v 容器内路径 #匿名挂在 -v 卷名:容器内路径 #具名挂在 -v /宿主机路径:容器内路径 # 指定路径挂载 -v /宿主机路径:容器内路径:ro # 指定路径挂载,并设置只读权限 -v /宿主机路径:容器内路径:rw # 指定路径挂载,并设置读写权限默认是rw 第一种:交互方式创建容器,退出后容器关闭: docker run -it 镜像名称:标签 /bin/bash 第二种:守护进程方式创建容器: docker run -id 镜像名称:标签. 通过这种方式创建的容器,我们不会直接进入到容器界面,而是在后台运行了容器,如果我们需要进去,则还需要一个命令。 docker exec -it containerID /bin/bash: 通过这种方式运行的容器,当使用exit退出时,容器不会停止,需要停止输入:docker stop containerID 就可以停止容器,只有停止的容器才能删除. docker attach containerID:对于正在运行的容器,使用该命令可以进入容器,输入exti会停止容器 docker rename 原容器名 新容器名 6,docker ps: 列出当前运行的容器container docker container ls: 列出本机正在运行的容器 docker container ls -all: 列出本机所有容器,包括终止运行的容器 7,docker [rm | stop | restart] [容器id]: 删除已经结束的容器container => 等价于:docker container rm [containerID]: 8,docker cp [当前文件的] [容器id:/容器下面的文件目录] 在本地和容器之间拷贝文件 9,docker commit -m [提示信息] [容器id] [新镜像名称]: 保存改动生成新的image 10,docker rmi 删除image
Dockerfile 是一个由一堆命令+参数构成的脚本,使用 docker build 即可执行脚本构建镜像,自动的去做一些事,主要用于进行持续集成。
具体命令如下:
1.FROM: 1.FROM指定一个基础镜像, 一般情况下一个可用的 Dockerfile一定是FROM为第一个指令。至于image则可以是任何合理存在的image镜像。 2.FROM 一定是首个非注释指令 Dockerfile。 3.FROM 可以在一个 Dockerfile 中出现多次,以便于创建混合的images。 4.如果没有指定 tag ,latest 将会被指定为要使用的基础镜像版本 2.MAINTAINER | LABEL: 这里是用于指定镜像制作者的信息。(已被弃用,目前是使用LABEL代替) LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下: LABEL <key>=<value> <key>=<value> <key>=<value> ... 比如我们可以添加镜像的作者: LABEL org.opencontainers.image.authors="runoob" 3.RUN: 用来修改镜像的命令,常用来安装库、程序以及配置程序。一条RUN指令执行完毕后,会在当前镜像上创建一个新的镜像层,接下来对的指令会 1在新的镜像上继续执行。 4.CMD: 用来设置启动容器时默认运行的命令。类似于 RUN 指令,用于运行程序(只有最后一个会生效,可被替代) 5.EXPOSE: 用来指明容器内进程对外开放的端口,多个端口之间使用空格隔开。 6.ENV:#设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量 1.ENV指令可以用于为docker容器设置环境变量 2.ENV设置的环境变量,可以使用 docker inspect命令来查看。同时还可以使用docker run --env =来修改环境变量。。 7.ADD: # 步骤:tomcat镜像,这个tomcat压缩包。添加内容。 ADD 将文件从路径 复制添加到容器内部路径 。向新镜像中添加文件,这个文件可以是一个主机文件,也可以是一个网络文件, 也可以使一个文件夹。 第一个参数:源文件(夹),如果是相对路径,它必须是相对于Dockerfile所在目录的相对路径。如果是URL,会先下载下来,再添加到镜像里去。 第二个参数:目标路径。如果源文件是主机上zip或者tar形式的压缩文件,Docker会先解压缩,然后将文件添加到镜像的指定位置。如果源文件是一个通过URL指定的网络压缩文件,则不会解压。 8.COPY: COPY 将文件从路径 复制添加到容器内部路径。必须是想对于源文件夹的一个文件或目录,也可以是一个远程的url, 是目标容器中的绝对路径。 9.VOLUME: 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等。 10.USER: 用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。 11.WORKDIR: 为接下来执行的指令指定一个新的工作目录,这个目录可以使绝对目录,也可以是相对目录 12.ENTRYPOINT: 类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,会追加命令。 13.ONBUILD: 当构建一个被继承Dokcerfile,就会运行ONBUILD的指令。出发执行。 注意:CMD类似于 RUN 指令,用于运行程序,但二者运行的时间点不同: CMD 在docker run 时运行。 RUN 是在 docker build。 作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。 CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。 如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。
Kubernetes(通常称为K8s,K8s是将8个字母“ubernete”替换为“8”的缩写)是一个完备的分布式系统支撑平台。Kubernetes具有完备的集群管理能力,包括多层次的安全防护和准入机制/多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复功能、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。同时kubernetes提供了完善的管理工具,这些工具覆盖了包括开发、测试部署、运维监控在内的各个环节;因此kubernetes是一个全新的基于容器技术的分布式架构解决方案,并且是一个一站式的完备的分布式系统开发和支撑平台。
具体架构如上图所示,下面来详细介绍一下各个模块的功能
Kubernetes 里的Master指的是集群控制节点,每个Kubernetes集群里需要有一个Master节点来负责整个集群的管理和控制,基本上Kubernetes所有的控制命令都发给它,它负责具体的执行过程,我们后面执行的所有命令基本上都是在Master节点上运行的。如果Master宕机或不可用,那么集群内容器的管理都将失效master节点上运行一些关键进程:
除了Master,集群中其他机器被称为Node节点,每个Node都会被Master分配一些工作负载docker容器,当某个Node宕机时,其上的工作负载会被Master自动转移到其他节点上去。
每个Node节点上都运行着以下一组关键进程:
查看当前nodes:kubectl get nodes
然后通过下面命令查看某个node的详细信息:kubectl describe node <node_name>
在集群管理方面,Kubernets将集群中的机器划分为一个Master节点和一群工作节点(Node),其中,在Master节点上运行着集群管理相关的一组进程kube-apiserver、kube-controller-manager和kube-scheduler,这些进程实现了整个集群的资源管理、Pod调度、弹性收缩、安全控制、系统监控和纠错等管理功能,并且都是全自动完成的。Node作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的kubelet、kube-proxy服务进程,这些服务进程负责Pod创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡
Pod是kubernetes最重要也最基本的概念,如图所示是Pod的组成示意图,我们看到每个Pod都有一个特殊的被称为“根容器”的Pause容器对应的镜像属于Kubernetes的平台的一部分,除了Pause容器,每个Pod还包含一个或多个紧密相关的用户业务容器。
每个pod由一个根容器的pause容器,其他是业务容器。k8s为每个pod分配了唯一的IP地址,一个pod里的多个容器共享pod IP。
pod其实有两种类型:普通的pod和静态pod,后者比较特殊,它并不存放在etcd存储中,而是存放在某个具体的Node上的一个具体文件中,并且只在此Node上启动运行。而普通的pod一旦被创建,就会被放入etcd中存储。随后被master调度到某个具体的Node上并进行绑定,随后该pod被对应的Node上的kubelet进程实例化成一组相关的docker容器并启动起来。
每个pod都可以对其使用的服务器上的计算资源设置限额,当前可以设置限额的源有CPU和memory两种。其中CPU的资源单位为CPU的数量。一般而言,一个CPU的配额已经算是相当大的一个资源配额,所以在k8s中,通常以千分之一的CPU配额为最小单位,以m来表示,通常一个容器的CPU配额为100-300m,即占用0.1-0.3个CPU。这个配额是个绝对值,不是占比。
在k8s中,一个计算资源进行配额限定需要设定两个参数:requests,资源的最小申请量,系统必须满足要求
一个label是一个key=value的键值组合,然后可以通过label selector(标签选择器)查询和筛选拥有某些label的资源对象。(Label 相当于我们熟悉的标签,给某个资源对象定义一个Label,就相当于给它打了一个标签,随后可以通过Label Selector 标签选择器 查询和筛选有某些Label的资源对象。Kubernetes通过这种方式实现了类似SQL的简单又通用的对象查询机制)。
label的重要使用场景:
kube-controller进程通过资源对象RC上定义的label selector来筛选要监控的pod的数量,从而实现全自动控制流程。
kube-proxy进程通过service的label selector来选择对应的pod,自动建立起每个service到对应pod的请求转发路由表。从而实现service的智能负载均衡机制。
&emsp当我们定义了一个RC并提交到Kubernetes集群中以后,Master节点上的Controller Manager组件就得到通知,定期巡检系统中当前存活的目标Pod,并确保目标Pod实力的数量刚好等于此RC的期望值,如果有过多的Pod副本在运行,系统就会停掉一些Pod,否则系统就会再自动创建一些Pod。 可以说,通过RC,Kubernetes实现了用户应用集群的高可用性,并大大减少了传统IT需要手动的工作。RC定义了如下
通过手动执行kubectl scale命令,可以通过RC实现pod扩容。HPA,pod横向自动扩容,实现原理是通过追踪分析RC控制的所有目标Pod的负载变化情况,来确定是否需要针对性地挑战目标pod的副本数。有两种方式作为pod负载的度量指标。
Service是Kubernetes里最核心的资源对象之一,Service定义了一个服务的访问入口地址,前端的应用(Pod)通过这个入口地址访问其背后的一组由Pod副本组成的集群实力。 Service与其后端Pod副本集群之间则是通过Label Selector来实现"无缝对接"。而RC的作用实际上是保证Service 的服务能力和服务质量处于预期的标准。
每个pod会被分配一个独立的IP地址,也就是每个pod都提供一个独立的endpoint(IP+port)以被访问,那多个pod如何被客户端访问呢,k8s通过运行在每个Node上的kube-proxy进程,负责将对service的请求转发到后端某个pod实例上,也就实现了类似负载均衡器的功能,至于具体转发到哪个pod,则由负载均衡器的算法所决定。并且service不是共用一个负载均衡器的IP地址,而是每一个service分配了一个全局唯一的虚拟IP,这样每个服务就变成了具有唯一IP的通信节点,服务调用也就变成了最为基础的TCP通信问题。
pod的Endpoint地址会随着Pod的销毁和重新创建而发生改变,因为新的Pod地址与之前的旧的Pod不同。而Service一旦被创建,Kubernetes就会自动为它分配一个可用的Cluster IP,而且在Service的整个声明周期内,它的Cluster IP不会发生改变。所以只要将Service的name与Service的Cluster IP地址做一个DNS域名映射即可解决问题。
k8s的服务发现机制:每个service都有一个唯一的cluster IP以及唯一的名字,而名字是由开发者自己定义的,部署的时候也没必要改变,所以完全可以固定在配置中,接下来的问题 就是如何通过service的名字找到对应的cluster IP。
外部系统访问service的问题:
k8s中有三种IP:
首先,Node IP是k8s集群中每个节点的物理网卡的IP地址,这是一个真实存在的物理网络,所有属于这个网络的服务器之间都能直接通信,不管属不属于k8s集群。这也表明了k8s集群之外的节点访问k8s集群之内的某个节点后者TCP/IP服务的时候,必须要通过Node IP通信。
其次,pod IP是每个Pod的IP地址,它是根据docker网桥的IP地址段进行分配的,通常是一个虚拟的二层网络,因此不同pod之间的通信就是通过Pod IP所在的虚拟二层网络进行通信的。而真实的TCP/IP流量则是通过Node IP所在的物理网卡流出的。
Cluster IP,它是一个虚拟IP,但更像是一个伪造的IP网络
Volume是pod中能够被多个容器访问的共同目录。也就是被定义在pod上,然后被一个pod中的多个容器挂载到具体的文件目录下,其次,volume与pod生命周期相同,但与容器生命周期不相关,当容器终止或重启,volume中的数据也不会丢失
大多数情况下用于实现多租户的资源隔离,namespace通过将集群内部的资源对象分配到不同的namespace中,形成逻辑上分组的不同项目、小组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
namespace的定义很简单,如下所示的yaml定义了名为development的
namespace
apiVersion: v1
kind: Namespace
metadata:
name: development
一旦创建了Namespace,我们在创建资源对象时就可以指定这个资源对象属于哪个namespace,比如下面,定义了名为busybox的Pod,放入development这个namespace里:
apiVersion: v1
kind: Pod
metadata:
name: busybox
namespace: development
1,kubectl get用来获取资源信息列表,可用来查看pod是否健康,当前的运行状态,重启了几次,生命周期等,是最常用的命令之一
kubectl get pod: 获取pod资源列表,默认获取default命名空间 kubectl get pod -n kube-system: 获取kube-system命名空间的pod资源列表 kubectl get pod --all-namespaces: 获取所有命名空间的pod资源列表 kubectl get pod -n kube-system kube-apiserver-k8s-01: 获取kube-system命名空间中指定的pod:kube-apiserver-k8s-01的信息。当查看某个具体的pod时,必须指明该pod所在的命名空间,像–all-namespaces参数是不能使用的 kubectl get pod -n kube-system kube-apiserver-k8s-01 -o wide: 获取kube-system命名空间中指定的pod:kube-apiserver-k8s-01的信息,并且展示更多信息,包括pod ip,所在节点等信息 kubectl get pod -n kube-system kube-apiserver-k8s-01 -o yaml: 获取kube-system命名空间中指定的pod:kube-apiserver-k8s-01的信息,并且以yaml格式展示pod详细信息 kubectl get pod -n kube-system kube-apiserver-k8s-01 -o json: 获取kube-system命名空间中指定的pod:kube-apiserver-k8s-01的信息,并且以json格式展示pod详细信息 kubectl get pod --all-namespaces --watch: 监控pod资源的变化 上述命令中的pod为kubernetes集群中的一种资源对象,其它资源对象,例如:deployment、deamonset、endpoint、ingress、services、secrets等等,都可以用get命令,全部的资源对象详见这里
2, kubectl describe: 打印所选资源的详细描述信息,当pod启动异常的时候也可以用该命令排查问题
kubectl describe -n kube-system pod kube-apiserver-k8s-01
描述pod:kube-apiserver-k8s-01的详细信息
kubectl describe -n kube-system secrets kubernetes-dashboard-token-9mvxp
描述secrets详细信息,例如该命令可查询登录dashboard所需的token信息
container_name可以通过kubectl describe命令获得
kubectl describe pod calico-node-rw4c2 -n kube-system | grep -B 1 “Container ID”
3,kubectl exec:与docker exec命令一样,kubectl exec 也是用来进入容器内部的
kubectl exec -it -n kube-system kube-apiserver-k8s-01 sh
进入kube-system命名空间下的kube-apiserver-k8s-01容器内部
仅当pod内只有一个容器的时候适用
kubectl exec -it -n kube-system calico-node-rw4c2 -c install-cni sh
-it:开启虚拟终端tty,并将标准输入传入容器中
-i, --stdin=false: Pass stdin to the container
-t, --tty=false: Stdin is a TTY
当pod中有多个容器,需要进入指定的容器时适用,比上一条命令多了-c container_name
4,kubectl logs
kubectl logs用来查看容器的日志,在定位问题时非常有用
kubectl logs -n kube-system -f --tail 10 kube-apiserver-k8s-01
-f: 动态打印日志
–tail 10: 打印最后10行日志,不加该参数时默认会打印全部的日志,在日志非常多的时候非常有用
5,kubectl scale
kubectl scale用来对deployement、replicaset、statefulset等资源进行伸缩
kubectl scale deployment -n kube-system --replicas=2 kubernetes-dashboard
–replicas=2: 指定副本数量为2
先设置replicas=0,再设置replicas=1可实现pod重启操作
6,kubectl apply
通过传入文件名或者标准输入来创建资源或配置
kubectl apply -f .
创建或更新当前目录所有的yaml文件描述的配置或资源
kubectl apply -f /home/agms/
创建或更新指定目录所有的yaml文件描述的配置或资源
kubectl apply -f /home/agms/a.yaml
创建或更新指定yaml文件描述的配置或资源
7,kubectl delete
kubectl delete -f .
删除当前目录所有的yaml文件描述的配置或资源
kubectl delete -f /home/agms/
删除指定目录所有的yaml文件描述的配置或资源
kubectl delete -f /home/agms/a.yaml
删除指定yaml文件描述的配置或资源
kubectl delete nodes k8s-01
按照节点名删除集群中的节点(慎用)
8,kubectl explain
列出受支持资源的字段、版本,各字段的描述、类型等,在编写yaml文件时非常有用
kubectl explain deployment.spec
描述deployment资源的spec字段
9,kubectl create
通过命令行创建kubernetes资源或配置信息
kubectl create namespace fpi-inc
创建一个fpi-inc的命名空间
一般建议通过kubectl apply的方式来进行资源或配置的创建
因服务器原因搭建,大家参考其他博文吧。
参考如下:
https://blog.csdn.net/qq_44214446/article/details/128531430
参考文献:
https://blog.csdn.net/qq_60387497/article/details/121980495
https://blog.csdn.net/qq_38328477/article/details/86712892
https://blog.csdn.net/weixin_56790951/article/details/123510916
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。