2024年6月3日发(作者:)

《Docker容器技术 配置、部署与应用》

习题参考答案

项目一 Docker安装

选择题

1、A

2、C

3、A

4、B

简答题

1.什么是Docker?

Docker是一个开源的容器项目,是一个运行和管理容器的容器引擎。Docker为应用

程序的开发、发布和运行提供一个基于容器的标准化平台。容器运行的是应用程序,Docker

平台用来管理容器的整个生命周期。

2.容器与虚拟机有什么不同?

两者的不同之处主要体现在以下4个方面。

容器在主机上本地运行,运行的是一个独立的进程,并与其他容器共享主机的操作系

统内核,具备轻量化的优点。而每个虚拟机运行一个完整的客户操作系统,主机要为每个

虚拟机分配资源,虚拟机提供的环境所包含的资源超出了大多数应用程序的实际需要。

各个容器共享主机的操作系统,使用的是主机操作系统的内核,容器依赖于主机操作

系统的内核版本。虚拟机有自己的操作系统,且独立于主机操作系统,其操作系统内核可

以与主机不同。

容器在主机操作系统的用户空间内运行,并且与操作系统的其他进程相互隔离,启动

时也不需要启动操作系统内核空间。与虚拟机相比,容器启动快、开销少,而且迁移更便

捷。

就隔离特性来说,容器是应用层面的隔离,虚拟机是物理资源层面的隔离。

3.Docker引擎包括哪些组件?

Docker引擎是客户/服务器架构的应用程序,包括的组件有服务器(Docker守护进

程)、REST API(定义程序与Docker守护进程交互的接口)和客户端(命令行接口)。

4.简述Docker架构。

Docker客户端与Docker守护进程通信,而Docker守护进程相当于Docker服务器,

负责构建、运行和分发容器的繁重任务。Docker客户端和守护进程之间使用REST API通

过UNIX套接字(Socket)或网络接口进行通信。Docker守护进程和Docker客户端属于

Docker引擎的一部分。Docker注册中心用于存储和分发Docker镜像。默认情况下,

Docker守护进程会到Docker Hub中查找镜像。

5.Docker使用了哪些底层技术?

Docker使用的底层技术包括名称空间、控制组、联合文件系统和容器格式。

6.Docker命令行接口有哪些类型?

Docker命令行接口类型包括引擎命令行接口、容器编排命令行接口、机器命令行接口、

DTR命令行接口和UCP命令行接口。

项目二 Docker快速入门

选择题

1、D

2、C

3、B

4、C

5、B

6、A

简答题

1.什么是镜像?

Docker镜像是按照Docker要求定制的应用程序。一个Docker镜像可以包括一个应

用程序以及能够运行它的基本操作系统环境。Docker镜像是一个特殊的文件系统,除了提

供容器运行时所需的程序、库、资源、配置等文件外,还包含了为运行准备的一些配置参

数。

2.Docker使用哪几种方式来标识镜像?

镜像可以通过镜像ID、镜像名称或者镜像摘要值来标识。

3.镜像描述文件有什么用?

Docker所用的Dockerfile文件用来描述镜像,定义了如何构建Docker镜像。Docker

通过读取Dockerfile中的指令自动构建镜像。

4.什么是基础镜像?

大多数镜像都是从一个父镜像开始扩展的,这个父镜像通常是一个基础镜像。基础镜

像不依赖其他镜像,而是从“零”开始构建。

5.简述镜像的分层结构。

早期镜像的分层结构是通过联合文件系统实现的,联合文件系统将各层的文件系统叠

加在一起,向用户呈现一个完整的文件系统。这种分层结构会导致镜像的层数越来越多,

需要修改大文件时会影响操作效率,底层基础镜修改导致维护工作量大,镜像无法审计。

为克服这些不足,Docker推荐选择Dockerfile文件逐层构建镜像,每一层都由镜像的

Dockerfile指令所决定,除了最后一层,每层都是只读的。

6.什么是容器?

容器是指从镜像创建的应用程序运行实例。镜像是静态的定义,容器是镜像运行时的

实体,基于同一镜像可以创建若干不同的容器。容器的实质是进程,但与直接在主机上执

行的进程不同,容器进程在属于自己的独立的命名空间内运行。因此容器可以拥有自己的

根文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID空间。

7.Docker使用哪几种方式来标识容器?

Docker使用容器ID或容器名称来标识容器。

