• 3、Dockerfile 深入与其他细节


    Dockerfile

    在这里插入图片描述
    Docker 中创建镜像最常用的方式,就是使用 Dockerfile。Dockerfile 是一个 Docker 镜像
    的描述文件,我们可以理解成火箭发射的 A、B、C、D…的步骤。Dockerfile 其内部包含了一
    条条的指令,每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

    示例
    #基于 centos 镜像

    FROM centos
    #维护人的信息
    MAINTAINER My CentOS <534096094@qq.com>
    #安装 httpd 软件包
    RUN yum -y update
    RUN yum -y install httpd
    #开启 80 端口
    EXPOSE 80
    #复制网站首页文件至镜像中 web 站点下
    ADD index.html /var/www/html/index.html
    #复制该脚本至镜像中,并修改其权限
    ADD run.sh /run.sh
    RUN chmod 775 /run.sh
    #当启动容器时执行的脚本文件
    CMD ["/run.sh"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在这里插入图片描述
    复杂一点的示例

    #在 centos 上安装 nginx
    FROM centos
    #标明著作人的名称和邮箱
    MAINTAINER xxx xxx@qq.com
    #测试一下网络环境
    RUN ping -c 1 www.baidu.com
    #安装 nginx 必要的一些软件
    RUN yum -y install gcc make pcre-devel zlib-devel tar zlib
    #把 nginx 安装包复制到/usr/src/目录下,如果是压缩包还会自动解压,是网络路径会自动
    下载
    ADD nginx-1.15.8.tar.gz /usr/src/
    #切换到/usr/src/nginx-1.15.8 编译并且安装 nginx
    RUN cd /usr/src/nginx-1.15.8 \
    && mkdir /usr/local/nginx \
    && ./configure --prefix=/usr/local/nginx && make && make install \
    && ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
    && nginx
    #删除安装 nginx 安装目录
    RUN rm -rf /usr/src/nginx-nginx-1.15.8
    #对外暴露 80 端口
    EXPOSE 80
    #启动 nginx
    CMD ["nginx", "-g", "daemon off;"]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    2、常用指令
    在这里插入图片描述
    2、镜像操作

    1、创建项目 dockerfile
    2、上传项目到服务器。
    3、进入项目,构建镜像到本地仓库;
    (1) docker build -t nginx:GA-1.0 -f ./Dockerfile . 别忘了最后的小数点。
    (2) docker images 查看镜像
    (3) docker exec -it 容器 id /bin/bash;进入容器,修改容器
    (4) docker commit -a “leifengyang” -m “nginxxx” 容器 id mynginx:GA-2.0
    1 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    2 OPTIONS 说明:
    1) -a :提交的镜像作者;
    2) -c :使用 Dockerfile 指令来创建镜像;
    3) -m :提交时的说明文字;
    4) -p :在 commit 时,将容器暂停。
    (5) docker login : 登陆到一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官
    方仓库 Docker Hub
    1 docker login -u 用户名 -p 密码
    (6) docker logout : 登出一个 Docker 镜像仓库,如果未指定镜像仓库地址,默认为官
    方仓库 Docker Hub
    4、推送镜像到 docker hub
    (1) 标记镜像,docker tag local-image:tagname username/new-repo:tagname
    (2) 上传镜像,docker push username/new-repo:tagname
    5、保存镜像,加载镜像
    (1) 可以保存镜像为 tar,使用 u 盘等设备复制到任意 docker 主机,再次加载镜像
    (2) 保存:docker save spring-boot-docker -o /home/spring-boot-docker.tar
    (3) 加载:docker load -i spring-boot-docker.tar
    6、阿里云操作
    (1) 登录阿里云,密码就是开通镜像仓库时 的密码
    docker login --username=qwertyuiopasdf_aa registry.cn-hangzhou.aliyuncs.com
    (2) 拉取镜像
    docker pull registry.cn-hangzhou.aliyuncs.com/atguigumall/gulimall-nginx:v1.0
    (3)推送镜像
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/atguigumall/gulimall-nginx:v1
    docker push registry.cn-hangzhou.aliyuncs.com/atguigumall/gulimall-nginx:v1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    K8S 细节

    1、kubectl
    1、kubectl 文档
    https://kubernetes.io/zh/docs/reference/kubectl/overview/
    2、资源类型
    https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E8%B5%84%E6%BA%90%E7%B1%B
    B%E5%9E%8B
    3、格式化输出
    https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E6%A0%BC%E5%BC%8F%E5%8C%9
    6%E8%BE%93%E5%87%BA
    4、常用操作
    https://kubernetes.io/zh/docs/reference/kubectl/overview/#%E7%A4%BA%E4%BE%8B-%E5%B8%
    B8%E7%94%A8%E6%93%8D%E4%BD%9C
    5、命令参考
    https://kubernetes.io/docs/reference/generated/kubectl/kubectl-command
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2、yaml 语法
    1、yml 模板

    在这里插入图片描述
    2、yaml 字段解析
    参照官方文档

    3、入门操作
    1、Pod 是什么,Controller 是什么
    https://kubernetes.io/zh/docs/concepts/workloads/pods/#pods-and-controllers
    Pod 和控制器
    控制器可以为您创建和管理多个 Pod,管理副本和上线,并在集群范围内提供自修复能力。
    例如,如果一个节点失败,控制器可以在不同的节点上调度一样的替身来自动替换 Pod。
    包含一个或多个 Pod 的控制器一些示例包括:
    Deployment
    StatefulSet
    DaemonSet
    控制器通常使用您提供的 Pod 模板来创建它所负责的 Pod
    在这里插入图片描述
    2、Deployment&Service 是什么
    在这里插入图片描述

    Deployment
    作用于一组Pod的创建和运行,控制pod应用的升级、回滚,当然也能控制pod的数量。

    在K8S中,一方面Pod有伸缩与重新部署的需求,Pod的IP大多数情况是不固定的,另一方面,同一组Pod之间也有负载均衡的需要。因此,一组Pod被抽象成一个Service统一向外暴露。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。

    在这里插入图片描述
    Service有以下三种类型:
    ClusterIP:提供一个集群内部的虚拟IP(clusterIP),以便在集群内部通过clutserIP:port访问;
    NodePort:在每个节点上打开一个端口,在集群外部可以通过nodeIP:nodePort访问,在内部依然可以通过clutserIP:port 访问;
    LoadBalancer:通过外部的负载均衡器来访问,多用于公有云上。

    Service vs Deployment

    Service是从网络角度的抽象概念,类似于Nginx做负载均衡提供的统一网络入口;
    Pod是最终的应用部署实体;
    Deoplyment 负责创建和保持pod运行状态。

    3、Service 的意义
    1、部署一个 nginx
    kubectl create deployment nginx --image=nginx
    2、暴露 nginx 访问
    kubectl expose deployment nginx --port=80 --type=NodePort
    统一应用访问入口;
    Service 管理一组 Pod。
    防止 Pod 失联(服务发现)、定义一组 Pod 的访问策略
    现在 Service 我们使用 NodePort 的方式暴露,这样访问每个节点的端口,都可以访问到这
    个 Pod,如果节点宕机,就会出现问题。
    4、labels and selectors
    在这里插入图片描述
    Labels:

    Labels 是 Kubernetes 中用于标识对象的键值对。一个 label 是一个 key-value 对,其中 key 是一个字符串,value 可以是任意字符串。一个 Kubernetes 对象可以有多个 labels。例如,一个 Pod 可以有 labels,用于标识它属于哪个应用程序、哪个命名空间、哪个环境等等。

    Selectors:

    Selectors 是一种用于选择 Kubernetes 对象的标准。在 Kubernetes 中,selectors 通常用于选择一个或多个具有特定 label 的对象。例如,一个 Deployment 可以使用 selectors 来选择哪些 Pod 应该被包含在该 Deployment 中。

    在 Kubernetes 中,通常使用 labels 和 selectors 一起来管理和选择对象。例如,一个 Deployment 可以使用 labels 来标识它应该管理哪些 Pod,然后使用 selectors 来选择这些 Pod。

    在这里插入图片描述
    比如上图,一个 Deployment 要求匹配标签为 role=backend,那么拥有 role=backend 标签的 Pod 就将被该 Deployment 管理。

    可以使用 Kubernetes 的命令行工具 kubectl 来管理和操作 labels 和 selectors。例如,可以使用 kubectl label 命令来给一个对象添加或删除一个 label。可以使用 kubectl get -l 命令来选择一个或多个具有特定 label 的对象。

    比如我们可以通过命令来查看 node 资源的标签:

    kubectl get node --show-labels
    
    [root@master mtuser]# kubectl get node --show-labels
    NAME     STATUS   ROLES    AGE    VERSION   LABELS
    master   Ready    master   5d9h   v1.15.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master=
    node1    Ready    <none>   5d9h   v1.15.5   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    通过 describe 命令也可以查看到相关资源的标签:

    [root@master mtuser]# kubectl describe pod my-first-deploy-84ffb59778-f7bb2 | grep -i label -A 5
    Labels:         app=my-first-deploy
                    pod-template-hash=84ffb59778
    Annotations:    <none>
    Status:         Running
    IP:             10.244.0.13
    Controlled By:  ReplicaSet/my-first-deploy-84ffb59778
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    可以看到,目前 my-first-deploy 资源创建出来的 Pod 被打上了标签 app=my-first-deploy,这对应了 Deployment 中的定义:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-first-deploy
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-first-deploy  // 匹配 app=my-first-deploy 的 Pod,加入到 Deployment 中进行管理
      template:
        metadata:
          labels:
            app: my-first-deploy // 创建出来的 Pod 被打上了标签
    ...
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Deployment 中对 Pod 定义了标签 app=my-first-deploy,同时还需要定义 nodeSelector 匹配的标签 app=my。

    5、Ingress
    通过 Service 发现 Pod 进行关联。基于域名访
    通过 Ingress Controller 实现 Pod 负载均衡
    支持 TCP/UDP 4 层负载均衡和 HTTP 7 层负载均衡
    在这里插入图片描述
    步骤:
    1)、部署 Ingress Controller
    2)、创建 Ingress 规则

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
    name: web
    spec:
    rules: - host: tomcat6.atguigu.com
    http:
    paths: - backend:
    serviceName: tomcat6
    servicePort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    如果再部署了 tomcat8;看效果;

    kubectl create deployment tomcat8 --image=tomcat:8.5.51-jdk8
    kubectl expose deployment tomcat8 --port=88 --target-port=8080 --type=NodePort
    kubectl delete xxx 删除指定资源
    
    • 1
    • 2
    • 3

    随便配置域名对应哪个节点,都可以访问 tomcat6/8;因为所有节点的 ingress-controller 路
    由表是同步的。
    6、网络模型
    Kubernetes 的网络模型从内至外
    由四个部分组成:
    1、Pod 内部容器所在的网络
    2、Pod 所在的网络
    3、Pod 和 Service 之间通信的网

    4、外界与 Service 之间通信的网

    在这里插入图片描述

    4、项目部署
    项目部署流程
    制作项目镜像(将项目制作为 Docker 镜像,要熟悉 Dockerfile 的编写)
    控制器管理 Pod(编写 k8s 的 yaml 即可)
    暴露应用
    日志监控

  • 相关阅读:
    七夕给女朋友准备的小惊喜网站制作(html+css+js)
    安全测试专家强烈推荐的13款免费的测试工具
    第 113 场 LeetCode 双周赛题解
    空间复杂度(数据结构)
    Sitecore10 Demo演示环境Azure一键部署(Step By Step Guide to installing Sitecore10 in Azure Paas)
    智能配电监控管理系统:高效、安全、绿色的电力管理
    springboot - 2.7.3版本 - (一)简单web应用
    Apache Hive源码阅读环境搭建
    CentOS7.9.2009离线安装yum命令
    vivado查看报告和消息5
  • 原文地址:https://blog.csdn.net/weixin_45817985/article/details/134227774