var code = "cca51982-c8d0-47cd-92c1-732df2ea7657"

1.概述

1. 介绍

Docker本质上是一个容器应用工具引擎,它简化了容器的创建、使用和分发过程,提供了操作系统的虚拟化解决方案。虽然Docker本身不直接实现底层的技术,但它通过整合底层技术LXC的虚拟化特性,间接实现了容器虚拟化。

虚拟化是指将一个物理计算机分割成多个逻辑计算机。

容器化则是对操作系统层进行虚拟化的技术。

Docker技术流行是因为它解决了应用部署过程中的环境一致性问题。在Docker出现之前,不同团队成员之间由于环境配置不一致导致的问题非常常见。Docker通过打包应用和环境依赖为一个镜像,在任何环境中都可以直接运行,从而避免了环境不一致带来的问题。

2.为什么要用 Docker
  • 更高效的利用系统资源

由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。

  • 更快速的启动时间

传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。

  • 一致的运行环境

开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。

  • 持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。

而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。

  • 更轻松的迁移

由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。

  • 更轻松的维护和扩展

Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。

  • 与传统虚拟机对比

特性容器虚拟机
启动秒级分钟级
硬盘使用一般为 MB一般为 GB
性能接近原生弱于
系统支持量单机支持上千个容器一般几十个
3.容器与虚拟机的区别

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

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

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

1.Docker 容器的启动可以在秒级实现,相比传统的虚拟机方式要快很多(分钟级) 。 其次,容器对系统资源的利用率很高,一台主机上可以同时运行数百个 Docker 应用。

2.容器基本不消耗额外的系统资源,使系统的开销尽量小。

3.虚拟机技术依赖物理 CPU 和内存,属于硬件级别的(特别是桌面虚拟化);而 Docker 构建在操作系统上, 利用操作系统的系统隔离技术运行,甚至 Docker 可以在虚拟机中运行。

4.无需硬件支持,在大多数主流的 Linux/Unix 与 Windows 系统上都支持。

4.Docker 三要素

Docker 包括三个基本概念

  • 镜像(Image)就是应用和环境依赖一起打包成的

  • 容器(Container)

  • 仓库(Repository)

理解了这三个概念,就理解了 Docker 的整个生命周期

  • 镜像(Image)——一个特殊的文件系统

    • 特性

    传统架构 centos bootfs: kernel rootfs: / 在Docker 中,(共用一个内核,证明 进入容器的root用户和真实系统的root用户是一个)bootfs一样

    rootfs:不一样用的是groupfs 容器如何启动:使用宿主机,bootfs:共用 kernel

    rootfs的已有的分层只能读不能修改(ro) ,上层镜像优先级大于底层镜像,但是容器内部通过UFS分层存储技术,在最上层添加了一个可写的RW层,用户在容器内写入数据的操作实际上是写入到这层空间中。

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

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

可以通过docker history命令查看镜像的层级结构。每一层都包含不同的文件,制作镜像时,各层之间按照“后进先出”的原则覆盖底层内容。在容器运行状态下,UFS技术将所有层级压扁为一层供用户读取,但实际上每一层都有其对应的文件内容。

  • 镜像分类

    • 官方维护的镜像 仓库名:tag 在拉取时,使用docker pull busybox:latest 会自动补全路径 拉取的就是官方镜像

      实际pull的路径是 docker.io/library/mysql:latest 也是真正的镜像全称

      用docker login 登录成功后会把用户名和密码存入这个文件$HOME/.docker/config.jsonecho (要记得)

      用户和密码确实没有加密,用base64即可查看 "yWRtaW46SGFyYm9yMTINDU="| base64 -d

    • 第三方公司 或 个人 用户名 :仓库名: tag

      grafana/grafana:latest

    • 私有镜像仓库 镜像url 用户名:仓库名: tag registry.cn-beijing.aliyuncs.com/xxhf/nginx:1.22.1 也是真正的镜像全称,真正的镜像组成

  • 容器(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/ 。在国内访问Docker Hub 可能会比较慢国内也有一些云服务商提供类似于 Docker Hub 的公开服务。比如 时速云镜像库、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等。

除了使用公开服务外,用户还可以在本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 镜像,可以直接使用做为私有 Registry 服务。开源的 Docker Registry 镜像只提供了 Docker Registry API 的服务端实现,足以支持 docker 命令,不影响使用。但不包含图形界面,以及镜像维护、用户管理、访问控制等高级功能。

5.Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,即可使用远程 API 来管理服务端和创建容器。 Docker 容器需要通过 Docker 镜像来创建。

Docker C/S 架构逻辑图: 当客户请求从仓库下载某个特定版本的操作系统或应用程序(例如redis或ubunt)时,Docker daemon(dei men)从仓库获取所需的镜像,并将其加载到本地。之后,通过执行docker run命令,镜像被启动并转化为一个运行中的容器。这个容器就像一个独立的虚拟操作系统,可以根据需求进行各种操作,如安装软件、配置服务等。

 posted on 2025-01-01 20:31  dapaige  阅读(37)  评论(0)    收藏  举报  来源