8.什么是容器层?它有什么特点?

正在运行的容器会在其镜像上面增加一个可写的层,所有写入容器的数据都保存在这

个可写层中,这个可写层就是容器层。

由于每个容器都有自己的可写容器层,所有的改变都存储在这个容器层中,因此多个

容器可以共享访问同一个底层镜像,并且仍然拥有自己的数据状态。

9.写时复制有什么作用?

写时复制最大限度地减少了每个后续层的I/O和空间大小,减少镜像大小,使容器效

率更高。

10.Docker注册中心与仓库有什么不同?

注册中心是存放仓库的地方,一个注册中心往往有很多仓库。仓库是集中存放镜像文

件的地方,每个仓库集中存放某一类镜像,往往包括多个镜像文件,不同的镜像通过不同

的标签来区分,并通过“仓库名:标签”格式指定特定版本的镜像。

11.Docker Hub有哪些功能?

Docker Hub具有以下主要功能。

(1)镜像仓库,用于上传和下载容器镜像。

(2)团队和组织,管理对容器镜像的私有仓库的访问。

(3)提供官方镜像。

(4)提供发布者镜像。

(5)镜像构建,支持源代码托管平台自动构建容器镜像并将它们上传到Docker Hub。

(6)提供Webhooks。这是一个自动化构建特性,在一个镜像上传成功后,Webhooks

会触发操作,将Docker Hub与其他服务进行整合。

12.Docker构建镜像有哪几种方法?

Docker提供了两种构建镜像的方法,一是将现有容器转化为镜像,二是通过

Dockerfile构建镜像。

13.COPY指令应遵守哪些复制规则?

COPY指令应遵守以下复制规则。

(1)源路径必须位于构建上下文中。

(2)如果源是目录,则复制目录的整个内容,包括文件系统元数据。

(3)如果源是任何其他类型的文件,则它会与其元数据被分别复制。

(4)如果直接指定多个源,或者源中使用了通配符,则目的路径必须是目录,并且必

须以斜杠(/)结尾。

(5)如果目的路径不以斜杠结尾,则它将被视为常规文件,源内容将被写入目录路径。

(6)如果目的路径不存在,则会与其路径中所有缺少的目录一起被创建。

14.RUN、CMD和ENTRYPOINT指令有何不同?

RUN指令执行命令并创建新的镜像层,经常用于安装应用程序和软件包。RUN先于

CMD或ENTRYPOINT指令在构建镜像时执行,并被固化在所生成的镜像中。

CMD和ENTRYPOINT指令在每次启动容器时才执行,两者的区别在于CMD指令会

被docker run命令所覆盖。两个指令一起使用时,ENTRYPOINT指令作为可执行文件,

而CMD指令则为ENTRYPOINT指令提供默认参数。

项目三 Docker网络与存储配置

选择题

1、B

2、D

3、A

4、D

5、D

6、B

7、C

8、B

简答题

1.Docker网络驱动主要有哪几种?

常用的Docker网络驱动有bridge(桥接网络)、host(主机网络)、overlay(覆盖网

络)、macvlan、none和网络插件。

2.选择Docker网络驱动应遵守哪些原则?

选择Docker网络驱动应遵守以下原则。

(1)用户自定义桥接网络最适合用于同一个Docker主机上运行的多个容器之间需要

通信的场景。

(2)host网络最适用于当网络栈不能与Docker主机隔离,而容器的其他方面需要

被隔离的场景。

(3)overlay网络适用于不同Docker主机上运行的容器需要通信的场景,或者多个

应用程序通过Swarm集群服务一起工作的场景。

(4)macvlan网络适用于从虚拟机迁移过来的场景,或者容器需要像网络上的物理

机一样,拥有独立MAC地址的场景。

(5)第三方网络插件适用于将Docker与专用网络栈进行集成的场景。

3.Docker的容器支持哪几种网络模式?

Docker的容器支持5种网络模式,分别是bridge模式、host模式、container模式

和none模式,以及自定义网络。

4.用户自定义桥接网络和默认桥接网络有哪些不同?

主要不同点体现在以下几个方面。

(1)用户自定义桥接网络能提供容器化应用程序之间更好的隔离和互操作性,连接到

同一个用户自定义桥接网络的容器会自动互相暴露所有端口,但不会将端口暴露到外部。

而默认桥接网络上运行应用栈,Docker主机需要通过其他方式来限制对端口的访问。

