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=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 主机本身,有时也称为托管 “机器”。

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 实践和核心组件解析,持续关注!

最近面试的小伙伴很多,对此我整理了一份Java面试题手册:基础知识、JavaOOP、Java集合/泛型面试题、
Java异常面试题、Java中的IO与NIO面试题、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、
Memcached、MongoDB、Spring、SpringBoot、SpringCloud、RabbitMQ、Dubbo、MyBatis、ZooKeeper、数据结构、算法、
Elasticsearch、Kafka、微服务、Linux等等。可以分享给大家学习。【持续更新中】领取方式【999】就可以领取资料了

Docker 与虚拟化技术浅析第一弹之 docker 与 Kubernetes相关推荐

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

    1 前言 Docker是一个开源的引擎,可以轻松地为任何应用创建一个轻量级的. 可移植的.自给自足的容器.开发者在笔记本电脑上编译测试通过的容器可以批量地在生产环境中部署,包括VMs (虚拟机).ba ...

  2. docker容器虚拟化技术_Docker,虚拟机和容器的全面介绍

    docker容器虚拟化技术 by shota jolbordi 通过Shota Jolbordi Docker has been a buzzword for tech people for the ...

  3. Docker容器虚拟化技术---Docker运维管理(Swarm集群管理)3

    Docker容器虚拟化技术-Docker运维管理(Swarm集群管理)3 Swarm集群管理 docker swarm是docker官方提供的一套容器编排系统,是Docker公司推出的官方容器集群平台 ...

  4. Docker容器虚拟化技术---Docker高级实战(DockerFile)2

    Docker容器虚拟化技术-Docker高级实战(DockerFile) DockerFile是一个文本格式的配置文件,用户可以使用DockerFile来快速创建自定义的镜像. 1. DockerFi ...

  5. 实战:Docker容器虚拟化技术(使用DockerFile构建镜像并搭建 swarm+compose集群)5

    实战:Docker容器虚拟化技术 (使用DockerFile构建镜像并搭建 swarm+compose集群)5 要求: 使用DockerFile构建镜像并搭建 swarm+compose集群 在Swa ...

  6. Docker容器虚拟化技术---Docker运维管理(Docker Compose)4

    Docker容器虚拟化技术-Docker运维管理(Docker Compose)4 Docker Compose 通过前面的讲解我们知道使用一个Dockerfile模板文件,可以很方便地定义一个单独的 ...

  7. Docker——容器虚拟化技术

    目录 一.Docker介绍 诞生背景 Docker介绍 虚拟机技术与容器虚拟化技术 虚拟机技术 容器虚拟化技术 官方网站 二.Docker安装 安装Docker Docker管理命令 Docker底层 ...

  8. 聊聊 Docker 和 虚拟化技术

    参考docker 运行效率_这么火的Docker,到底是什么?_魔王不造反的博客-CSDN博客 什么是Docker? 上周二,陈工收到领导的工作指示,需要他把.net开发的网站和php开发的网站安装在 ...

  9. 【技术系列】浅谈GPU虚拟化技术(第一章)

    摘要: GPU深度好文系列,阿里云技术专家分享 第一章 GPU虚拟化发展史 GPU的虚拟化发展历程事实上与公有云市场和云计算应用场景的普及息息相关.如果在10年前谈起云计算,大部分人的反应是" ...

最新文章

  1. java通用象棋游戏_在通用国际象棋界面周围模拟GraphQL包装器
  2. android--------内存泄露分析工具—Android Monitor
  3. PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
  4. 爬虫 | urllib入门+糗事百科实战
  5. Scala教程之:可变和不变集合
  6. HTTP协议支持的方法
  7. SNF软件开发机器人-子系统-导出-导入功能-多人合作时这个功能经常用到
  8. 拯救万千学子于水深火热之中!Facebook开源无梯度优化工具
  9. 手机APP测试主要有哪些内容
  10. matlab freqz half,[转载]Matlab freqz函数使用
  11. 投资:保险业分析框架
  12. 鸟哥的Linux私房菜基础学习篇 第2章的重点探索
  13. JDBC的批处理和事务
  14. Android Databinding 与 RecycleView mvvm的运用
  15. C++实验八——类的继承(2)
  16. Android安卓拖拉机版Docker
  17. 《Getting Real中文版》读书笔记
  18. 适用于Mac,iPad和iPhone的通用PDF编辑器
  19. windows下vscode安装kubernetes环境并打开阿里云CSK
  20. 注册Netgear DDNS账号的操作

热门文章

  1. 《仓库管理系统》主要功能展示
  2. ARP欺骗攻击原理及其防御
  3. Android 自动化触发GC
  4. Words Of Wisdom
  5. Leetcode_6_Z字形变换_模拟
  6. Stokes theorem
  7. linux中w命令使用
  8. Exceeded maximum number of retries. Exhausted all hosts available for retrying build failures
  9. 小白学Django第十天| 模板的知识全部给你总结好了!
  10. Python 调用微信公众号接口(RPA 项目 - 交互篇)