容器基础 (问题的排序很乱 虚拟化和docker穿插着 找时间排下序)

  1. 为什么需要DevOps
  2. DevOps有哪些优势
  3. Docker是什么
  4. CI服务有什么用途
  5. 如何使用Docker技术创建与环境无关的容器系统
  6. Dockerfile配置文件中的COPY和ADD指令有什么不同
  7. Docker映像(image)是什么
  8. Docker容器(container)是什么
  9. Docker中心(hub)是什么
  10. 在任意给定时间点指出一个Docker容器可能存在的运行阶段
  11. 有什么方法可以确定一个Docker容器的运行状态
  12. 在Dockerfile配置文件中最常用的指令有哪些
  13. ENV与ARG的区别
  14. CMD与
  15. 什么类型的应用(无状态性或有状态性)更适合Docker容器技术
  16. 解释Docker应用流程
  17. Docker Image 和 Docker Layer有什么不同
  18. 虚拟化技术是什么
  19. 虚拟管理层(程序)是什么
  20. Docker Swarm是什么
  21. 在使用Docker技术的产品中如何监控其运行
  22. 什么是孤儿卷及如何删除它
  23. 什么是半虚拟化(Paravirtualization)
  24. Docker技术与虚拟机技术有何不同
  25. 请解释一下Dockerfile中的ONBUILD指令的用途含义
  26. 是否在创建有状态性的Docker应用的较好实践,最适合的场景是什么?
  27. 在Windows系统上可以运行原生Docker容器吗
  28. 在非Linux操作系统平台上如何运行Docker
  29. 容器化技术在底层的运行原理
  30. 说说容器化技术与虚拟化技术的优缺点
  31. 如何使Docker适应多种运行环境
  32. 为什么Docker-compose采取的是并不等待前面依赖服务项的容器启动就绪再启动的组合容器启动策略
  33. Docker中为什么不推荐使用root用户


容器基础

1.为什么需要DevOps

软件开发公司在软件新版本发布方面,多尝试通过发布一系列以小的特性改变集为目标的新软件版本,代替发布一个大特性改变集的新软件版本的方式。这种方式有许多优点:诸如,快速的客户反馈,软件质量的保证等。也会获得较高的客户满意度评价。完成这样的软件发布模式,开发公司需要做到:

  • 增加软件部署的频率
  • 降低新发布版本的失败率
  • 缩短修复缺陷的交付时间
  • 加快解决版本冲突的问题

DevOps满足所有这些需求且帮助公司高质量完成软件无缝交付的目标

2.DevOps有哪些优势

技术优势

  • 软件的持续交付能力
  • 修复问题变得简单
  • 更快的解决问题