(2)用户自定义桥接网络提供容器之间自动DNS解析功能,可以通过名称或别名互

相访问。而默认桥接网络上的容器只能通过IP地址互相访问。

(3)容器可以在运行时与用户自定义网络连接和断开。要断开与默认桥接网络的连接,

需要停止容器并使用不同的网络选项重新创建该容器。

(4)每个用户可通过自定义网络创建一个可配置的网桥,而默认桥接网络不行。

(5)用户自定义网络中所连接的容器无法直接共享环境变量,而默认桥接网络中所连

接的容器可以共享环境变量。用户自定义网络有更好的方式来实现共享环境变量。

5.为什么生产环境不建议使用默认桥接网络?

默认桥接网络相当于VMware虚拟机网络连接的NAT模式,容器拥有独立的网络名

称空间和隔离的网络栈,不支持基于名称的服务发现和用户指定的IP地址,所连接的容器

只能通过IP地址互相访问,除非创建容器时使用--link选项建立容器连接。由于功能受限,

默认桥接网络只适合一些演示或实验场合,不建议用于生产。

6.容器之间有哪些通信解决方案?

容器之间的通信方案列举如下。

(1)bridge模式让同一个Docker网络上的所有容器在所有端口上都可以相互连接。

默认桥接网络所连接的容器只能通过IP地址互相访问,除非创建容器时使用--link选项建

立容器连接。

(2)host模式让所有容器都位于同一个主机网络空间中,并共用主机的IP地址栈,

在该主机上的所有容器都可通过主机的网络接口相互通信。

(3)在用户自定义桥接网络中,容器之间可以通过名称或别名互相访问。

(4)容器通过端口映射对外部提供连接。

(5)container模式让容器共用一个IP网络,两个容器之间可通过回环网络接口相

互通信。

(6)容器之间使用--link选项建立传统的容器互联。

(7)容器之间通过挂载主机目录来实现相互之间的数据通信。

7.如何能让容器能够被外部网络访问?

从外部访问容器内的应用程序必须要有明确的授权,这是通过内部端口映射来实现的。

要让容器能够被外部网络或者那些未连接到该容器的网络上的Docker主机访问,就要将

容器的一个端口映射到Docker主机上的一个端口,允许从外部网络通过该端口访问容器。

8.Docker存储驱动主要有哪几种?

Docker存储驱动主要有aufs、overlay、overlay2、devicemapper、btrfs、zfs、vfs

等。

9.Docker存储有哪几种挂载类型?各自适合哪些应用场合?

Docker存储有卷、绑定挂载和tmpfs挂载这3种挂载类型。

卷适合以下应用场合。

(1)在多个正在运行的容器之间共享数据。

(2)当Docker主机不能保证具有特定目录结构时,卷有助于将Docker主机的配置

与容器运行时解耦。

(3)当需要将容器的数据存储到远程主机或云提供商处,而不是本地时。

(4)当需要在两个Docker主机之间备份、恢复或迁移数据时。

绑定挂载适合以下应用场合。

(1)在主机和容器之间共享配置文件。

(2)在Docker主机上的开发环境和容器之间共享源代码或构建工件。

(3)当Docker主机上的目录结构保证与容器要求的绑定挂载一致时。

在不需要将数据持久保存到主机或容器中时,tmpfs挂载最合适。

10.什么是匿名卷?

匿名卷没有指定明确名称的卷。匿名卷并不是没有名称,而是Docker自动为匿名卷

生成一个UUID作为名称,这个UUID与容器一样采用的是由64个十六进制字符组成的

字符串。

11.什么情形下容器会填充卷?

如果容器启动时挂载空白卷或者自动创建新卷,而容器在挂载点目录中已有文件或目

录,则该挂载点目录的内容会被复制到该卷中,也就是将容器中挂载点目录的数据填充到

该卷中。其他容器挂载并使用该卷时可以访问其中预先填充的内容。

12.什么情形下容器挂载目录中的数据会被遮盖?

如果将主机上的目录绑定挂载到容器上的非空目录,则容器挂载的目录中的现有内容

会被绑定挂载(主机上的目录)所遮盖。被遮盖的目录和文件不会被删除或更改,但在使

用绑定挂载时不可访问。

项目四 Docker容器与守护进程运维

选择题

1、C

2、A

3、C

4、D

5、C

6、A

简答题

