centos7安装docker |
|
OCI(Open Container Initiative) |
在2015 年,在 Linux 基金会的支持下有了 Open Container Initiative (OCI)(就是负责制定容器标准的组织),Docker 将自己容器格式和运行时 runC 捐给了 OCI。OCI 在此基础上制定了 2 个标准:运行时标准 Runtime Specification (runtime-spec) 和 镜像标准 Image Specification (image-spec) |
CRI(Container Runtime Interface) |
2016年12 月CNCF发布了CRI,为了让Kubernetes同时支持多种容器引擎 |
容器运行时 |
容器runtime是容器真正运行的地方,runtime需要和操作系统kernel紧密结合,为容器提供运行环境;比如java程序比作一个容器,JVM就是runtime。JVM为java程序提供运行环境。所以容器只能在runtime里面运行,目前主流的三种容器 runtime是lxc、runc 和 rkt |
容器管理工具 |
除了运行环境,使用者也得需要工具来管理容器。容器管理工具对内与runtime交互,对外为用户提供interface lxd是lxc对应的容器管理工具; runC的管理工具是docker engine。docker engine 包含后台守护进程containerd 和 cli 两个部分。我们通常提到 Docker,一般就是指的 docker engine; rkt 的管理工具是 rktcl; |
docker介绍 |
docker只是容器的总称,实际的docker由cont |
docker实验 |
用docker安装Tomcat从浏览器访问 |
service mesh |
服务网格是分布式软件系统内部用于管理所有“服务到服务”通信的一个系统 |
container runtime |
容器运行时,container runtime与操作系统紧密协作,为容器提供运行环境,docker的运行环境工具是runC,其他运行环境工具有rkt,kata,gvisor |
docker rmi repository名:tag名 |
删除image id相同,但repository和tag不同的多余镜像 |
docker --version |
查看docker版本 |
docker info |
查看docker信息 |
docker ps -a |
查看所有容器,包括运行和停止的 |
docker search nginx |
搜索nginx镜像(搜索镜像) |
docker container inspect containerID |
查看容器的详细信息 |
docker rm container |
删除容器 |
docker rm -f container |
强制删除运行中的容器 |
docker image ls |
列出镜像 |
docker rmi image |
删除镜像 |
docker rmi -f imageid |
强制删除镜像 |
docker run -p 80:80 -v /data:/data -d nginx:latest |
使用镜像 nginx:latest,以后台模式启动一个容器,将容器的 80 端口映射到主机的 80 端口,主机的目录 /data 映射到容器的 /data |
docker run name mynginx -d nginx:latest |
使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx |
docker run -it nginx:latest /bin/bash |
使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令 |
docker search imagename |
搜索镜像 |
docker pause containerID |
暂停容器运行 |
docker unpause containerID |
解除容器暂停 |
docker stop containerID |
停止容器运行 |
docker start containerID |
启动容器运行 |
docker commit containerID 镜像名称:TAG |
构建新的镜像 //docker commit 723514b24673 centos7-vim:centos7 |
docker save -o 压缩文件名称 镜像名称:版本号 |
压缩镜像 //docker save -o nginx.tar nginx:1.0 |
docker load -i 压缩文件名称 |
解压镜像,并运行 |
yum remove docker-ce |
卸载docker |
rm -rf /var/lib/docker |
删除镜像、容器、配置文件等内容 |
docker run -i -t 7cd0652e54ea(镜像ID) /bin/bash |
运行交互式的容器 |
docker exec -i-t containerID bash |
进入容器 |
docker-ce |
是服务器端软件 |
docker-ce-cli |
是客户端软件 |
containerd.io |
是底层用来启动容器的 |
docker-compose-plugin |
是compose插件,用来批量启动很多容器,在单台机器上面 |
docker run -it -d -p 5000:5000 --restart=always --name registry registry |
安装docker私有镜像仓库,并并映射了宿主机的 5000 端口,供 Docker 镜像的上传与下载。其中,--restart=always 表示容器停止时自动重启,这条参数常用于生产环境中 |
dockerfile学习 |
1、dockerfile中所用的所有文件一定要和dockerfil文件在同一级父目录,可以为dockerfile父目录的子目录 2、dockerfile中相对路径默认都是dockerfile所在的目录 3、dockerfile中一定要惜字如金,能写到一行的指令,一定要写一行,因为是分层构建,联合挂载这个特性,dockerfile中每一条指令被视为一层 4、dockerfile中指令大小写不敏感,为了区分习惯上用大写 |
FROM:指定父镜像 |
指定dockerfile基于那个image构建 |
MAINTAINER:作者信息 |
用来标明这个dockerfile谁写的 |
LABEL:标签 |
用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN:执行命令 |
执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN ["command" , "param1","param2"] |
CMD:容器启动命令 |
提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD ["command" , "param1","param2"] |
ENTRYPOINT:入口 |
一般在制作一些执行就关闭的容器中会使用 |
COPY:复制文件 |
build的时候复制文件到image中 |
ADD:添加文件 |
build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV:环境变量 |
指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG:构建参数 |
构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME:定义外部可以挂载的数据卷 |
指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME ["目录"] |
EXPOSE:暴露端口 |
定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR:工作目录 |
指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER:指定执行用户 |
指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK:健康检查 |
指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD:触发器 |
当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL:发送信号量到宿主机 |
该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL:指定执行脚本的shell |
指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
k8s组件 |
组件功能 |
API Server |
负责处理来自用户的请求,其主要作用就是对外提供 RESTful 的接口,包括用于查看集群状态的读请求以及改变集群状态的写请求,也是唯一一个与 etcd 集群通信的组件 |
Controller |
维持副本的期望数目 |
Scheduler |
是K8S系统的核心组件之一,其主要负责Pod的调度,其监听kube-apiserver,查询未分配 Node的Pod(未分配、分配失败及尝试多次无法分配),根据配置的调度策略,将Pod调度到最优的工作节点上,从而高效、合理的利用集群的资源,该特性是用户选择K8S系统的关键因素之一,帮助用户提升效率、降低能耗. |
etcd |
是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 |
Kubelet |
是工作节点执行操作的 agent,负责具体的容器生命周期管理,根据从数据库中获取的信息来管理容器,并上报 pod 运行状态等(组件位于node上) |
Kube-proxy |
是一个简单的网络访问代理,同时也是一个 Load Balancer。它负责将访问到某个服务的请求具体分配给工作节点上同一类标签的 Pod。kube-proxy 实质就是通过操作防火墙规则(iptables或者ipvs)来实现 Pod 的映射(组件位于node上) |
coreDNS |
可以为集群中的svc创建一个域名IP的对应关系解析 |
ingress controller |
官方只能实现四层代理, ingress可以实现七层代理 |
fedetation |
提供一个跨集群中心多k8s统一管理的功能 |
prometheus |
提供k8s集群的监控能力 |
elk |
提供k8s集群日志统一分析介入平台 |
flannel/calico |
CNI网络插件 |
coredns |
服务发现用插件 |
traefik |
服务暴露用插件 |
Dashborad |
GUI管理插件 |
kubect get nodes |
查看所有的节点 |
kubectl get pod -n kube-system |
查看是否runing状态 |
kubectl create deployment nginx --image=nginx |
创建一个pod |
kubectl get pod |
查看是否runing状态 |
kubectl expose deployment nginx --port=80 --type=NodePort |
暴露端口 |
kubectl get pod,svc |
查看pod |
kubectl get cs |
检查状态 |
kubectl apply -f a.yaml |
部署yaml文件 |
kubectl get csr |
查看申请 |
kubectl logs --tail=200 --all-containers=true -f -n sip -lapp=contractmg |
查看日志 |
kubectl get pods -o wide |
可以看到pod的ip等完整信息 |
service mesh(服务网格) |
|
k8s中pod的概念 |
运行于Node节点上,若干相关容器的组合(Kubernetes 之 Pod 实现原理)。Pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间、IP地址和端口,能够通过localhost进行通信。Pod是Kurbernetes进行创建、调度和管理的最小单位,它提供了比容器更高层次的抽象,使得部署和管理更加灵活。一个Pod可以包含一个容器或者多个相关容器。 同一个Pod中的应用可以共享磁盘,磁盘是Pod级的,应用可以通过文件系统调用。 |
Kubernetes通信问题 |
1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现。 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另一个Pod-IP 3.Pod与Service通信:即PodIP去访问ClusterIP,当然,clusterIP实际上是IPVS或iptables规则的虚拟IP,是没有TCP/IP协议栈支持的。但不影响Pod访问它. 4.Service与集群外部Client的通信,即K8s中Pod提供的服务必须能被互联网上的用户所访问到。 需要注意的是,k8s集群初始化时的service网段,pod网段,网络插件的网段,以及真实服务器的网段,都不能相同,如果相同就会出各种各样奇怪的问题,而且这些问题在集群做好之后是不方便改的,改会导致更多的问题,所以,就在搭建前将其规划好 |
CNI |
CNI(容器网络接口): 这是K8s中提供的一种通用网络标准规范,因为k8s本身不提供网络解决方案。 目前比较知名的网络解决方案有:Flannel、calico、canel、kube-router |
CKA认证考试前配置kubectl自动tab补全 |
kubectl --help | grep bash //查询关键词completion,有证明系统是否安装了bash-completion自动补全工具 sudo vim /etc/profile //打开profile文件,加入“source <(kubectl completion bash)" source /etc/profile //使用配置文件生效 sudo source /etc/profile //使配置文件在root用户环境下生效 |
YAML :YAML 是一种非常简洁/强大/专门用来写配置文件的语言! |
大小写敏感 通过缩进表示层级关系 禁止使用tab缩进,只能使用空格键 缩进的空格数目不重要,只要相同层级左对齐 使用#表示注释 单引号(''): 特殊字符作为普通字符串处理 双引号(""): 特殊字符作为本身想表示的意思 对象: 键值对的字典 数组: 一组按次序排列的列表 纯量: 单个的且不可再分的值 |
Service |
Service(Kubernetes 之服务发现,让容器内服务暴露给外部服务访问)定义了Pod的逻辑集合和访问该集合的策略,是真实服务的抽象。Service提供了一个统一的服务访问入口以及服务代理和发现机制,关联多个相同Label的Pod,用户不需要了解后台Pod是如何运行 |
Sidecar |
Sidecar 是一个独立的容器,与 Kubernetes pod 中的应用容器一起运行,是一种辅助性的应用。 例如:服务网格 (service mesh) 代理;监控 Exporter(如 redis exporter);ConfigMap 或/和 Secret Reloader(如 Prometheus 的 Config Reloader);Auth Proxy(如 OAuth Proxy 等);7层反向代理和 Web 服务器;日志整合(审计日志单独发到某个日志渠道。…);Demo 或 AllInOne 应用(如 nextcloud 或 Jaeger AllInOne 等示例应用 |