Docker --- 初识Docker

1.Docker基本介绍

1.1 Docker是什么

Docker是一个用于开发、交付和运行应用程序的开放平台。Docker使您能够将应用程序与基础架构分离,可以快速交付软件。借助Docker,可以像管理应用程序一样来管理基础设施。通过利用Docker快速发布、测试和部署代码,您可以显著减少编写代码和在生产环境中运行代码之间的延迟。

1.2 Docker可以做什么

  • Web 应用的自动化打包和发布。
  • 自动化测试和持续集成、发布。
  • 在服务型环境中部署和调整数据库或其他的后台应用。
  • 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

1.3 为什么选择Docker

1.快速,一致地交付您的应用程序
Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。
容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:

  • 您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。
  • 使用 Docker 将应用程序推送到测试环境中,并执行自动或手动测试。
  • 当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将程序重新部署到测试环境中,以进行测试和验证。
  • 测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。

2.响应式部署和扩展
Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。
Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。

3.在同一硬件上运行更多工作负载
Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。

2. Docker的架构

Docker使用客户端-服务器(C/S)架构。Docker客户端与Docker守护进程通信,后者负责构建、运行和分发Docker容器。Docker客户端和守护进程可以在同一个系统上运行,也可以将Docker客户端连接到远程Docker守护进程。Docker客户端和守护进程使用一个REST API,通过UNIX套接字或网络接口进行通信。
Docker --- 初识Docker_第1张图片

2.1 Docker的三大对象

在使用Docker时,有几个对象是我们经常听到且使用的,比如我们将应用程序制作的镜像、运行镜像的容器、存放镜像的仓库,以及使用镜像过程中用到的网络、卷、插件等其他对象。下面就重点介绍一下这些主要概念。

2.1.1 镜像

镜像是为了创建Docker容器指令的一个只读模板。通常,一个镜像是基于另一个镜像,并带有一些额外的自定义项。例如,你可以构建一个基于ubuntu镜像为基础的镜像,除了安装Apache web服务器和你的应用程序,还需要配置应用程序运行时所需的详细配置信息。
我们可以创建自己的镜像,也可以使用其他人已注册且发布的镜像。要构建属于自己的镜像,需要创建一个Dockerfile,其中定义了创建新镜像及运行所需要的由简单语法组成的指令步骤。Dockerfile中的每条指令都会在图像中创建一个层。更改Dockerfile并重新生成镜像时,仅重新生成已更改的层。与其他虚拟化技术相比,这是使镜像如此轻量级、小型和快速的原因之一。

2.1.2 容器

容器是镜像可运行的实例。你可以通过Docker API或CLI创建、启动、停止、移动、删除容器。可以将容器连接到一个或多个网络,可以附加存储,甚至基于当前的状态创建一个新的镜像。
默认情况,容器与其他容器及他的主机有很好的隔离性。你可以控制容器的网络、存储或其他底层子系统与其他容器、主机的隔离程度。
当容器被移除时,对其状态的任何未存储在持久性存储中的更改都会消失。

2.1.3 镜像仓库

仓库可看着一个代码控制中心,用来保存镜像。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。

2.1.4 镜像与容器

容器与镜像的关系类似于面向对象编程中的对象与类。
从根本上说,容器不过是一个正在运行的进程,它应用了一些附加的封装特性,以便将它与主机和其他容器隔离开来。容器隔离的一个最重要的方面是,每个容器都与自己的私有文件系统交互;这个文件系统由Docker镜像提供。镜像包含运行应用程序所需的所有内容—代码或二进制文件、运行时、依赖项以及所需的任何其他文件系统对象。
Docker --- 初识Docker_第2张图片

2.1.5 容器与虚拟机

容器在本地的Linux上,与其他容器共享主机内核。它运行一个独立的进程,占用的内存不比其他其他可执行文件多,因此它很轻量。
相比之下,虚拟机(VM)运行一个完整“访客”权限的操作系统,通过管理程序对主机资源进行虚拟访问。一般来说,vm除了应用程序逻辑所消耗的开销之外,还会产生很多开销。可通过官网中的一张图来理解容器与虚机的不同。
Docker --- 初识Docker_第3张图片

2.2 Docker底层技术

Docker是用Go编写的,它利用了Linux内核的一些特性来提供它的功能。

2.2.1 Namespaces

Docker使用Namespaces技术来提供容器的独立工作区。运行容器时,Docker会为该容器创建一组命名空间,提供容器的独立工作区。运行容器时,Docker会为该容器创建一组命名空间。
这些名称空间提供了一个隔离层。容器的每个方面都运行在不同的命名空间中,其访问权限仅限于该命名空间。
Docker Engine在Linux上使用如下名称空间:
pid名称空间:进程隔离(pid:Process ID)。
net名称空间:管理网络接口(net:Networking)。
ipc命名空间:管理对ipc资源的访问(ipc:进程间通信)。
mnt名称空间:管理文件系统挂载点(mnt:mount)。
uts命名空间:隔离内核和版本标识符。(UTS:Unix分时系统)。

2.2.2 Control groups

Linux上的Docker引擎还依赖于另一种称为控制组(cgroup)的技术。cgroup将应用程序限制为特定的资源集。控制组允许Docker引擎将可用的硬件资源共享给容器,并可以选择强制限制和约束。例如,可以限制特定容器的可用内存。

3 Docker在测试中的应用

当下越来越多的测试岗位要求测试人员了解或掌握Docker技术,那么为什么测试工作对Docker的使用越来越广泛呢?我们先来看看是不是经常遇到这些问题:测试的项目及版本很多;测试服务器资源缺乏;应用部署过程容易出现问题,且由于环境引发的问题测试人员不易定位,消耗时间多等等情况。
基于这些问题Docker可以帮助我们有效解决,可体现在以下几方面:
1.管理测试环境:
新的应用部署完成,可以方便的回退或恢复到指定版本。
易于对不同版本、不同测试环境的应用部署
环境配置统一,减少了开发、测试、生产环境运行结果不一致的问题
2.提高执行效率
方便对老版本出现BUG的复现及排查定位,缩短卸载、重新搭建环境的时间。
多人共同测试相同模块,可以搭建独立的测试环境,互不影响。
3.实现CI/CD
Docker在CI/CD的使用上可以更好的实现自动化多次部署。
不适合Docker环境的测试任务
注意与内核强相关的测试任务不适合通过Docker实现,如内核网络模块测试,内核namespace特性的测试。

参考:
1.https://docs.docker.com/
2.https://www.runoob.com/docker/docker-architecture.html

你可能感兴趣的:(云知识,Docker)