1.容器自动重启有哪几种策略?

共有4种策略。

(1)出时不要自动重启。这是默认策略。

(2)容器以非0状态码退出时重启,且可以限定重启次数。

(3)不管是什么退出状态都始终重启容器,且无限次地重启容器。

(4)不管是什么退出状态都始终重启容器,但不考虑Docker守护进程启动时就已经

停止的容器。

2.如何在Docker停止时让容器继续保持运行?

启用实时恢复功能,可以使容器在守护进程不可用时保持活动状态。

3.可以限制容器使用哪几种资源?

可以限制容器使用主机的CPU、内存和磁盘I/O资源这3种资源。

4.为什么要监控容器?容器的日志管理为什么重要?

在生产环境中往往会有大量的业务软件在容器中运行,需要监控容器本身和容器所在

主机的资源使用情况和性能。

容器具有数量多、变化快的特性,容器的生命周期往往短暂且不固定,因此记录日志

就显得非常必要,尤其是在生产环境中,日志是不可或缺的组成部分。日志管理有助于保

持系统持续稳定地运行以及排查问题。

5.Docker对象的标记是指什么?

Docker对象的标记是一种将元数据应用于Docker对象的机制。标记的形式是键值

对,以字符串的形式存储。可以为一个对象指定多个标记,但是同一个对象中的每个键值

对必须是唯一的。可以使用标记组织镜像,记录许可信息,注释容器、卷和网络之间的关

系,或者执行任何对业务或应用程序有意义的操作。

6.如何一次性清理多种类型的对象?

可以使用docker system prune命令一次性清理多种类型的对象。该命令是删除镜

像、容器和网络的捷径。在Docker 17.06.1及更高版本中必须为docker system prune

命令明确指定--volumes选项才会删除卷。

7.Docker守护进程的配置有哪两种方式?如何避免配置冲突?

Docker守护进程的配置有两种,一种是使用JSON配置文件,另一种是使用选项手

动启动Docker守护进程。只要不用这两种配置方式同时定义同一选项,就可以同时使用

这两种方式。

8.如何解决文件和启动脚本之间的冲突?

需要调整相关选项或文件来解决两者的冲突。在使用systemd管理启

动的Debian和Ubuntu系统上,在启动Docker守护进程时会使用-H主机选项。如果在

文件中设置了hosts选项,则会导致配置冲突,导致Docker无法启动。具

体解决方法是创建一个新的配置文件

/etc/systemd/system/e.d/,并加入以下选项设置,来屏蔽启动

守护进程时所使用的默认-H选项。

[Service]

ExecStart=

ExecStart=/usr/bin/dockerd

项目五 Docker容器编排

选择题

1、D

2、D

3、D

4、B

5、A

6、C

简答题

1.解释Compose中项目、服务和容器的概念。

项目表示需要实现的一个应用程序,涵盖了该应用程序所需的所有资源,是由一组关

联的容器组成的一个完整业务单元。

服务表示需要实现的一个子应用程序,它以容器方式完成某项任务。一个服务运行一

个镜像,但是它决定了镜像的运行方式。服务具体定义容器运行的镜像、参数和依赖关系。

在Compose中,容器指的是服务的副本。每个服务可以以多个容器实例的形式运行,

可以更改容器实例的数量来增减服务数量,从而为进程中的服务分配更多的计算资源。

2.简述Compose工作机制。

对于不同的docker-compose请求,Docker Compose将调用不同的处理方法来处

理。Docker Compose必须与Docker引擎建立连接,并在该连接之上完成Docker API

请求的处理。实际上Docker Compose是借助docker-py软件完成这个任务的,docker-

py是一个使用Python开发并调用Docker API的软件包。

3.列举Docker Compose主要应用场景。

(1)软件开发环境。在开发软件时,Docker Compose命令行工具可用于创建隔离

的环境,在其中运行应用程序并与之进行交互。Compose文件提供了记录和配置所有应

用程序的服务依赖关系的方式。可以使用单个命令为每个项目创建和启动一个或多个容器。

(2)自动化测试环境。通过Docker Compose可以创建和销毁用于测试集合的隔离

测试环境。通过在Compose文件中定义完整的环境,可以仅使用几条命令就创建和销毁

这些环境。

(3)单主机部署。可以使用Docker Compose将应用程序部署到远程Docker引擎

中。Docker引擎可以是Docker Machine或整个Docker集群配置的单个实例。

