Docker与Kubernetes

[TOC]

一、docker

1.1 基本概念

  • 镜像

  • 容器

    创建、启动、停止、删除、暂停

  • 仓库

1.2 docker优势

  • 更高效的利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松的维护和扩展

1.3 数据挂载

  • 数据卷

    docker volume create my-volume #创建一个数据卷
    docker volume ls #查看所有的数据卷
    docker volume inspect my-volume #查看指定数据卷的信息
    docker volume rm my-volume #删除数据卷
    docker volume prune #清理数据卷
    
  • 挂载主机目录

1.4 Compose

  1. 概念

    • 服务

      一个应用的容器,实际上可以包括若干运行相同的镜像的容器实例。

    • 项目

      由一组关联的应用容器组成的一个完整业务单元。

  2. 命令

    docker-compose --version #查看版本
    docker-compose up #运行compose项目
    docker-compose ps #列出项目中目前的所有容器。
    docker-compose run db psql -h db -U docker
    docker-compose scale web=3 db=2 #指定服务运行的容器个数
    docker-compose -f docker-jk-compose.yml up
    
  1. Dockerfile指令

    • FROM

      第一条指令必须是FROM指令,且在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。

    • MAINTAINER

      指定维护者信息

    • RUN

      /bin/sh -c "echo hello"
      RUN["/bin/bash","-c","echo hello"]
      

      格式为RUN command或 RUN ["EXECUTABLE","PARAM1","PARAM2".....],前者在shell终端中运行命令,后者使用exec执行,指定其他运行终端使用。每条RUN指令将当前的镜像基础上执行指令,并提交为新的镜像,命令较长的时候可以使用\来换行。

    • CMD

      支持三种格式:

      CMD ["executable","param1","param2"] # 使用exec执行,这是推荐的方式。
      CMD command param1 param2 #在/bin/sh中执行。
      CMD ["param1","param2"] #提供给ENTERYPOINT的默认参数。
      

      CMD用于指定容器启动时执行的命令,每个Dockerfile只能有一个CMD命令,多个CMD命令只执行最后一个。若容器启动时指定了运行的命令,则会覆盖掉CMD中指定的命令。

    • EXPOSE

       EXPOSE port [port2,port3,...]
      

      例如EXPOSE 80这条指令告诉Docker服务器暴露80端口,供容器外部连接使用。
      在启动容器的使用使用-P,Docker会自动分配一个端口和转发指定的端口,使用-p可以具体指定使用哪个本地的端口来映射对外开放的端口。

    • ENV

      格式为:EVN key value 。用于指定环境变量,这些环境变量,后续可以被RUN指令使用,容器运行起来之后,也可以在容器中获取这些环境变量。例如:

      ENV word hello
      RUN echo $word
      
    • ADD

      ADD src dest
      

      该命令将复制指定本地目录中的文件到容器中的dest中,src可以是是一个绝对路径,也可以是一个URL或一个tar文件,tar文件会自动解压为目录。

    • COPY

      COPY src desc
      

      复制本地主机src目录或文件到容器的desc目录,desc不存在时会自动创建。

    • ENTRYPOINT

      ENTRYPOINT ["executable","param1","param2"]
      ENTRYPOINT command param1,param2 会在shell中执行。
      

      用于配置容器启动后执行的命令,这些命令不能被docker run提供的参数覆盖。和CMD一样,每个Dockerfile中只能有一个ENTRYPOINT,当有多个时最后一个生效。

    • VOLUME

      VOLUME ["/data"]
      

      作用是创建在本地主机或其他容器可以挂载的数据卷,用来存放数据。

    • USER

      USER username
      RUN groupadd -r docker && useradd -r -g docker docker
      

      指定容器运行时的用户名或UID,后续的RUN也会使用指定的用户。要临时使用管理员权限可以使用sudo。在USER命令之前可以使用RUN命令创建需要的用户。

    • WORKDIR

      WORKDIR /path
      

      为后续的RUN CMD ENTRYPOINT指定配置工作目录,可以使用多个WORKDIR指令,若后续指令用得是相对路径,则会基于之前的命令指定路径。

    • ONBUILD

      ONBUILD ADD . /app
      ONBUILD RUN python app.py
      

      该配置指定当所创建的镜像作为其他新建镜像的基础镜像时所执行的指令。

    • docker build

      创建好Dockerfile之后,通过docker build命令来创建镜像,该命令首先会上传Dockerfile文件给Docker服务器端,服务器端将逐行执行Dockerfile中定义的指令。
      通常建议放置Dockerfile的目录为空目录。另外可以在目录下创建.dockerignore文件,让Docker忽略路径下的文件和目录,这一点与Git中的配置很相似。