商业优势

  • 更快交付的特性
  • 更稳定的操作系统环境
  • 更多时间可以用于创造价值(而不是修复/维护)

    3.Docker是什么

    Docker是一个容器化平台,它包装你所有开发环境依赖成一个整体,像一个容器。保证项目开发,如开发、测试、发布等各生产环节都可以无缝工作在不同的平台
    Docker容器:将一个软件包装在一个完整的文件系统中,该文件系统包含运行需要的一切:代码,系统工具,系统库等可以安装在服务器上的任何东西
    这保证了软件总是运行在相同的运行环境,无需考虑基础环境配置的改变。

    4.CI服务有什么用途

    CI(Continuous Integration) —— 持续集成服务
    主要用于整合团队开发中不同开发者提交到开发仓库中的项目代码变化,并即时整合编译,检查整合编译错误的服务。它需要一天中多次整合编译代码的能力,若出现整合错误,可以优异、准确的定位提交错误源

    5.如何使用Docker技术创建与环境无关的容器系统

    Docker技术有三种主要的技术途径辅助完成此需求:
    存储卷(Volumes)
    环境变量(env)注入
    只读(read-only)文件系统

    6.Dockerfile配置文件中的COPY和ADD指令有什么不同

    COPY和ADD功能相似,都是将文件复制到容器内。单纯的将本地文件拷入容器内,推荐使用COPY,更直观易懂。
    但是ADD有一些特性,诸如本地归档解压和支持远程网址访问等。例子是需要本地自动解压归档文件到容器中的环境,如
    ADD rootfs.tar.xz 进入容器会自动解压rootfs文件

    7.Docker映像(image)是什么

    Docker image是Docker容器的源。换言之,Docker images用于创建Docker容器。Image通过Docker build命令创建,当运行(run)映像时,它启动成一个容器进程。做好的image由于可能非常庞大,常注册存储在诸如registry.hub.docker.com这样的公共平台上。image被分层设计,每层可单独成为一个小image,由多层小image再构成大image,这样碎片化的设计为了image在互联网上共享时,最小化传输数据的需求。

    8.Docker容器(container)是什么

    Docker container —— Docker容器
    时包含其所有运行依赖环境,但与其它容器共享操作系统内核的应用,它运行在独立的主机操作系统用户空间进程中。Docker容器并不紧密依赖特定的基础平台:可运行在任何配置的计算机,任何平台以及任何云平台上。

    9.Docker中心(hub)是什么

    Docker hub是云基础的Docker注册服务平台,它允许用户进行访问Docker中心资源库,创建自己的Docker image并测试,推送并存储创建好的docker image,连接docker云平台将已创建好的指定docker image部署到本机等任务。它提供了一个查找发现docker image,发布docker image以及控制变化升级的资源中心,成为用户组或团队协作开发中保证自动化开发流程的有效技术途径。

    10.在任意给定时间点指出一个Docker容器可能存在的运行阶段

    在任意时间点,一个Docker 容器可能存在以下的运行阶段(container的所有阶段):

  • 运行中(Running)

  • 已暂停(Paused)
  • 重启中(Restarting)
  • 已退出(Exited)

    11.有什么方法可以确定一个Docker容器的运行状态

    使用如下命令确定一个Docker容器的运行状态

    1. docker ps -a

    这将列表形式输出运行在主机上所有Docker容器及其运行状态。从这个列表中很容易找到想要的容器及其运行状态

    12.在Dockerfile配置文件中最常用的指令有哪些*

    一些常用的指令:

  • FROM:使用FROM为后续的指令创建基础image。在所有有效的Dockerfile中,FROM是第一条指令,指明当前image以哪个基础image构建而来

  • LABEL:LABEL指令用于组织项目image,模块,许可等。在自动化部署方面LABEL有很大用处。在LABEL中指定一组键值对,可用于程序化配置或部署Docker
  • RUN:RUN指令可在image当前layer执行任何命令并创建一个新layer,用于在image中添加功能层
  • CMD:使用CMD指令为执行的容器提供默认值。在Dockerfile中,若添加多个CMD指令,只有最后的CMD指令运行
  • ENTRYPOINT
  • EXPOSE
  • ENV
  • ARG
  • WORKDIR

    13.ENV与ARG的区别*

    14.CMD与 (忘了 后面补上)

    15.什么类型的应用(无状态性或有状态性)更适合Docker容器技术

    对于Docker容器创建无状态性(stateless)的应用更可取。通过从应用项目中将与状态相关的信息及配置提取掉,我们可以在项目环境外建立不依赖项目环境的docker容器。这样,我们可以在任意产品中运行同一容器,只需根据产品需要像问&答(Q&A)一样给其配置环境即可。这帮助我们在不同场景重用相同的Docker image。另外,使用stateless容器应用相比stateful容器更具有伸缩性,也更容器创建

    16.解释Docker应用流程

    初始,所有都依赖于Dockerfile配置文件。Dockerfile配置文件就是创建Docker image的源代码
    一旦Dockerfile配置好了,就可以创建(build)并生成image,image就是Dockerfile文件中,源代码的编译版本。一旦有了image,就可以在registry(注册中心)发布它。registry类似git资源库,你可以推送你的image,也可以取回库中的image。
    之后,你就可以使用image去启动运行container。运行中的容器在许多方面,与虚拟机非常相似,但容器的运行不需要虚拟管理软件的运行。

    17.Docker Image 和 Docker Layer有什么不同

    Image:一个docker image是由一系列docker只读层(read-only layer)创建出来的。
    Layer:在Dockerfile配置文件中完成的一系列配置指令,即表示一个Docker Layer
    如下Dockerfile文件包含4条指令,每条指令都创建一个layer ```dockerfile FROM ubuntu:20.04

COPY . /app RUN make /app CMD [ “python”, “/app/app.py” ]

**重点**:每层只对其前一层进行一些进化
<a name="W0oal"></a>
### 18.虚拟化技术是什么
最初的构想,virtulization被认为是逻辑划分大型主机使多个应用可以并行运行的一种技术方案。然而,随着技术公司及开源社区的推进,现实发生了戏剧性的转变,以致产生了以一种或某种方式操作特权指令可以在单台基于x86硬件的系统上同时运行多种操作系统的技术。<br />实质效果是,虚拟化技术允许你在一个硬件平台下运行2种完全不同的操作系统。每个客户操作系统可完成像系统自检、启动、载入系统内核等像在独立硬件上的一切动作。同时也具备坚实的安全基础,例如,客户操作系统不能获取完全访问主机或其他客户系统的权限及其他设计安全、可能损坏系统的操作。<br />基于对客户操作系统虚拟硬件、运行环境模拟方法的不同,对虚拟化技术进行分类,主要的有如下3种虚拟化技术种类:

- 全虚拟(Emulation)
- 半虚拟(Paravirtualization)
- 基于容器的虚拟化(Container-based virtualization)
<a name="Cmc8Y"></a>
### 19.虚拟管理层(程序)是什么
hypervisor —— 虚拟管理层 <br />负责创建客户虚拟机系统运行所需的虚拟硬件环境。它监管客户虚拟操作系统的运行,并为客户系统提供必要的运行资源,保证客户虚拟系统的运行。虚拟管理层(程序)驻留在物理主机系统和虚拟客户系统之间,为虚拟客户系统提供必要的虚拟服务。<br />如何理解它:它侦听运行在虚拟机中的客户操作系统的操作并在主机操作系统中模拟客户操作系统所需硬件资源请求。满足客户机的运行需求。<br />虚拟化技术的快速发展,主要在云平台,由于在虚拟管理程序的帮助下,可允许在单台物理机上生成多个虚拟服务器,驱动着虚拟化技术快速发展及广泛应用。诸如Xen、VMware、KVM等,以及商业化的处理器硬件生产厂商也加入在硬件层面支持虚拟化技术的支持。诸如Intel的VT和AMD的AMD-V
<a name="SPZUa"></a>
### 20.Docker Swarm是什么
Docker Swarm —— Docker群<br />是原生的Docker集群服务工具。它将一群Docker主机集成为单一一个虚拟Docker主机。利用一个Docker守护进程,通过标准的Docker API和任何完善的通讯工具,Docker Swarm提供透明地将Docker主机扩散到多台主机的服务。
<a name="wb6zo"></a>
### 21.在使用Docker技术的产品中如何监控其运行
Docker在产品中提供如运行统计和Docker事件的工具。可以通过这些工具命令获取Docker运行状况的统计信息或报告。<br />Docker stats: 通过指定的容器ID获取其运行统计信息,可获得容器对CPU、内存使用情况的统计信息,类似Linux系统中的top命令。<br />Docker events:Docker事件是一个命令,用于观察显示运行中的docker一系列的行为活动。<br />一般的Docker事件有:attach(关联),commit(提交),die(僵死),detach(取消关联),rename(改名),destroy(销毁)等。也可以使用多个选项对事件记录筛选找到想要的事件信息。
<a name="zy1aH"></a>
### 22.什么是孤儿卷及如何删除它* (什么鬼说的不清不楚的)
孤儿卷是未与任何容器关联的卷。在Docker v1.9之前的版本中,删除这些孤儿卷存在很大问题。<br />删除一个卷
```bash
docker volume rm <volume name>