4.简述Docker Compose基本步骤。

(1)使用Dockerfile定义应用程序的环境,以便可以在任何地方分发。编排多容器

的复杂应用程序时容器的创建和运行需要相应的镜像,而镜像则要基于Dockerfile构建。

(2)使用Compose文件定义组成应用程序的服务。

(3)执行docker-compose up命令启动整个应用程序。

5.简述Compose文件结构。

Compose文件可以包含4节:version、services、networks和volumes。version

节是必须指定的,而且总是位于文件的第一行,没有任何下级节点,定义了Compose文

件格式的版本。services、networks和volumes节分别定义服务、网络和卷(存储)资

源配置,都由下级节点具体定义。

6.服务定义需要注意哪些事项?

在Compose文件中的services节中定义若干服务,每个服务实际上是一个容器,需

要基于镜像运行。每个Compose文件必须指定image或build键提供镜像,其他键是可

选的。就像使用docker container create命令一样,Dockerfile中的指令,如CMD、

EXPOSE、VOLUME、ENV等,默认已被接受,不必再在Compose文件中定义它们。

7.docker-compose的3个子命令up、run和start之间有什么区别?

通常使用docker-compose up命令启动或重新启动在中定

义的所有服务。在默认的前台模式下,将看到所有容器中的所有日志。在分离模式中,

Docker Compose在启动容器后退出,但容器继续在后台运行。

docker-compose run命令用于运行“一次性”或“临时”任务。run命令的作用与

docker run -ti打开容器的交互式终端一样,并返回与容器中进程的退出状态匹配的退出

状态。

docker-compose start命令仅用于重新启动之前创建但已停止的容器,并不创建新

的容器。

8.如何共享Compose通用配置?

使用多个Compose文件扩展整个Compose文件就可以共享Compose通用配置。

先定义一个基础的Compose文件,在其中设置通用配置,然后再根据不同的环境进行不

同的配置,最后针对不同的环境启动不同配置的服务。

项目六 应用程序容器化

选择题

1、C

2、A

3、C

4、B

5、B

6、D

简答题

1.应用程序进行容器化包括哪两项工作?

应用程序容器化最主要的工作有两项,一是构建应用程序的镜像,通常由开发人员实

施;二是基于应用程序镜像以容器方式部署和运行应用程序,主要由运维人员实施。

2.列举编写Dockerfile的通用准则。

(1)创建短生命周期的容器。

(2)正确理解构建上下文。

(3)使用.dockerignore文件排除与构建无关的文件。

(4)使用多阶段构建。

(5)不要安装不必要的包。

(6)解耦应用程序。

(7)使镜像层数最少。

(8)对多行参数排序。

(9)利用构建缓存。

3.最小镜像scratch有什么作用?

可以使用Docker保留的最小镜像scratch作为构建容器的起点。FROM scratch指

令会通知构建进程,让Dockerfile中的下一条命令成为镜像中的第一个文件系统层。

4.为什么要使用多阶段构建?

Dockerfile中的每条指令都会为镜像添加一个层,并且要在执行到下一层之前清理所

有不需要的文件。为了编写高效的Dockerfile,传统的解决方案通常需要使用shell技巧

和其他逻辑来尽可能地减小层的大小,并确保每一层仅包括来自上一层所必需的文件。而

使用多阶段构建方案,可以在Dockerfile中使用多个FROM语句。每个FROM语句都可

以使用不同的基础镜像,并且各自开始一个新的构建阶段。可以有选择性地将构建从一个

阶段复制到另一个阶段,并在最终镜像中排除所有不需要的内容。

多阶段构建可以在无须减少中间层和文件数量的情况下大幅缩减最终镜像的大小。因

为镜像在构建过程的最终阶段进行构建,所以可以充分利用缓存最小化镜像的层。

5.简述应用程序容器化的基本步骤。

应用程序容器化大致分为以下几个步骤。

(1)准备应用程序源代码。

(2)创建Docker镜像,为应用程序的每个组件创建和测试单个容器。

(3)将容器及其所需的支持基础设施组装成一个完整的应用程序,这可以使用Docker

栈文件或Kubernetes的Pod定义文件来编排。

(4)测试、分发和部署完整的容器化应用程序。

6.容器化过程中如何处理应用程序代码?

无论是源代码,还是二进制代码,在对应用程序构建镜像时,都需要考虑是否将它们