1.5 命令

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
  1. -d: 后台运行容器,并返回容器ID;
  2. -i: 开启了input(输入)功能,以交互模式运行容器,通常与 -t 同时使用;
  3. -t:开启了一个连接容器里边的terminal(终端),为容器重新分配一个伪输入终端,通常与 -i 同时使用;
  4. -P :是容器内部端口随机映射到主机的高端口。
  5. -p : 是容器内部端口绑定到指定的主机端口。
  6. --name="nginx-lb": 为容器指定一个名称;
  7. --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
  8. --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
  9. -h "mars": 指定容器的hostname;
  10. -e username="ritchie": 设置环境变量;
  11. --env-file=[]: 从指定文件读入环境变量;
  12. --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
  13. -m :设置容器使用内存最大值;
  14. --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
  15. --link=[]: 添加链接到另一个容器;
  16. --expose=[]: 开放一个端口或一组端口;
docker ps [OPTIONS]
  1. -a :显示所有的容器,包括未运行的。
  2. -f :根据条件过滤显示的内容。
  3. --format :指定返回值的模板文件。
  4. -l :显示最近创建的容器。
  5. -n :列出最近创建的n个容器。
  6. --no-trunc :不截断输出。
  7. -q :静默模式,只显示容器编号。
  8. -s :显示总的文件大小。
docker rm [OPTIONS] CONTAINER [CONTAINER...]
  1. -f :通过SIGKILL信号强制删除一个运行中的容器
  2. -l :移除容器间的网络连接,而非容器本身
  3. -v :-v 删除与容器关联的卷
docker images
docker rmi 
service docker restart #重启docker服务
docker node ls
docker swarm join-token manager
docker node promtote node1
docker service create --replicas 3 -p 80:80 --name nginx nginx:lastest
docker service logs nginx
docker service rm nginx
docker service ls

1.6 监控

docker stats #只统计当前的、没存储没报警功能
  1. CAdvisor:

    只在本机保存最近2分钟的数据,负责收集容器的随时间变化的数据。

    展示Host和容器两个层次的监控数据。

    展示历史变化数据

  2. InfluxDB

    开源分布式时序、事件和指标数据库,负责存储时序数据。

  3. Grafana

    开源的数据监控分析可视化平台,负责分析和展示时序数据。

  4. Graylog

    日志收集

1.7 Swarm资源管理

  1. 节点

    • 管理节点

      用于集群管理,swarm命令基本只能在管理节点执行

    • 工作节点

      任务执行节点,管理节点将服务下发至工作节点执行。

    • 服务

      一组任务的集合,服务定义了任务和属性。

      • replicated services

        按照一定规则在各个工作节点上运行指定个数的任务

      • global services

        每个工作节点上运行一个任务

    • 任务

      最小的调节单位

  2. 命令

    docker swarm init --advertise-addr 192.168.100.249 #初始化集群
    docker swarm join --token *** 192.138.100.249:2377 #增加工作节点
    docker node ls #查看集群
    docer swarm join-token manager #加入集群的查看执行命令
    docker service create --replicas 3 -p 80:80 --name nginx nginx:latest #新建服务
    docker service ls #查看服务
    docker service ps nginx #查看某个服务的详情
    docker service logs nginx #查看某个服务的日志
    docker service rm nginx #删除服务
    docker service scale nginx=3 #指定副本情况
    
  3. portainer集群运行

1.8 docker拉取报错

“net/http: TLS handshake timeout”的解决方法