删除所有未使用的卷

docker volume prune (remove all unused local volumes)

23.什么是半虚拟化(Paravirtualization)

Paravirtualization,也成为第一类虚拟机管理(层)程序,其直接在硬件或裸机(bare-metal)上运行,提供虚拟机直接使用物理硬件的服务,它帮助主机操作系统,虚拟化硬件和实际硬件进行协作以实现最佳性能。这种虚拟层管理技术的程序一般占用系统资源较小,其本身并不需要占用大量系统资源。
这种虚拟层管理程序有Xen、KVM等。
image.png

24.Docker技术与虚拟机技术有何不同

Docker不是严格意义上的虚拟化硬件技术。它依赖Container-based Virtualization(基于容器的虚拟化)的技术实现工具,或可以认为它是操作系统用户运行级别的虚拟化。因此,docker最初使用LXC驱动它,后来移至由libcontainer基础库驱动,现已更名runc。Docker主要致力于应用容器内的应用程序的自动化部署。应用容器设计用于包装和运行单一服务,而操作系统设计用于运行多进程任务,提供多种运算服务的能力。如虚拟机中等同完全操作系统的能力。因此,docker被认为是容器化系统上管理容器及应用容器化的部署工具。
image.png
区别

  • 与虚拟机不同,容器无需启动操作系统内核。因此,容器可在不到1s内运行起来。这个特性使得容器化技术比其他虚拟化技术更具有独特性和可取性
  • 由于容器化技术很少或几乎不给主机系统增加负载,因此,基于容器的虚拟化技术具有近乎原生的性能表现。
  • 基于容器的虚拟化,与其他硬件虚拟化不同,运行时不需要额外的虚拟层管理软件
  • 主机上所有容器共享主机操作系统的进程调度,从而节省了额外资源的需求
  • 与虚拟机image相比,容器image较小,因此,容器image更易于分发
  • 容器中的资源分配由Cgroups实现。Cgroup不会让容器占用比给他们分配的更多的资源。但是,现在的虚拟化技术,对于虚拟机,主机所有资源都可见,但无法使用。这可以通过在容器和主机上同时运行top或htop观察到。在两个环境中的输出看起来相同

    25.请解释一下Dockerfile中的ONBUILD指令的用途含义*

    配置文件中的Onbuild指令为创建的Docker image加入在将来执行的指令(在配置文件生成的image中并不执行),用于在以这个创建的image为基础创建的子image中执行或定制。举例:
    以基础image创建自由image过程中,基础image中所有的创建层或指令是以整体或固化的方式导入自有image中的,自有image是不能对这个过程进行自有定制的。而Onbuild指令提供了将某些层从基础image中剥离出来提供给之后以自有image为基础image派生新的image的可定制途径。这对发布image而部署在不同运行环境的定制非常有用。

    26.是否在创建有状态性的Docker应用的较好实践,最适合的场景是什么?

    stateful docker 应用的问题关键在于状态数据保存在哪的问题。若所有数据保存在容器内,当更新软件版本或想将Docker容器移到其他机器上时,找回这些运行中产生的数据将非常困难。
    您需要做的是将这些表达运行状态的数据保存在永久卷中。参考如下三种模式:
    image.png
  1. 数据保存在容器中,当容器停止运行时,运行状态数据丢失
  2. 数据保存在主机卷(Host Volume)中,当主机停机时,运行状态数据将无法访问
  3. 将数据保存在网络文件系统卷中,数据访问不依赖容器的运行与主机的运行

