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

3次阅读

共计 5689 个字符,预计需要花费 15 分钟才能阅读完成。

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 背地的内核常识 https://www.cnblogs.com/beilu…
swarm 与 kubernetes 比照 https://blog.csdn.net/weixin_…
K8S 超具体总结!https://blog.csdn.net/weixin_…
K8S 中文社 https://www.kubernetes.org.cn…

作者:杨建民

正文完
 0