包括在镜像中。在开发环境中,通常不将程序复制到镜像中,而是存放在主机的目录中,

以绑定挂载方式挂载到容器中,这样便于程序的测试和修改。而在生产环境中,通常直接

将程序复制到镜像中进行发布,因为应用程序已经确定版本了。

7.目前主流的开源Java应用程序服务器有哪几种?

目前主流的开源Java应用程序服务器有Tomcat、Jetty、GlassFish和WildFly。

8.Maven工具有什么用?

Maven主要用于Java的项目构建、依赖管理和项目信息管理。它包含了一个项目对

象模型(POM)、一组标准集合、一个项目生命周期、一个依赖管理系统,以及用来运行定

义在生命周期阶段中的插件目标的逻辑。项目对象模型由文件描述,Maven依

据该文件实现项目管理。

9.Spring Boot框架有什么优势?Spring Boot应用程序可以采用哪几种启动方式?

Spring Boot框架具有以下优点。

(1)实现约定大于配置,是一个低配置的应用系统框架。

(2)提供内置的Tomcat或Jetty容器,不需要部署War。

(3)通过依赖的Jar包管理、自动装配技术,容易实现与其他技术体系和工具的集成。

(4)提供自动配置的“starter”项目对象模型以简化Maven配置。

(5)提供一些生产环境的特性。

Spring Boot应用程序可以采用以下4种启动方式。

(1)通过Java主类启动。

(2)通过Spring Boot的Maven插件或Gradle插件启动。

(3)生成为可执行的.jar或.war包启动。

(4)通过Servlet容器启动,如外部的Tomcat。

10.PHP应用程序容器化有哪些特点?

PHP应用程序以脚本的形式提供,无须编译,因而对其进行容器化的主要工作是通过

容器部署PHP应用程序的运行环境,并将PHP程序脚本集成到相应的镜像中,或者绑定

挂载到容器上的相应目录下。

PHP应用程序大多要用到数据库,最常用的是MySQL数据库,通常通过实现LAMP

平台的容器化来部署和运行PHP应用程序。

11.Python项目中的文件有什么用?

Python项目中文件用于记录所有的依赖包及其精确的版本,以便

在新的环境下进行部署。到其他环境中部署Python项目时,可以使用pip install命令依

据文件批量安装所依赖的包。

12.Python Web应用中uWSGI有什么用?

uWSGI是实现了uwsgi协议、WSGI规范和HTTP的一个软件工具。uWSGI通过

WSGI规范与Python Web服务进程通信,然后通过uwsgi协议与Nginx进行通信,最

终Nginx通过HTTP将服务对外发布。uWSGI作为Web服务器,支持HTTP,当然也支

持静态文件部署但不是很理想,一般选择Nginx处理静态文件。通常选择Nginx和uWSGI

相结合的部署方案,Nginx负责静态内容发布,uWSGI负责动态内容发布,二者配合共同

提供Web服务,以实现提高效率和负载均衡等目的。

项目七 自动化构建与持续集成

选择题

1、A

2、B

3、A

4、D

5、C

6、D

简答题

1.代码管理中项目创建的默认分支是什么?它有什么作用?

项目创建时的默认分支是master。它是代码主干,一般不用于开发,而是用于保留当

前线上发布的版本。

2.代码仓库是通过什么触发镜像仓库的自动功能的?

代码仓库使用Webhook触发新的构建以产生Docker镜像。Webhook是一种Web

回调或者HTTP的推送API,是向App或者其他应用程序提供实时信息的一种方式。

3.自动化构建镜像有哪些优点?

自动化构建具有以下优点。

(1)自动化构建的镜像完全符合期望。

(2)任何可以访问代码仓库的人都可以使用Dockerfile。

(3)代码修改之后镜像仓库会自动更新。

(4)可以充分利用第三方服务器资源,节省自己的计算资源和时间。

4.简述Git工具的主要用途。

Git工具的主要用途如下。

(1)从远程仓库复制完整的Git仓库到本地仓库。

(2)在本地根据不同的开发目的创建代码分支、修改代码。

(3)从本地仓库向远程仓库提交代码。

(4)代码分支合并与主干合并。

5.什么是持续集成?什么是持续部署?

持续集成是指开发应用程序时频繁地向主干提交代码,新提交的代码在最终合并到主

干前,需要经过编译和自动化测试工作流进行验证。持续集成的目标是让产品可以快速迭

