开发者社区 > 博文 > Docker与虚拟化技术浅析第一弹之docker与Kubernetes
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

Docker与虚拟化技术浅析第一弹之docker与Kubernetes

  • xi****
  • 2023-06-13
  • IP归属:北京
  • 11480浏览

    前言

    Docker本质上是运行在宿主机上的进程,它通过namespace实现了资源隔离,并通过cgroups实现了资源限制,同时通过写时复制(copy-on-write)实现了高效的文件操作。

    cgroups是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。也就是说,cgroups可以限制、记录任务组所使用的物理资源(包括CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。

    cgroups提供了如下四大功能:

    资源限制:cgroups可以对任务使用的资源总额进行限制。

    优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。

    资源统计:cgroups可以统计系统的资源使用量,如CPU使用时长等。

    任务控制:cgroups可以对任务执行挂起、恢复等操作。


    一、docker与虚拟机

    Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。

    说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端后端以及数据库

    二、docker基础

    Docker三大概念和两句口号

    三大核心概念:

    • 镜像(Image)
    • 容器(Container)
    • 仓库(Repository)

    两句口号:

    Build, Ship and Run

    Build once,Run anywhere

    认识Dockerfile

    dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile的指定进行自动构建容器。

    除了dockerfile这种自定义构建镜像的方式意外,还支持从公共仓库(dockerHub)拉取的方式:https://hub.docker.com/、或者基于现有的镜像进行优化docker commitfrom tomcat
    MAINTAINER yangjianmin@jd.com
    RUN rm -rf /usr/local/tomcat/webapps/*
    COPY jhjkhkj.zip   /usr/local/tomcat/webapps
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    

    镜像与分层

    镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构。

    Docker 镜像由一些松耦合的只读镜像层组成。如下图所示。

    以我本地的nginx为例,通过docker image inspect命令查看镜像分层的方式:

    % docker image inspect nginx:latest
    [
        {
            "Id": "sha256:605c77e624ddb75e.....9dc3a85",
            "RepoTags": [
                "nginx:latest"
            ],
    
    
    
    
    
    
    
    
    <snip>
    
    
    
    
    
    
    
    
            "RootFS": {
                "Type": "layers",
                "Layers": [
                    "sha256:2edcec3590a4ec7f40.....41ef9727da6c851f",
                    "sha256:e379e8aedd4d72bb4c.....80179e8f02421ad8",
                    "sha256:b8d6e692a25e11b0d3.....e68cbd7fda7f70221",
                    "sha256:f1db227348d0a5e0b9.....cbc31f05e4ef8df8c",
                    "sha256:32ce5f6a5106cc637d.....75dd47cbf19a4f866da",
                    "sha256:d874fd2bc83bb3322b.....625908d68e7ed6040a6"
                ]
            },
            "Metadata": {
                "LastTagTime": "0001-01-01T00:00:00Z"
           

    当我们拉取镜像时也可以看到分层拉的记录,为了尽量较少镜像层数,在写Dockerfile时应尽量整合RUN命令,因为每只行一次RUN命令,层数就会加1。

    镜像运行

    % docker images
    REPOSITORY               TAG       IMAGE ID       CREATED        SIZE
    mytest                   latest    26d746eb2c68   26 hours ago   680MB
    nginx                    latest    605c77e624dd   13 days ago    141MB
    tomcat                   latest    fb5657adc892   2 weeks ago    680MB
    docker/getting-started   latest    26d80cd96d69   5 weeks ago    28.5MB
    yangjianmin@192 ~ % docker run -d -p 91:80 nginx  
    dcf193ebf5dd1b3267eddff37158535036918451938c4c90f98d2b12edf6c608
    yangjianmin@192 ~ % docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                NAMES
    dcf193ebf5dd   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   0.0.0.0:91->80/tcp   nifty_stonebraker
    


    三、docker-compose、docker-machine

    Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,您可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用一个命令,就可以从 YML 文件配置中创建并启动所有服务。

    Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

    Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

    docker-compose.yml

    mysql:
     image: daocloud.io/yjmyzz/mysql-osx:latest
     volumes:
       - ./mysql/db:/var/lib/mysql
     ports:
       - 3306:3306
     environment:
       - MYSQL_ROOT_PASSWORD=123456
      
    service1:
     image: java:latest
     volumes:
       - ./java:/opt/app
     expose:
       - 8080
     #ports:
     #  - 9081:8080
     links:
       - mysql:default
     command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
      
    service2:
     image: java:latest
     volumes:
       - ./java:/opt/app
     expose:
       - 8080
     #ports:
     #  - 9082:8080
     links:
       - mysql:default
     command: java -jar /opt/app/spring-boot-rest-framework-1.0.0.jar
      
    nginx1:
      image: nginx:latest
      volumes:
       - ./nginx/html:/usr/share/nginx/html:ro
       - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
       - ./nginx/conf.d:/etc/nginx/conf.d:ro
      #expose:
      #  - 80
      ports:
       - "80:80"
      links:
       - service1:service1
       - service2:service2


    docker-machine

    Docker Machine是一个用于配置和管理Dockerized主机(带有Docker Engine的主机)的工具。 您可以使用Machine在一个或多个虚拟系统上安装Docker Engine。 这些虚拟系统可以是本地的(如使用Machine在Mac或Windows上的VirtualBox中安装和运行Docker Engine时)或远程(如使用Machine在云提供商上配置Dockerized主机时)。 可以想到Dockerized主机本身,有时也称为托管“机器”。

    四、云原生

    这个话题比较大,此处选取了部分解释,存在很大局限性。


    云原生从字面意思上来看可以分成云和原生两个部分。

    云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。

    原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。

    云原生 = 微服务 + DevOps + 持续交付 + 容器化


    五、Kubernetes(K8S)

    Docker主张的是“容器即服务”,面对大型复杂的实际应用场景,将面临着多容器的管理、调度、集群扩展等问题,人们迫切需要一套容器管理系统,对Docker及容器进行更高级更灵活的管理。

    于是,Kubernetes出现了。


    K8S名字的由来

    这个其实和硅谷的人起名有关系,他们有一个坏习惯,就是喜欢把一个单词首字母+跳过的字母数来进行缩写,目的是让爷爷奶奶们读不懂,比如亚马逊的Algorithms被缩写成A9,而kubernetes缩写为k8s,意思就是k后面跳过8个字母后到s,就变成了k8s。

    官方原文是:K8s is an abbreviation derived by replacing the 8 letters “ubernete” with 8.


    Kubernetes 特点

    • 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
    • 可扩展: 模块化, 插件化, 可挂载, 可组合
    • 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展


    Kubernetes(k8s)是自动化容器操作的开源平台。这些容器操作包括:部署、调度和节点集群间扩展。

    具体功能:

    • 自动化容器部署和复制。
    • 实时弹性收缩容器规模。
    • 容器编排成组,并提供容器间的负载均衡。


    K8S架构和组件

    本文如有不妥之处,望批评指正,后续会推出K8S核心组件解析,持续关注!


    六、参考文章:

    https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation/ Docker 背后的内核知识——cgroups 资源限制

    https://www.cnblogs.com/beiluowuzheng/p/10004132.html Docker背后的内核知识

    https://blog.csdn.net/weixin_41282397/article/details/80771237 swarm与kubernetes的对比

    https://blog.csdn.net/weixin_38320674/article/details/114684086 K8s 超详细总结!

    https://www.kubernetes.org.cn/k8s K8S中文社