玩转docker(1)-基础知识

Docker 简介

什么是Docker

官方定义:Docker是以Docker容器为资源分割和调度的基本单位,封装整个软件运行时环境,为开发者和系统管理员设计的,用于构建、发布和运行分布式应用的平台。
Docker使用Go语言进行开发实现,基于Linux内核的cgroup,namespace等技术,对进程进行封装隔离,由于隔离的进程独立于宿主和其他隔离的进程因此被称为容器。最初实现是基于LXC,从0.7版本以后开始去除LXC转而使用自行开发的libcontainer,从1.11开始则进一步演化使用runC和containerd。

Docker版本发展史

  1. 2013年3月:Docker正式在github上发布0.1版本,遵从Apache 2.0开源协议
  2. 2014年6月:Docker1.0版本正式发布
  3. 2017年2月:发布1.13.1版本
  4. 2017年3月:docker团队宣布企业版Docker Enterprise Edition(EE)发布,而免费的Docker Engine改名为Docker Community Edition(CE),并采用基于时间的版本号方案,同时发布了Docker EE和Docker CE的17.03版本,自此Docker CE/EE每个季度发布一次季度版本,每个月发布一次EDGE版本。
  5. 截止目前的最新版本为 19.03.5

为什么要用Docker

作为一个新兴的虚拟化方式,Docker跟传统的虚拟化方式想比较有众多的优势:

持续部署与测试

容器消除了线上线下的环境差异,保证了应用生命周期的环境一致性和标准化。开发人员使用镜像实现标准开发环境的构建,开发完成后通过封装着完整环境和应用的镜像进行迁移。因此测试和运维人员可以直接部署软件镜像来进行测试和发布,大大简化了持续集成、测试和发布的过程

跨云平台支持

容器带来的好处之一就是其适用性,越来越多云平台支持容器,用户不用在担心受到云平台的捆绑,同时也让应用多平台混合部署成为可能。

高资源利用率

由于容器不需要进行硬件虚拟以及运行完整操作系统的额外开销,Docker对系统资源的利用率更高。无论是执行速度、内存损耗等都要比传统虚拟机技术更加高效。

环境标准化和版本控制

基于容器提供的环境一致性和标准化,可以使用git等工具对容器镜像进行版本控制,想比较基于代码的版本控制来说,你还可以对整个应用运行环境实现版本控制,一旦出现故障可以快速 回滚。

应用镜像仓库

Docker官方构建了一个镜像仓库,组织和管理形式类似与github,其上已经积累了成千上万的镜像,因为Docker的跨平台适配性,相当于为用户提供了一个非常有用的应用商店,所有人都可以自由下载。

Docker的基本概念

Docker中包含三个基本概念:

  • 镜像 Image
  • 容器 Container
  • 仓库 Repository
    理解这三个基本概念就理解了Docker的整个生命周期。


    三者的关系

Docker镜像

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含一些为运行时准备的一些配置参数,镜像不包含任何动态数据,其内容在构建之后也不会被改变。
例如官方镜像ubuntu就包含了完整的一套unbutu最小系统的root文件系统。
docker中镜像并非是想一个ISO那样打包文件,而是一个虚拟的概念其实际体现并非由一个文件组成,而是由一组文件系统组成。

镜像定义

镜像是一堆只读层的统一视角,上图左边我们看到多个只读层,他们重叠在一起,除了最下面一层,其他层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在主机的文件系统上访问到。统一文件系统技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度来看,只存在一个文件系统。就是上图右侧所示。

Docker容器

镜像和容器的关系,就像是面向对象编程中的类和实例一样,镜像是静态的定义,容器是镜像的运行的实体,容器可以被创建、启动、停止、删除等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间甚至自己的用户ID空间。容器内的进程是运行在一个隔离的环境里,使用起来就像在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。

容器定义

容器的定义和镜像几乎一样,也是一堆层的统一视角,唯一区别在于容器的最上面的那一层是可读可写的。这个最上面的一层是以镜像为基础层创建的,被称为容器存储层,容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息也会随着容器删除而丢失。
所以根据Docker最佳实践要求,容器不应该向其向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

Docker Registry

镜像构建完成后,可以很容易的在当前宿主机上运行,但是如果需要在其他服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。
一个Docker Registry中可以包含多个仓库(Repository),每个仓库可以包含多个标签(Tag),每个标签对应一个镜像。
通常,一个仓库会包含一个软件不同版本的镜像,而标签就常用与对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以latest作为默认标签。
以Ubuntu镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如果16.04我们可以通过ubuntu:16.04来制定镜像。
仓库名经常以两段式路径形式出现,比如 jwilder/nginx-proxy ,前者往往意味着Docker Registry多用户环境下的用户名,后者往往是对应的软件名。但这并非绝对,取决于所使用的具体Docker Registry的软件或服务。

Docker Registry公开服务

Docker Registry公开服务是开放给用户使用、允许用户管理镜像的Registry服务。一般这类公开服务允许用户免费上传、下载公开的镜像,并可能提供收费服务用户管理私有镜像。
最常使用的Registry公开服务是官方的Docker Hub,这也是默认的Registry,并拥有大量的高质量的官方镜像。此外由于某些原因,在国内访问这些服务会比较慢,国内的一些云服务商提供了针对Docker Hub的镜像服务,这些镜像服务被称为加速器,常用的有阿里云、网易云、DaoCloud等。

总结

Docker使用C/S结构,Docker客户端与Docker服务器进行交互,Docker服务端负责构建、运行和分发Docker镜像。Docker客户端和服务端可以运行在一台机器上,也可以通过RESTful、stock或网络接口与远程Docker服务端进行通信。


docker结构

你可能感兴趣的:(玩转docker(1)-基础知识)