代,同时还能保持高质量。

持续部署是指通过自动化的构建、测试和部署循环来快速交付高质量的软件产品。它

要实现的目标是代码在任何时刻都是可部署的,可以进入生产阶段。

6.简述Drone持续集成和持续部署的基本流程。

Drone持续集成和持续部署的基本流程如下。

(1)开发人员使用Git工具提交源代码到代码管理系统。

(2)源代码码管理系统通过设置的Webhook触发Drone的流水线。

(3)Drone执行工作流定义的任务,完成项目的测试、构建和部署等。

7.Drone插件有什么作用?

Drone插件是工作流中用于封装命令、可以共享和重用的容器,可以用来构建、发布

项目,发送通知等。

8.Drone中服务器与代理各自职责是什么?

Drone本身采用服务器与代理相结合的架构,服务器监控代理组件的状态,并收集和

展示CI/CD结果,代理具体执行.文件中所定义的CI/CD指令。当然,Drone

服务器同样也可以执行CI/CD指令所定义的任务。

9.为什么drone-agent服务需要绑定挂载/var/run/文件?

/var/run/是一个Docker客户端和Docker守护进程在本地进行通信的

UNIX Socket文件,可以让一个进程通过与处理文件类似的方式和另一个进程通信,即进

程间通信。当在主机上安装并且启动Docker时,Docker守护进程会侦听该Socket文件,

当一个连接请求到来时,它会使用标准I/O读写数据。容器绑定挂载/var/run/

文件之后,就可以在容器中与Docker守护进程通信,执行各种管理操作,这样的容器权

限会非常高,能够管理Docker主机上的容器。drone-agent服务作为容器运行,它本身

还要运行容器(每个工作流步骤就是一个容器),需要拥有管理容器的能力,也就需要绑定

挂载/var/run/文件。

项目八 Docker集群配置与应用

选择题

1、A

2、C

3、C

4、D

5、B

6、D

7、D

8、C

简答题

1.什么是Swarm集群?

Swarm本意是蜂群,Docker使用这个概念表示由多个Docker引擎组成的一个整体,

也就是集群。一个Swarm集群包括多个以Swarm模式运行的Docker主机,它们充当管

理器,负责管理成员和代理;或者充当工作者,负责运行Swarm服务。Swarm集群管理

的对象主要是服务,而不是独立的容器。

2.什么是Swarm节点?节点按角色分为哪几种类型?

Swarm集群集群由一个或多个节点组成。这些节点可以是运行Docker引擎的物理机

或虚拟机。节点按角色分为管理器节点和工作者节点两种类型。

3.什么是Swarm服务?什么是Swarm任务?

Swarm服务用于定义要在节点上执行的任务,是整个集群系统的核心结构,也是用户

与Swarm集群交互的基本单元。用户在创建服务时可以指定要使用的容器镜像和要在容

器中执行的命令。Swarm服务相对于独立容器的一个关键优势是,无须重启服务就可以修

改服务的配置,如要连接的网络和卷。

Swarm任务用于定义容器和要在容器中运行的命令。它是Swarm集群的原子调度单

位。管理器节点根据服务规模中设置的副本数量将任务分配给工作者节点。一旦任务被分

配给某个节点,就不能转移到另一个节点,只能在所分配的节点上正常运行或运行失败。

4.简述服务、任务与容器之间的关系。

将服务部署到Swarm集群时,Swarm管理器将服务定义作为服务的期望状态,然后

将该服务作为一个任务或多个任务副本在节点上进行调度。这些任务在集群的节点上彼此

独立运行。

采用Swarm模式,每个任务只调用一个容器。任务类似于调度程序放置容器的“插

槽”。一旦容器处于活动状态,调度程序就会识别出该任务处于运行状态。如果容器未通过

健康检查或终止,则任务也将终止。

在Swarm模式下,Swarm管理器会监控服务、任务的健康状态,如果容器进入不健

康状态,它会停止容器并且重新启动一个新容器来取代它。

5.按顺序列出Swarm模式中调度要执行的工作任务。

在Swarm模式中,按照以下顺序调度要执行的工作任务。

(1)通过docker service create命令创建一个服务。

(2)请求到达管理器节点。

(3)管理器节点将该服务安排在特定的节点上运行。

(4)每个服务可以启动多个任务。

(5)每个任务都有一个生命周期,都要经历像新建、挂起和完成这样的状态。任务是

