Docker核心概念总结

Docker入门实操见Docker实战基础

容器

容器概念

一句话概括容器容器就是将软件打包成标准化单元以用于开发、交付和部署。

  • 容器镜像是轻量的、可执行的独立软件包 包含软件运行所需的所有内容代码、运行时环境、系统工具、系统库和设置。
  • 容器化软件适用于基于 Linux 和 Windows 的应用在任何环境中都能够始终如一地运行。
  • 容器赋予了软件独立性使其免受外在环境差异例如开发和预演环境的差异的影响从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

物理机,虚拟机与容器的区别

容器虚拟化的是操作系统而不是硬件容器之间是共享同一套操作系统资源的。虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统。因此容器的隔离级别会稍低一些。

Docker简介

Docker介绍

  • Docker 是世界领先的软件容器平台。
  • Docker 使用 Google 公司推出的 Go 语言 进行开发实现基于 Linux 内核 提供的 CGroup 功能和 namespace 来实现的以及 AUFS 类的 UnionFS 等技术对进程进行封装隔离属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程因此也称其为容器。
  • Docker 能够自动执行重复性任务例如搭建和配置开发环境从而解放了开发人员以便他们专注在真正重要的事情上构建杰出的软件。
  • 用户可以方便地创建和使用容器把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改就像管理普通的代码一样。

Docker思想

  • 集装箱
  • 标准化 ① 运输方式 ② 存储方式 ③ API 接口
  • 隔离

Docker容器的特点

  • 轻量 在一台机器上运行的多个 Docker 容器可以共享这台机器的操作系统内核它们能够迅速启动只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的并共享一些公共文件。这样就能尽量降低磁盘用量并能更快地下载镜像。
  • 标准 : Docker 容器基于开放式标准能够在所有主流 Linux 版本、Microsoft Windows 以及包括 VM、裸机服务器和云在内的任何基础设施上运行。
  • 安全 : Docker 赋予应用的隔离性不仅限于彼此隔离还独立于底层的基础设施。Docker 默认提供最强的隔离因此应用出现问题也只是单个容器的问题而不会波及到整台机器。

使用Docker的原因

  • 一致的运行环境Docker 的镜像提供了除内核外完整的运行时环境确保了应用运行环境一致性从而不会再出现 “这段代码在我机器上没问题啊” 这类问题。
  • 更快速的启动时间可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 隔离性避免公用的服务器资源会容易受到其他用户的影响。
  • 弹性伸缩快速扩展善于处理集中爆发的服务器使用压力
  • 迁移方便:可以很轻易的将在一个平台上运行的应用迁移到另一个平台上而不用担心运行环境的变化导致应用无法正常运行的情况。
  • 持续交付和部署:使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。

容器VS虚拟机

每当说起容器我们不得不将其与虚拟机做一个比较。就我而言对于两者无所谓谁会取代谁而是两者可以和谐共存。

简单来说 容器和虚拟机具有相似的资源隔离和分配优势但功能有所不同因为容器虚拟化的是操作系统而不是硬件因此容器更容易移植效率也更高。

对比图

传统虚拟机技术是虚拟出一套硬件后在其上运行一个完整操作系统在该系统上再运行所需应用进程而容器内的应用进程直接运行于宿主的内核容器内没有自己的内核而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
在这里插入图片描述

容器与虚拟机总结

特性容器虚拟机
启动秒级分钟级
硬板使用MBGB
性能接近原生弱于
系统支持量单机上千个一般几十个
  • **容器是一个应用层抽象将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行共享操作系统内核但各自作为独立的进程在用户空间中运行。**与虚拟机相比容器占用的空间较少容器镜像大小通常只有几十兆瞬间就能完成启动 。
  • 虚拟机是一个物理硬件层抽象用于将一台服务器变成多台服务器。 管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源因此 占用大量空间 。而且 VM 启动也十分缓慢 。

通过 Docker 官网我们知道了这么多 Docker 的优势但是大家也没有必要完全否定虚拟机技术因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如云服务提供商通常采用虚拟机技术隔离不同的用户。而 Docker 通常用于隔离不同的应用 例如前端后端以及数据库。

容器与虚拟机可以共存

在这里插入图片描述

Docker 基本概念

Docker 中有非常重要的三个基本概念理解了这三个概念就理解了 Docker 的整个生命周期。

  • 镜像Image
  • 容器Container
  • 仓库Repository

在这里插入图片描述

镜像Image一个特殊的文件系统

**操作系统分为内核和用户空间。**对于 Linux 而言内核启动后会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像Image就相当于是一个 root 文件系统。

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

Docker 设计时就充分利用 Union FS 的技术将其设计为分层存储的架构 。镜像实际是由多层文件系统联合组成。

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

分层存储的特征还使得镜像的复用、定制变的更为容易。甚至可以用之前构建好的镜像作为基础层然后进一步添加新的层以定制自己所需的内容构建新的镜像。

容器Container镜像运行时的实体

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

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

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

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

仓库Repository):集中存放镜像文件的地方

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

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

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

这里补充一下 Docker Registry 公开服务和私有 Docker Registry 的概念

