docker极简入门

·  阅读 1108
docker极简入门

作者:小只

原文:docker极简入门

一、docker简介

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,
然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口。
复制代码
复制代码

从上面的描述可以看出,Docker并非是容器,而是管理容器的引擎

Docker 官网还写着这样一句话:

Build and Ship any Application Anywhere
复制代码
复制代码

总结一下就是:一次构建,到处运行。只需要一次构建,就可以在任何地方运行,这大大简化了应用分发、部署、升级等流程。Docker是应用打包、部署的平台,而非单纯的虚拟化技术。

接下来,我们就来看看docker的架构以及它的工作原理:

二、docker架构及工作原理

Docker 是一个客户端-服务器(C/S)架构程序。
Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。
Docker 提供了一个命令行工具 Docker 以及一整套 RESTful API。
复制代码
复制代码

如下图所示,docker在运行时分为Docker daemon(docker守护进程) 和 客户端工具,我们日常使用的各种 docker 命令,其实就是 客户端工具 与 Docker daemon 在进行交互。

image.png

1. Client 客户端

Docker用户主要通过客户端与docker交互,比如当运行“docker run”命令时,docker客户端接收到后,将其转交给守护进程daemon执行。
Docker Client可以通过以下三种方式和Docker Daemon建立通信:tcp://host:port,unix://path_to_socket和fd://socketfd。
由Docker Daemon接受并处理请求,当Docker Client接收到返回的请求作出相应简单处理后,Docker Client一次完整的生命周期就结束了。(一次完整的请求:发送请求→处理请求→返回结果)。

2. Docker daemon

守护进程daemon主要用于监听Docker API请求和管理Docker的对象,比如:镜像,容器,网络,和数据卷等,一个daemon也可以和其他daemon进行通信,以便于管理Docker服务。

3. Container 容器

容器是镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。删除容器后,对其状态的任何未存储在持久存储中的更改都将消失

可写的容器
当容器启动时,一个新的可写层被加载到镜像的顶部。这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。

image.png
所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像层都是只读的。
镜像层数量可能会很多,所有镜像层会联合在一起组成一个统一的文件系统。如果不同层中有一个相同路径的文件,比如 /a,上层的 /a 会覆盖下层的 /a,也就是说用户只能访问到上层中的文件 /a。在容器层中,用户看到的是一个叠加之后的文件系统。
总结下来就是:容器层记录对镜像的修改,所有镜像层都是只读的,不会被容器修改,所以镜像可以被多个容器共享。

4. Images 镜像

Docker 镜像就是一个只读的模板,镜像可以用来创建 Docker 容器
在实际开发中,我们通常会使用dockerfile文件来生成镜像,dockerfile中的一条指令对应镜像中的一个层,当你改变你的dockerfile文件或者重构dockerfile文件的时候,只有改变的才会重建,这也是为什么和其他虚拟化技术相比,docker镜像如此轻量,小巧和快速的原因之一。

镜像分层
docker 支持通过扩展现有镜像,创建新的镜像。实际上,docker Hub 中 99% 的镜像都是通过在 base 镜像中安装和配置需要的软件构建出来的。

image.png
从上图可以看到,新镜像是从 base 镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。
镜像分层最大的一个好处就是共享资源。比如说有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是不会被修改的,修改只会被限制在单个容器内。这就是容器 Copy-on-Write 特性。

5. Registry 仓库

仓库是集中存放镜像文件的场所,仓库注册服务器(Registry)上往往存放着多个仓库,每个仓库中又包含了多个镜像,每个镜像有不同的标签(tag)。目前,最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。

6. Volume 数据卷

前边说到删除容器后,对其状态的任何未存储在持久存储中的更改都将消失。
数据卷就是来解决这个问题的,Volume可以将数据持久化到我们宿主机上,与容器间实现数据共享。
简单的说就是将宿主机的目录映射到容器中的目录,应用程序在容器中的目录读写数据会同步到宿主机上,这样容器产生的数据就可以持久化了,比如我们的数据库容器,就可以把数据存储到我们宿主机上的真实磁盘中。

三、容器 VS 虚拟机

提到容器就避免不了和传统的虚拟机技术进行对比,首先来看一下虚拟机和容器的架构图: image.png

1. 虚拟机

虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在实体计算机中能够完成的工作在虚拟机中都能够实现。在计算机中创建虚拟机时,需要将实体机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的CMOS、硬盘和操作系统,可以像使用实体机一样对虚拟机进行操作。
目前流行的虚拟机软件有VMware(VMWare ACE)、Virtual BoxVirtual PC,它们都能在Windows系统上虚拟出多个计算机。

虚拟机的优点

  • 利用最大化:可以把资源分配到不同的虚拟机,达到硬件资源的最大化利用
  • 易扩展:与直接在物理机上部署应用,虚拟机更容易扩展应用。
  • 云服务:通过虚拟机虚拟出不同的物理资源,可以快速搭建云服务。

虚拟机的缺点

  • 资源占用多:虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。
  • 冗余步骤多:虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。
  • 启动慢:启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。
2. 容器

容器是一个不依赖于操作系统,运行应用程序的环境。它是通过Linux的Namespaces和Cgroups技术对应用程序进程进行隔离和限制的。
Namespace的作用是隔离,它让应用进程只能看到该Namespace内的世界;
而Cgroups 的作用是限制分配给进程的宿主机资源。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的还是同一个宿主机的操作系统内核。

容器的优点

  • 部署方便:只需要提供镜像,就可以部署在很多地方。
  • 占用资源少:容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。
  • 版本控制:追踪、查询、记录版本信息(应用程序更改史)和回滚版本等。
  • 启动快:容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。
3. 容器还是虚拟机

容器和虚拟机各有优势和劣势,两者之间也不是对立的取代与被取代的关系,而更应该是互补合作的关系, 我们应当结合实际的使用场景选择不同的技术。比如,需要在linux系统中测试windows系统的兼容性,这个时候就要选择虚拟机,大部分的Web应用都适用于docker。

四、总结

docker是目前非常流行的技术,大部分的微服务、Web应用都适用docker,目前很多公司的应用也都已经docker化,用户不再需要去关心如何搭建环境、如何安装、如何解决不同发行版的库冲突,而且通常不会消耗更多的硬件资源,不会明显降低性能。


作者:小只
链接:juejin.cn/post/701889… 来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改