您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
Docker与虚拟化技术浅析第一弹之docker与Kubernetes
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
Docker与虚拟化技术浅析第一弹之docker与Kubernetes
自猿其说Tech
2022-03-23
IP归属:未知
620800浏览
敏捷架构
### 1 前言 Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、 可移植的、自给自足的容器。开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机)、bare metal、OpenStack 集群和其他基础应用平台。 Docker的目标: - 提供轻量简单的建模方式; - 职责的逻辑分离; - 快速高效的开发生命周期; - 鼓励使用面向服务的架构,即单个容器运行单个应用。 Docker本质上是运行在宿主机上的进程,它通过namespace实现了资源隔离,并通过cgroups实现了资源限制,同时通过写时复制(copy-on-write)实现了高效的文件操作。 ![](//img1.jcloudcs.com/developer.jdcloud.com/49ead516-80ca-423e-a6ff-814d6357d70020220323113613.png) **cgroups**是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。也就是说,cgroups可以限制、记录任务组所使用的物理资源(包括CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。 cgroups提供了如下四大功能: - 资源限制:cgroups可以对任务使用的资源总额进行限制。 - 优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。 - 资源统计:cgroups可以统计系统的资源使用量,如CPU使用时长等。 - 任务控制:cgroups可以对任务执行挂起、恢复等操作。 ### 2 docker与虚拟机 ![](//img1.jcloudcs.com/developer.jdcloud.com/9f8a35f0-3a5d-472a-9fc4-bb17c6d4da4e20220323113754.png) **Docker守护进程**可以直接与**主操作系统**进行通信,为各个**Docker容器**分配资源;它还可以将容器与**主操作系统**隔离,并将各个容器互相隔离。**虚拟机**启动需要数分钟,而**Docker容器**可以在数毫秒内启动。由于没有臃肿的**从操作系统**,Docker可以节省大量的磁盘空间以及其他系统资源。 说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。**虚拟机**更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而**Docker**通常用于隔离不同的应用,例如**前端**,**后端**以及**数据库**,类似一个“沙箱”。 ### 3 docker基础 #### 3.1 Docker三大概念和两句口号 三大核心概念: - 镜像(Image) - 容器(Container) - 仓库(Repository) 两句口号: **Build, Ship and Run Build once,Run anywhere** ![](//img1.jcloudcs.com/developer.jdcloud.com/f04bab0f-5192-4752-8b03-704fef36451a20220323114407.png) #### 3.2 认识Dockerfile dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile文件,进行指定容器的自动构建。 ![](//img1.jcloudcs.com/developer.jdcloud.com/8beaf516-9d8d-4493-8ac2-8dcef4f1391820220323143308.png) 除了dockerfile这种自定义构建镜像的方式以外,还支持从公共仓库(dockerHub)拉取的方式:https://hub.docker.com/ 、或者基于现有的镜像进行优化docker commi,以下是一个自定义的Dockerfile,以及根据Dockerfile文件构建mytest镜像的过程 ``` from 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 ``` ![](//img1.jcloudcs.com/developer.jdcloud.com/db860092-b2d7-4990-beb0-5515d806194820220323143500.png) #### 3.3 镜像与分层 镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。因为容器的设计初衷就是快速和小巧,所以镜像通常都比较小。镜像可以理解为一种构建时(build-time)结构,而容器可以理解为一种运行时(run-time)结构。 ![](//img1.jcloudcs.com/developer.jdcloud.com/b6b7faa2-00a7-4abe-a7b5-f39d96b2abe520220323143524.png) 以我本地的nginx为例,通过docker image inspect命令查看镜像分层的方式: ```bash % 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 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 ``` ![](//img1.jcloudcs.com/developer.jdcloud.com/c0c2c4e8-16ec-4035-bb21-225dfe7e2f0220220323143746.png) ### 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=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 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主机本身,有时也称为托管“机器”。 ![](//img1.jcloudcs.com/developer.jdcloud.com/e251431e-b0a6-4d66-a5d5-5a8fe66f072420220323143910.png) ### 5 云原生 这个话题比较大,此处选取了部分解释,存在很大局限性。 云原生从字面意思上来看可以分成云和原生两个部分。云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。 原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。 **云原生 = 微服务 + DevOps + 持续交付 + 容器化** ![](//img1.jcloudcs.com/developer.jdcloud.com/e27798d8-a650-4728-b13a-fe1fdd15a00b20220323143955.png) ### 6 Kubernetes(K8S) Docker主张的是“容器即服务”,面对大型复杂的实际应用场景,将面临着多容器的管理、调度、集群扩展等问题,人们迫切需要一套容器管理系统,对Docker及容器进行更高级更灵活的管理。 于是,Kubernetes出现了。 #### 6.1 K8S名字的由来 这个其实和硅谷的人起名有关系,他们有一个坏习惯,就是喜欢把一个单词首字母+跳过的字母数来进行缩写,目的是让爷爷奶奶们读不懂,比如亚马逊的Algorithms被缩写成A9,而kubernetes缩写为k8s,意思就是k后面跳过8个字母后到s,就变成了k8s。 ![](//img1.jcloudcs.com/developer.jdcloud.com/1b44f8f2-3b96-4e01-9d36-95ec0e34741720220323144038.png) #### 6.2 Kubernetes 特点 - 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud) - 可扩展: 模块化, 插件化, 可挂载, 可组合 - 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展 Kubernetes(k8s)是自动化容器操作的开源平台。这些容器操作包括:部署、调度和节点集群间扩展。 **具体功能:** - 自动化容器部署和复制。 - 实时弹性收缩容器规模。 - 容器编排成组,并提供容器间的负载均衡。 #### 6.3 K8S架构和组件 ![](//img1.jcloudcs.com/developer.jdcloud.com/8b006dc7-d355-492c-a325-1d8611f96b7120220323144147.png) **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 私有云架构 ![](//img1.jcloudcs.com/developer.jdcloud.com/412e4170-4694-4394-9c81-7c13098b81b720220323144237.png) 本文如有不妥之处,望批评指正,后续会推出K8S实践和核心组件解析,持续关注! ### 7 参考文章: - Docker 背后的内核知识——cgroups 资源限制 https://www.infoq.cn/article/docker-kernel-knowledge-cgroups-resource-isolation/ - Docker背后的内核知识 https://www.cnblogs.com/beiluowuzheng/p/10004132.html - swarm与kubernetes对比 https://blog.csdn.net/weixin_41282397/article/details/80771237 - K8S 超详细总结! https://blog.csdn.net/weixin_38320674/article/details/114684086 - K8S中文社 https://www.kubernetes.org.cn/k8s ------------ **自猿其说Tech-京东物流技术与数据智能部 作者:杨建民**
原创文章,需联系作者,授权转载
上一篇:Laputa自动化测试框架介绍
下一篇:Android性能优化-ListView自适应性能问题
相关文章
京麦客户端组件化设计与实践
Docker与虚拟化技术浅析第一弹之docker与Kubernetes
架构研究:研发敏捷与中台架构(论前台bp研发敏捷)
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号