Docker Registry 公开服务 是开放给用户使用、允许用户管理镜像的 Registry 服务。一般这类公开服务允许用户免费上传、下载公开的镜像并可能提供收费服务供用户管理私有镜像。

最常使用的 Registry 公开服务是官方的 Docker Hub 这也是默认的 Registry并拥有大量的高质量的官方镜像网址为https://hub.docker.com/open in new window 。官方是这样介绍 Docker Hub 的

Docker Hub 是 Docker 官方提供的一项服务用于与您的团队查找和共享容器镜像。

比如我们想要搜索自己想要的镜像
在这里插入图片描述

在 Docker Hub 的搜索结果中有几项关键的信息有助于我们选择合适的镜像

  • OFFICIAL Image 代表镜像为 Docker 官方提供和维护相对来说稳定性和安全性较高。
  • Stars 和点赞差不多的意思类似 GitHub 的 Star。
  • Dowloads 代表镜像被拉取的次数基本上能够表示镜像被使用的频度。

常见命令

基本命令

docker version # 查看docker版本
docker images # 查看所有已下载镜像等价于docker image ls 命令
docker container ls #	查看所有容器
docker ps #查看正在运行的容器
docker image prune # 清理临时的、没有被使用的镜像文件。-a, --all: 删除所有没有用的镜像而不仅仅是临时文件

拉取镜像

docker search mysql # 查看mysql相关镜像
docker pull mysql:5.7 # 拉取mysql镜像
docker image ls # 查看所有已下载镜像

亦可从https://hub.docker.com/查询相关镜像

删除镜像

比如我们要删除我们下载的 mysql 镜像。

通过 docker rmi [image] 等价于docker image rm [image]删除镜像之前首先要确保这个镜像没有被容器引用可以通过标签名称或者镜像 ID删除。通过我们前面讲的 docker ps命令即可查看。

➜  ~ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
c4cd691d9f80        mysql:5.7           "docker-entrypoint.s…"   7 weeks ago         Up 12 days          0.0.0.0:3306->3306/tcp, 33060/tcp   mysql

可以看到 mysql 正在被 id 为 c4cd691d9f80 的容器引用我们需要首先通过 docker stop c4cd691d9f80 或者 docker stop mysql暂停这个容器。

然后查看 mysql 镜像的 id

➜  ~ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE
mysql                   5.7                 f6509bac4980        3 months ago        373MB

通过 IMAGE ID 或者 REPOSITORY 名字即可删除

docker rmi f6509bac4980 #  或者 docker rmi mysql 

Build Ship and Run

  • Build构建镜像 镜像就像是集装箱包括文件以及运行环境等等资源。
  • Ship运输镜像 主机和仓库间运输这里的仓库就像是超级码头一样。
  • Run 运行镜像 运行的镜像就是一个容器容器就是运行程序的地方。

Docker 运行过程也就是去仓库把镜像拉到本地然后用一条命令把镜像运行起来变成容器。所以我们也常常将 Docker 称为码头工人或码头装卸工这和 Docker 的中文翻译搬运工人如出一辙。

简单了解一下 Docker 底层原理

虚拟化技术

首先Docker 容器是以虚拟化技术为基础的软件那么什么是虚拟化技术呢

简单点来说虚拟化技术可以这样定义

虚拟化技术是一种资源管理技术是将计算机的各种[实体资源](https://zh.wikipedia.org/wiki/資源_(計算機科學 “实体资源”))CPUopen in new window、内存open in new window、磁盘空间open in new window、网络适配器open in new window等予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。由此打破实体结构间的不可切割的障碍使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。

Docker 技术是基于 LXCLinux container- Linux 容器虚拟容器技术的。

LXC其名称来自 Linux 软件容器Linux Containers的缩写一种操作系统层虚拟化Operating system–level virtualization技术为 Linux 内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器Container内含应用软件本身的代码以及所需要的操作系统核心和库。通过统一的名字空间和共用 API 来分配不同软件容器的可用硬件资源创造出应用程序的独立沙箱运行环境使得 Linux 用户可以容易的创建和管理系统或应用容器。

LXC 技术主要是借助 Linux 内核中提供的 CGroup 功能和 namespace 来实现的通过 LXC 可以为软件提供一个独立的操作系统运行环境。

cgroup 和 namespace 介绍

  • namespace 是 Linux 内核用来隔离内核资源的方式。 通过 namespace 可以让一些进程只能看到与自己相关的一部分资源而另外一些进程也只能看到与它们自己相关的资源这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。Linux namespaces 是对全局系统资源的一种封装隔离使得处于不同 namespace 的进程拥有独立的全局系统资源改变一个 namespace 中的系统资源只会影响当前 namespace 里的进程对其他 namespace 中的进程没有影响。
  • CGroup 是 Control Groups 的缩写是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。
  • **cgroup 和 namespace 两者对比**两者都是将进程进行分组但是两者的作用还是有本质区别。namespace 是为了隔离进程组之间的资源而 cgroup 是为了对一组进程进行统一的资源监控和限制。
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Docker