为了永久性保留更改,您可以修改 /etc/docker/daemon.json 文件并添加上 registry-mirrors 键值。

{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}

二、Kubernetes

2.1 用途

它提供了一个便捷有效的平台,让您可以在物理机和虚拟机集群上调度和运行容器。能够达成以下目标:

  1. 跨多台主机进行容器编排。
  2. 更加充分地利用硬件,最大程度获取运行企业应用所需的资源。
  3. 有效管控应用部署和更新,并实现自动化操作。
  4. 挂载和增加存储,用于运行有状态的应用。
  5. 快速、按需扩展容器化应用及其资源。
  6. 对服务进行声明式管理,保证所部署的应用始终按照部署的方式运行。
  7. l 利用自动布局、自动重启、自动复制以及自动扩展功能,对应用实施状况检查和自我修复。

2.2 构成

  1. Master

    • Kubernetes API Server

      提供了HTTP Rest接口的关键服务进程,是Kubernetes里所有资源的增、删、改、查等操作的唯一入口,也是集群控制的入口进程。

    • Kubernetes Controller Manager

      Kubernetes里所有资源对象的自动化控制中心

    • Kubernetes Scheduler

      负责资源调度(Pod调度)的进程

  2. Node

    • kubelet

      负责Pod对应的容器的创建、启停等任务,同时与Master节点密切协作,实现集群管理的基本功能。

    • kube-proxy

      实现Kubernetes Service的通信与负载均衡机制的重要组件。

    • Docker Engine

      负责本机的容器创建和管理工作。

  3. kubectl

    kubernetes 集群的命令行管理工具

  4. etcd

    kubernetes使用 etcd 存储所有运行数据

  5. flannel

    使用 vxlan 技术为各节点创建一个可以互通的 Pod 网络

2.3 命令

  1. 安装报错

checking for C compiler ... not found

yum -y install wget
yum -y install gcc-c++
yum -y install gcc
yum install gcc gcc-c++ kernel-devel
yum -y install gcc gcc-c++ autoconf automake make
  1. 网络命令
netstat -lnpt|grep etcd #2379、2380
netstat -lnpt|grep kube-apiserver #6443(要关闭非安全端口8080)
netstat -lnpt|grep kube-controlle #10252(关闭非安全端口10251)
netstat -lnpt|grep kubelet #34817、10248、10250(安全端口10250)
netstat -lnpt|grep kubelet kube-scheduler #10251
netstat -lnpt|grep kube-prox #10249、10256
  1. etcd命令
etcdctl cluster-health
ps -ef|grep etcd
etcdctl  member list
etcdctl  cluster-health
etcdctl  member  add     
etcdctl  member  remove   
systemctl status etcd.service
  1. kubectl命令
kubectl cluster-info
kubectl get all -n kube-system
kubectl get pods
kubectl get pods -o wide
kubectl get pods -n kube-system
kubectl get pods -n kube-system -o wide

kubectl create -f hello-world-pod.yaml #通过定义文件创建Hellow World Pod
kubectl get pod hello-world #简要信息查询
#JSON格式显示Pod的完整信息
kubectl get pod hello-world --output yaml
#YAML方式显示Pod的完整信息
kubectl get pod hello-world --output json

kubectl delete -f nginx-ds.yml
kubectl exec dnsutils-ds-dv8r7 nslookup kubernetes

kubectl describe pod heapster-6cf9d6b4f5-4x5q9 #状态和生命周期查询
kubectl replace -f hello-world-pod.yaml #但是由于Pod的很多属性没办法修改,比如容器镜像,这时候可以采用--force参数
kubectl replace --force -f hello-world-pod.yaml #重建POd
kubectl delete pod hello-world #通过kubectl delete删除指定Pod
kubectl delete pod --all #通过kubectl delete批量删除全部Pod

kubectl get deployments
kubectl get services --all-namespaces |grep my-nginx
kubectl get pods --namespace kube-system
kubectl --namespace kube-system get pods -o wide
kubectl describe pod kubernetes-dashboard-659798bd99-wx7ps  --namespace kube-system

你可能感兴趣的:(Docker与Kubernetes)