一次性运行的执行单元。当任务终止时,就不再被执行,但是一个新的任务会取代它。

6.排空节点具有什么特点?有什么用途?

调度器不能够将任务安排给排空节点,节点处于排空状态会停止其中已存在的任务,

并将这些任务分配到其他活动状态的节点中。

排空节点可用来阻止调度器将任务放置到某个节点,最典型的就是管理器。节点计划

维护时,也可将其排空。

7.建立Swarm集群默认会创建哪两个网络?

在Docker主机上初始化Swarm集群,或者将一个Docker主机加入一个现有的

Swarm集群,默认会自动在该Docker主机上创建两个网络。一个是ingress网络,其驱

动为overlay,作用域为Swarm集群,用于处理与Swarm服务相关的控制流量和数据流

量。另一个是docker_gwbridge网络,其驱动为bridge,作用域为本地,用于将ingress

网络连接到Docker主机的网络接口,使流量可以在Swarm管理器节点和工作者节点之

间直接传输。

8.简述Swarm的服务发现工作机制。

Docker利用内置的DNS服务为Swarm模式下的服务任务提供服务发现功能。Swarm

模式下会为每个节点的Docker引擎内置一个DNS服务器,各个节点间的DNS服务通过

Gossip协议互相交换信息来实现容器之间的服务发现。每一个容器都有一个域名解析器,

可以将域名查询请求转发到Docker引擎上的DNS服务中。Docker引擎收到请求后,就

会在发出请求的容器所在的网络中检查域名对应的是容器还是服务,然后从存储的键值库

中查找对应的IP地址,并把这个IP地址返回给发起请求的域名解析器。Docker服务发现

的作用范围是网络级别,也就意味着同一个网络上的容器或服务任务才能利用内置DNS服

务实现相互发现。

9.Swarm路由网有什么用?

Swarm路由网用来将内部服务暴露到非容器网络中,并通过发布服务端口对外提供访

问。

10.Swarm如何实现负载平衡?

Swarm使用ingress负载平衡器暴露要提供给Swarm集群外部用户的服务。外部用

户可以访问集群中任何节点的发布端口上的服务,Swarm集群的所有节点会将所有传入请

求路由到正在运行的任务实例中。ingress网络是一个特殊的overlay网络,有助于服务的

节点直接进行负载平衡。当Swarm的任何节点在已发布的端口上接收到请求时,它将该

请求转发给调用的IP虚拟服务模块,由该模块跟踪参与该服务的所有容器的IP地址,从

中选择一个,并通过ingress网络将请求路由给它。Swarm模式拥有一个内部DNS组件,

它自动为集群中的每个服务分配一个DNS条目。Swarm管理器根据服务的DNS名称,

使用内部负载平衡器在集群内的服务之间分配请求。

11.什么是Swarm栈?其主要用途是什么?

Swarm栈是一组相互关联的服务和基础设施,包括服务、网络、卷、密钥等Docker

资源。

栈可以对这些资源进行统一的部署和管理,其中的服务可以共享依赖关系,并且可以

进行编排和伸缩。栈将应用程序所包含的服务、依赖的密码、卷等资源,以及它们之间的

关系定义在一个YAML文件中。使用栈部署方式可以完成Docker集群环境下的多服务的

统一编排。

栈位于Docker应用层级的最顶端,基于服务进行构建,而服务又基于容器运行。单

个栈就能够定义和编排整个应用程序,只有非常复杂的应用程序才需要使用多个栈。

12.简述Docker栈和Docker Compose之间的区别。

Docker Compose可以构建镜像,更适用于开发场景和多服务的单机部署。Docker

栈不支持构建指令,无法构建新的镜像,要求镜像已构建并发布到镜像注册中心,更适合

生产环境和多服务的集群部署。

Docker Compose支持3.0版本以下的Compose文件格式,而Docker栈要求

Compose文件格式的版本不低于3.0。

Docker Compose是一个独立的工具,需要安装,而Docker栈作为Swarm模式的

一部分,无须安装。

13.简述使用Docker栈部署和管理应用程序的基本流程。

(1)准备应用程序镜像。

(2)将镜像推送到Docker注册中心。

(3)编写栈文件,然后使用docker stack deploy命令一键部署。

(4)对于已部署应用程序的更新,应当通过修改栈文件,再用docker stack deploy

命令一键更新。