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

京东云官方 京东云官方     2022-12-01     229

关键词:

1 前言

Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、 可移植的、自给自足的容器。开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机)、bare metal、OpenStack 集群和其他基础应用平台。
Docker的目标:

  • 提供轻量简单的建模方式;
  • 职责的逻辑分离;
  • 快速高效的开发生命周期;
  • 鼓励使用面向服务的架构,即单个容器运行单个应用。

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

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


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

cgroups提供了如下四大功能:

  • 资源限制:cgroups可以对任务使用的资源总额进行限制。
  • 优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。
  • 资源统计:cgroups可以统计系统的资源使用量,如CPU使用时长等。
  • 任务控制:cgroups可以对任务执行挂起、恢复等操作。

2 docker与虚拟机

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

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

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

3 docker基础

3.1 Docker三大概念和两句口号

三大核心概念:

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

两句口号:

Build, Ship and Run
Build once,Run anywhere

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

3.2 认识Dockerfile

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

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


除了dockerfile这种自定义构建镜像的方式以外,还支持从公共仓库(dockerHub)拉取的方式:​​https://hub.docker.com/​​ 、或者基于现有的镜像进行优化docker commi,以下是一个自定义的Dockerfile,以及根据Dockerfile文件构建mytest镜像的过程

from tomcatMAINTAINER yangjianmin@jd.comRUN rm -rf /usr/local/tomcat/webapps/*COPY jhjkhkj.zip   /usr/local/tomcat/webappsENV TZ=Asia/ShanghaiRUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

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

3.3 镜像与分层

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

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


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

% docker image inspect nginx:latest[            "Id": "sha256:605c77e624ddb75e.....9dc3a85",        "RepoTags": [            "nginx:latest"        ],略过一些内容。。。        "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"        

可以看到,我从远端拉下来的最新的nginx镜像是由六层结构组成的,当我们拉取镜像时也可以看到分层拉取的记录,为了尽量减少镜像层数,在写Dockerfile时应尽量整合RUN命令,因为每运行一次RUN命令,层数就会加1。

3.4 镜像运行

docker images:查看镜像列表,TAG相当于jar包版本描述了镜像的版本
docker run -d -p 91:80 nginx:运行nginx镜像,-d表示相关启动日志后台展示,-p是将本机操作系统的端口和容器内部端口做映射,起到将docker容器指定端口对外暴露的作用。我们便可以通过访问91端口请求到刚刚启动的nginx。

docker ps:可以查看已经运行的容器的情况。
有关docker的操作命令不在本文展开介绍,感兴趣的小伙伴可以自行学习。

% docker imagesREPOSITORY               TAG       IMAGE ID       CREATED        SIZEmytest                   latest    26d746eb2c68   26 hours ago   680MBnginx                    latest    605c77e624dd   13 days ago    141MBtomcat                   latest    fb5657adc892   2 weeks ago    680MBdocker/getting-started   latest    26d80cd96d69   5 weeks ago    28.5MByangjianmin@192 ~ % docker run -d -p 91:80 nginx  dcf193ebf5dd1b3267eddff37158535036918451938c4c90f98d2b12edf6c608yangjianmin@192 ~ % docker psCONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                NAMESdcf193ebf5dd   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds   0.0.0.0:91->80/tcp   nifty_stonebraker

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

4 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=123456service1: 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.jarservice2: 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.jarnginx1:  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 run的批量版本,以最小单元来看,包含了镜像名和版本(nginx:latest)、文件挂载路径(Volumes)、暴露端口(expose,但这个只允许容器内部访问,不映射到宿主机)、端口映射(ports)、链接其他服务(links)。可以通过docker compose build和docker compose up等命令操作构建和运行,相应过程不再展示,感兴趣的小伙伴可以本地实践。

4.1 docker-machine

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

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

5 云原生

这个话题比较大,此处选取了部分解释,存在很大局限性。
云原生从字面意思上来看可以分成云和原生两个部分。云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。

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

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

6 Kubernetes(K8S)

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

6.1 K8S名字的由来

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

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

6.2 Kubernetes 特点

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

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

具体功能:

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

6.3 K8S架构和组件

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


pod:pod是k8s最小的调度单位,一个pod里面可以包含一个或者多个container,一个pod共享一个namespace,它们之前可以通过localhost来进行通信。

K8s集群核心组件如下:

  • etcd:一个高可用的K/V键值对存储和服务发现系统。
  • flannel:实现跨主机的容器网络的通信。
  • kube- apiserver:提供Kubernetes集群的API调用。
  • kube- controller-manager:确保集群服务。
  • kube- scheduler:调度容器,分配到Node。
  • kubelet:在Node节点上按照配置文件中定义的容器规格启动容器。
  • kube-proxy:提供网络代理服务。

6.4 私有云架构

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

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

7 参考文章:

3.docker学习之docker与虚拟化

虚拟化技术是一个总称,是一系列实现虚拟技术的统称。从广义上来说,虚拟化技术包括了虚拟机技术和容器技术,所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 有人... 查看详情

docker简介与安装

...遵从Apache2.0协议开源。    Docker是通过内核虚拟化技术(namespaces及cgroups等)来提供容器的资源隔离与安全保障等。由于Docker通过操作系统层的虚拟化实现 查看详情

docker与传统虚拟机

...各种虚拟机技术开启了云计算时代;而Docker,作为下一代虚拟化技术,正在改变我们开发、测试、部署应用的方式。那虚拟机与Docker究竟有何不同呢?首先,大家需要明确一点,Docker容器不是虚拟机!第一次接触Docker的时候,我... 查看详情

虚拟化技术—docker容器—pipework解读与实践

   本文通过3个样例 —— 将Docker容器配置到本地网络环境中、单主机Docker容器的VLAN划分、多主机Docker容器的VLAN划分,演示了如何使用pipework帮助我们进行复杂的网络设置,以及pipework是如何工作的。1、pipework... 查看详情

docker入门

...是一个基于LXC技术之上构建的container容器引擎,通过内核虚拟化技术(namespace及cgroups)来提供容器的资源隔离与安全保障,KVM是通过硬件实现的虚拟化技术,它是通过系统来实现资源隔离与安全保障,占用系统资源比较小官方... 查看详情

实现https系列第四弹之tls,ssl等概念理解

...相关知识,在目前时间点【2017年5月21号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。1、... 查看详情

实现https系列第四弹之tls,ssl等概念理解

...相关知识,在目前时间点【2017年5月21号】下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容。1、... 查看详情

docker与虚拟机有何不同

...容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器技术有很多种,Docker是目前最流行的一种,网易云也在使用Docker。服务器虚拟化解决的核心问题是资源调配,而容器解决的核心问题是应用开发、测试和部署... 查看详情

docker系列:第一讲.docker简介与安装(代码片段)

什么是Docker?Docker的英文翻译是“搬运工”的意思,他搬运的东西就是我们常说的集装箱Container,Container里面装的是任意类型的App,我们的开发人员可以通过Docker将App变成一种标准化的、可移植的、自管理的组件,我们可以在任... 查看详情

docker之namespace与cgroup(代码片段)

Docker容器技术是一个与传统的虚拟化技术有些本质上的差别,传统的虚拟化技术,是站硬件物理资源的基础上,虚拟出多个OS,然后在OS的基础上构建相对独立的程序运行环境,而Docker则是在OS的基础上进行虚拟,所以,Docker轻量... 查看详情

docker第一弹:下载运行hello-world程序

1.需要安装好docker程序  没有安装的请看在centos6.8下安装docker2.从docker镜像仓库中拉去hello-world镜像  dockerpullhello-world  3.查看下载好了的情况dockerimages  第一项为仓库,第二个为标签,第三个是镜像ID,第四个是创建时间... 查看详情

docker核心技术与实现原理(代码片段)

...20年Java开发最新电子书集合.pdf(吐血整理)>>> 到虚拟化技术,我们首先想到的一定是Docker,经过四年的快速发展Docker已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了。作为在生产环境中广泛应用... 查看详情

1.docker的介绍与安装(代码片段)

...像加速1.docker的介绍1.1.docker容器是什么?Docker是通过内核虚拟化技术(namespaces及cgroups)来提供容器的资源隔离与资源限制。由于Docker通过操作系统层的虚拟化实现隔离(对操作系统的内核有要求),所以Docker容器在运行时,不... 查看详情

小白爬虫第一弹之抓取妹子图更新版

最近对爬虫感兴趣,参考了 http://cuiqingcai.com/3179.html 这篇文章,琢磨的小试身手,但是按照原文发现图片下载下来全是打不开的图片,这不是我想要的啊,尝试直接把图片的链接在浏览器中打开,发现已经看过的没有问... 查看详情

docker讲解与实战,精炼易懂!(代码片段)

1、docker简介docker通过内核虚拟化技术(namespace及cgroups等)来提供容器的资源隔离与安全保障等,由于docker通过操作系统层的虚拟化实现隔离,所以docker容器在运行时,不需要类似虚拟机额外的操作系统开销,提供资源利用率2、... 查看详情

docker学习笔记第一章:补充

...令,忘记整理一些概念性的东西了,只能做个补充了=。=Docker虽然也是一种虚拟技术,但是不同于虚拟机的概念。Docker是一种以容器为主的技术,容器运行不需要模拟层(emulation)和管理层(Hypervisor),直接调用操作系统的接口... 查看详情

docker-技术栈

与传统的方式类似,构建及运行Docker容器与在一台虚拟机上构建和运行程序的方式是相似的,只是使用了一套新的工具以及技术。与虚拟机不同的是,Docker容器将宿主机与应用程序或者服务隔离,从而提高了灵活性;但是由于引... 查看详情

docker简单理解一

...介:    Docker是一种区别与Kvm与Vsphere的“虚拟化”技术。根本区别是,应用服务(Nginx)的部署位置:虚拟化如KVM{物理主机{操作系统{虚拟化引擎{虚拟机操作系统{Nginx}}}}},Docker{物理主机{操作系统{Docker-Engine{Nginx}}... 查看详情