Docker与虚拟化技术浅析第一弹之docker与Kubernetes
1 前言
Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的、 可移植的、自给自足的容器。开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机)、bare metal、OpenStack 集群和其他基础应用平台。
Docker的目标:
- 提供轻量简单的建模方式;
- 职责的逻辑分离;
- 快速高效的开发生命周期;
- 鼓励使用面向服务的架构,即单个容器运行单个应用。
Docker本质上是运行在宿主机上的进程,它通过namespace实现了资源隔离,并通过cgroups实现了资源限制,同时通过写时复制(copy-on-write)实现了高效的文件操作。

cgroups是Linux内核提供的一种机制,这种机制可以根据需求把一系列系统任务及其子任务整合(或分隔)到按资源划分等级的不同组内,从而为系统资源管理提供一个统一的框架。也就是说,cgroups可以限制、记录任务组所使用的物理资源(包括CPU、memory、IO等),为容器实现虚拟化提供了基本保证,是构建Docker等一系列虚拟化管理工具的基石。
cgroups提供了如下四大功能:
- 资源限制:cgroups可以对任务使用的资源总额进行限制。
- 优先级分配:通过分配的CPU时间片数量以及磁盘IO带宽大小,实际上就相当于控制了任务运行的优先级。
- 资源统计:cgroups可以统计系统的资源使用量,如CPU使用时长等。
任务控制:cgroups可以对任务执行挂起、恢复等操作。
2 docker与虚拟机

Docker守护进程可以直接与主操作系统进行通信,为各个Docker容器分配资源;它还可以将容器与主操作系统隔离,并将各个容器互相隔离。虚拟机启动需要数分钟,而Docker容器可以在数毫秒内启动。由于没有臃肿的从操作系统,Docker可以节省大量的磁盘空间以及其他系统资源。
说了这么多Docker的优势,大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用,例如前端,后端以及数据库,类似一个“沙箱”。
3 docker基础
3.1 Docker三大概念和两句口号
三大核心概念:
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
两句口号:
Build, Ship and Run
Build once,Run anywhere
3.2 认识Dockerfile
dockerfile仅仅是用来制作镜像的源码文件,是构建容器过程中的指令,docker能够读取dockerfile文件,进行指定容器的自动构建。
除了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

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

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主机本身,有时也称为托管“机器”。
5 云原生
这个话题比较大,此处选取了部分解释,存在很大局限性。
云原生从字面意思上来看可以分成云和原生两个部分。云是和本地相对的,传统的应用必须跑在本地服务器上,现在流行的应用都跑在云端,云包含了IaaS,、PaaS和SaaS。
原生就是土生土长的意思,我们在开始设计应用的时候就考虑到应用将来是运行云环境里面的,要充分利用云资源的优点,比如️云服务的弹性和分布式优势。
云原生 = 微服务 + DevOps + 持续交付 + 容器化

6 Kubernetes(K8S)
Docker主张的是“容器即服务”,面对大型复杂的实际应用场景,将面临着多容器的管理、调度、集群扩展等问题,人们迫切需要一套容器管理系统,对Docker及容器进行更高级更灵活的管理。
于是,Kubernetes出现了。
6.1 K8S名字的由来
这个其实和硅谷的人起名有关系,他们有一个坏习惯,就是喜欢把一个单词首字母+跳过的字母数来进行缩写,目的是让爷爷奶奶们读不懂,比如亚马逊的Algorithms被缩写成A9,而kubernetes缩写为k8s,意思就是k后面跳过8个字母后到s,就变成了k8s。
6.2 Kubernetes 特点
- 可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)
- 可扩展: 模块化, 插件化, 可挂载, 可组合
- 自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展
Kubernetes(k8s)是自动化容器操作的开源平台。这些容器操作包括:部署、调度和节点集群间扩展。
具体功能:
- 自动化容器部署和复制。
- 实时弹性收缩容器规模。
- 容器编排成组,并提供容器间的负载均衡。
6.3 K8S架构和组件

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 私有云架构