若使用

docker run -v hostFolder:/containerFolder

命令运行容器,容器运行中任何对/containerFolder目录下数据的改变,将永久保存在hostFolder目录中。使用网络文件系统(nfs)与此类似。那样就可以运行容器在任何主机上且运行状态数据被保存在NFS中

27.在Windows系统上可以运行原生Docker容器吗*(这解释跟题目是不是不太对)

在Windows Server 2016及之后的 系统上,可以运行Windows的原生容器,微软推出的image是Windows Nano Server,一个轻量级的运行在容器中的Windows原生系统。可以在其中部署基于.NET的应用

28.在非Linux操作系统平台上如何运行Docker

容器化虚拟技术可能来源于Linux内核版本2.6.24上加入对命名空间(namesapce)的技术支持特性。容器化进程加入其进程ID到其创建的每个进程上并且每个进程中的系统级调用进行访问控制及审查。其本身是由系统级调用close()克隆出来的进程,允许其创建属于自己命名空间的进程实例,而区别于之前的,归属于整个本机系统的进程实例。
如果上述在Linux系统内核上的技术实现成为可能,那么明显的问题是如何在非Linux系统上运行容器化的Docker。过去,Mac和Windows系统上运行Docker都使用Linux虚拟机(VMs)技术,Docker工具箱使用的容器运行在Virtual Box虚拟机上。现在,最新的情况是,windows平台上使用的是Hyper-V技术,Mac上使用的是Hypervisor.framework(框架)技术。

