Docker教程(一)——简介

一、Docker介绍

        docker并不是一个能用一句话描述出来的技术,下面我会通过几个方面,介绍docker到底是个什么技术,有哪些用途和好处。

  1. Docker是Google用go语言开发实现的,它基于linux内核的cgroup和namespace等技术,对进程进行了封装隔离。说白了Docker也是一个进程,只不过这个进程包括了程序运行所需要的各种环境(ps:操作系统层面的虚拟化,下面会介绍操作系统虚拟化),可以很方便的移植到其他机器上,极大程度的压榨物理机资源,对于硬件资源比较宝贵的公司是一个非常实用的技术。
  2. Docker的核心思想是集装箱思想,每个集装箱共用码头的资源,同时又自成一体独立工作,移植运输方便。
  3. 虽然Docker是基于linux内核开发的,但是其仍然可以运行在macOS和windows上。
  4. 在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  5. Docker 赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker 默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

二、物理机、虚拟机、Docker容器的区别

       物理机,一栋独立的房子,里面各种硬件软件资源都具备

        虚拟机,一栋楼方里面的一套房子,硬件软件都具备。一个物理机可以虚拟出来多个虚拟机。

        容器,一个房子里面的小隔间,包含人生活必要的硬件软件。物理机、虚拟机都可以虚拟出多个容器。

        有上面三个图例可以看出,容器虚拟的是操作系统而不是硬件,容器之间共享一套操作系统资源。虚拟机技术则是虚拟出一整套硬软件资源出来,在其上面运行一整套操作系统。

三、Docker基本概念

(1)镜像 - image - 一个特殊的文件系统

       操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而Docker 镜像(Image),就相当于是一个 root 文件系统。(上图bootfs可以验证这一过程)

       Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。

        镜像构建时,会一层层构建,前一层是后一层的基础。每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。 比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除。在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像。因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉。

(2)容器 - container - 镜像运行时的实体

        镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等 。

        容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。前面讲过镜像使用的是分层存储,容器也是如此。

        容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

        按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据 ,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此, 使用数据卷后,容器可以随意删除、重新 run ,数据却不会丢失。(数据卷很重要,下一节启动容器时,run在启动时就需要添加使用数据卷的参数)

(3)仓库(Repository)——集中存放镜像文件的地方

        镜像构建完成后,可以很容易的在当前宿主上运行,但是, 如果需要在其它服务器上使用这个镜像(例如Docker集群中slave几点需要共享master节点的镜像),我们就需要一个集中的存储、分发镜像的服务,Docker Registry就是这样的服务。

        一个 Docker Registry中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。所以说:镜像仓库是Docker用来集中存放镜像文件的地方类似于我们之前常用的代码仓库。

       通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本 。我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值