本文如有不妥之处,望批评指正,后续会推出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
Docker与虚拟化技术浅析第一弹之docker与Kubernetes的更多相关文章
- 虚拟化技术浅析第二弹之初识Kubernetes
作者:京东物流 杨建民 一.微服务架构起源 单体架构:可以理解为主要业务逻辑模块(我们编写的代码模块,不包括独立的中间件)运行在一个进程中的应用,最典型的是运行在一个Tomcat容器中,位于一个进程里 ...
- docker和虚拟化技术的区别
1.docker和虚拟化技术的区别 Docker 扩展了 Linux 容器(Linux Containers),或着说 LXC,通过一个高层次的 API 为进程单独提供了一个轻量级的虚拟环境.Dock ...
- docker容器虚拟化技术
简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker.Nginx.PHP.Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题 1 ...
- 3.docker学习之docker与虚拟化
虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 ...
- docker与虚拟化的联系与区别
虚拟化技术是一个总称,是一系列实现虚拟技术的统称.从广义上来说,虚拟化技术包括了虚拟机技术和容器技术, 所谓虚拟化技术最大的特点就是将一个真实的机器进行虚拟地分割,然后分割出来的部分可以独立使用 ...
- 浅谈虚拟机、Docker和Hyper技术
操作系统 我们知道: 完整的操作系统=内核+apps 内核负责管理底层硬件资源,包括CPU.内存.磁盘等等,并向上为apps提供系统调用接口,上层apps应用必须通过系统调用方式使用硬件资源,通常并不 ...
- Docker学习总结(11)——八个Docker的真实应用场景
[编者的话]Flux 7介绍了常用的8个Docker的真实使用场景,分别是简化配置.代码流水线管理.提高开发效率.隔离应用.整合服务器.调试能力.多租户环境.快速部署.我们一直在谈Docker,Doc ...
- [置顶]
Docker学习总结(7)——云端基于Docker的微服务与持续交付实践
本文根据[2016 全球运维大会•深圳站]现场演讲嘉宾分享内容整理而成 讲师简介 易立 毕业于北京大学,获得学士学位和硕士学位:目前负责阿里云容器技术相关的产品的研发工作. 加入阿里之前,曾在IBM中 ...
- Docker源码分析(七):Docker Container网络 (上)
1.前言(什么是Docker Container) 如今,Docker技术大行其道,大家在尝试以及玩转Docker的同时,肯定离不开一个概念,那就是“容器”或者“Docker Container”.那 ...
- Docker源码分析(四):Docker Daemon之NewDaemon实现
1. 前言 Docker的生态系统日趋完善,开发者群体也在日趋庞大,这让业界对Docker持续抱有极其乐观的态度.如今,对于广大开发者而言,使用Docker这项技术已然不是门槛,享受Docker带来的 ...
随机推荐
- 整理混乱的头文件,我用include what you use
摘要:使用include-what-you-use(iwyu/IWYU)清理冗余头文件,补充必要头文件. 本文分享自华为云社区<用include what you use拯救混乱的头文件> ...
- 华为云GuassDB(for Redis)发布全新版本推出:Lua脚本和SSL连接加密
摘要:9月8日,华为云GuassDB(for Redis)正式推出全新版本.新版本内核带来性能提升.无损升级.慢日志统计等多维度产品体验,同时推出Lua脚本和SSL连接加密两大重要功能,让业务设计更加 ...
- Solon Web 开发:四、认识请求上下文(Context)
Handler + Context 架构,是Solon Web 的基础.在 Context (org.noear.solon.core.handle.Context)里可以获取: 请求相关的对象与接口 ...
- Kubernetes(K8S) 常用命令
Docker 常用命令 Docker 常用命令 # 查看API版本 [root@k8smaster ~]# kubectl api-versions # 重启 K8S [root@k8smaster ...
- 生成学习全景:从基础理论到GANs技术实战
本文全面探讨了生成学习的理论与实践,包括对生成学习与判别学习的比较.详细解析GANs.VAEs及自回归模型的工作原理与结构,并通过实战案例展示了GAN模型在PyTorch中的实现. 关注TechLea ...
- SpringBoot 项目实战 | 瑞吉外卖 Day01
一.软件开发整体介绍 1.软件开发流程 2.角色分工 项目经理:对整个项目负责,任务分配.把控进度 产品经理:进行需求调研,输出需求调研文档.产品原型等 UI设计师:根据产品原型输出界面效果图 架构师 ...
- Codeforces Round #665 (Div. 2) A - D题题解
成功拼手速提前过了AC两题,估计因为这个原因排名挺高的,B题晚上做的时候没绕出来,wa4发... 1401A - Distance and Axis 如果 \(n\) 小 于 \(k\) ,则必须将\ ...
- 【SpringBoot】 启动后会调用执行的方法的 (五种方式)
在 SpringBoot 工程 启动后, 会调用执行方法的五种方式: 亲自测试, 按照执行顺序如下: 第一种: @Component public class SpringContext1 { @Po ...
- S3C2440移植uboot之裁剪和修改默认参数
上一节S3C2440移植uboot之支持DM9000移植uboot支持了网卡驱动,这节裁剪和修改uboot默认参数 目录 uboot的环境参数 修改uboot的默认环境变量 查看 default_ ...
- python常见面试题讲解(七)合并表记录
题目描述 数据表记录包含表索引和数值(int范围的整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出. 输入描述: 先输入键值对的个数然后输入成对的in ...