29.容器化技术在底层的运行原理

2006年前后,人们在Linux内核级别上实现了一种新的名为namespace的技术(实际上这种概念在FreeBSD系统上由来已久)。我们知道,操作系统的一个功能就是进程共享公共资源,诸如:网络和磁盘空间等。但是,如果一些公共资源被包装在一个命名空间中,只允许属于这个命名空间中的进程访问又如何呢?也就是说,可以分配一大块硬盘空间给命名空间X使用,但是,命名空间Y中的进程无法看到或访问这部分资源。当然,X中的进程无法于Y中的进程进行交互。这提供了某种对公共资源的虚拟化和隔离技术。
这就是Docker技术的底层工作原理:每个容器运行在自己的namespace中,但是,确实与其他运行中的容器共用相同的系统内核。隔离的产生就是由于系统内核清楚的知道其命名空间及其中的进程。且这些进程调用系统API时,内核保证进程只能访问属于其命名空间中的资源。
image.png
运行中的容器是隔离的。准确的说,各容器共享操作系统内核及操作系统API。

30.说说容器化技术与虚拟化技术的优缺点

不能像虚拟机那样在容器上运行与主机完全不同的操作系统。然而,可以在容器上运行不同的Linux发布版,由于容器共享系统内核的缘故。容器的隔离性没有虚拟机那么健壮。事实上,早期容器化技术实现上,存在某种方法使客户容器可以接管整个主机系统。
也可以看到,载入新容器并运行,并不会像虚拟机那样装载一个新的操作系统进来。
所有的容器共享同一系统内核,这也就是容器被认为非常轻量化的原因。同样的原因,不像虚拟机,你不需为容器预分配大量的内存空间,因为它不是运行新的整个的操作系统。这使得一个操作系统主机上,可以同时运行成百上千个容器应用,在运行完整操作系统的虚拟机上,进行这么多的并行沙箱实验是不可能的

31.如何使Docker适应多种运行环境*

  1. 移除应用代码中对任何固定存储卷的绑定,由于代码驻留在容器内部,而不能从外部进行修正。
  2. 绑定应用端口到主机上的不同端口
  3. 差异化设置环境变量(如:减少日志冗余或者使能发电子邮件(?))
  4. 设定重启策略(如:restart:always)避免长时间宕机
  5. 加入额外的服务(如log aggregator)
  6. 由于以上原因,你更需要一个docker-compose文件,它配置了恰当的产品整合服务。

    32.为什么Docker-compose采取的是并不等待前面依赖服务项的容器启动就绪再启动的组合容器启动策略*(并没有说清楚)

    Docker的compose配置总是依赖启动序列来启动或停止Compose中的服务容器,依赖启动顺序是由compose配置文件中的depend_on、links、volumes_from和network_mode: service: … 等这些配置指令所确定的
    然而,compose启动中,各容器的启动并不等待其依赖容器(这必定是你整个应用中的某个依赖服务或应用)启动就绪后才启动。使用这种策略较好的理由如下:

  7. 等待一个数据库服务(距离)就绪这样的问题,在大型分布式系统中。在实际发布产品运维中,你的数据库服务由于各种各样的原因,或者迁移宿主机导致其不可访问。你发布的产品需要应对这样状况的弹性。

  8. 掌控这些,开发设计你的应用,使其在访问数据库失效的情况下,能够试图重连数据库,直到连接到数据库为止。
  9. 最佳的解决方案是你的应用代码检查中是否有应对意外发生的情况,无论是任何原因导致启动或连接失效都应该考虑在内。

    33.Docker中为什么不推荐使用root用户

    举例来说,docker允许docker主机和容器之间共享一个目录;它允许您在不限制容器访问权限的情况下执行操作。这意味着启动一个容器,其中的/host目录是你主机上的 /目录,则容器可以不受任何限制的修改你主机的文件系统。这会有很强的安全隐患。还有暴露http端口可能使docker越过主机的防火墙进行提权操作。