❤️ 专栏简介 :本专栏我们会从最基础的内容开始学习Docker的相关内容,循序渐进的掌握Docker知识并进行实战。

☀️ 专栏适用人群 :适用于具备基础 Linux 知识的 Docker 初学者,当然希望各位有经验的docker开发者不吝赐教。

🌙专栏特点:通俗易懂、图文并茂、非常详细;

🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。

🍄 专栏地址:

为什么有的容器可以vi有的不行 为什么要用容器_Docker

本节中我们会讨论为什么要使用容器技术,即容器的前世今生;主要的内容包括纯物理机的优缺点虚拟机的优缺点虚拟化技术以及从虚拟化技术到容器的过程;最后总结为什么要使用容器


文章目录

  • 一、 纯物理机
  • 二、 虚拟机
  • 三、 容器
  • 3.1 虚拟化技术
  • 3.2 从虚拟化到容器
  • 3.3 为什么要使用容器


一、 纯物理机

比如我们现在有一台物理机,也就是一台普通的电脑,它长这样子,

为什么有的容器可以vi有的不行 为什么要用容器_java_02


首先我们看一下物理机的构成:

为什么有的容器可以vi有的不行 为什么要用容器_学习_03

物理机首先是硬件,硬件上安装有具体的操作系统,比如windows、linux、macos等等,然后操作系统上安装有咱们常用的软件,比如qq、微信;或者linux上的nginx、mysql等等。物理机最大的优点就是稳定,但是缺点也是非常明显的:

纯物理服务器的缺点
1、部署非常慢;
2、成本非常高
3、资源浪费
4、难以迁移和扩展
5、会被限制硬件厂商

二、 虚拟机

基于物理机的这些缺点,虚拟化技术应运而生;一台物理机可以通过vmware虚拟化安装多个操作系统,每个操作系统都可以运行单独的app;因此一个物理机和安装部署多个app。虚拟机的部署结构如下图所示:

为什么有的容器可以vi有的不行 为什么要用容器_为什么有的容器可以vi有的不行_04

虚拟机的优点就正是填补了物理机的缺点,比如虚拟机部署比较迅速,成本低,充分利用了资源,方便迁移和扩展等;
但是虚拟机也有一定的局限性,比如每一个虚拟机都是一个完整的操作系统,要分配并占用物理机系统资源;当虚拟机多到一定程度时,比如我们物理机只有8G内存,200G的硬盘存储,当我们开了10个虚拟机,每个虚拟机给1G内存,20G固态,那么物理机本身的资源也就被消耗殆尽了。

三、 容器

上面两节我们学习了纯物理机和虚拟机技术,也了解了他们各自的优缺点;为了解决物理机和虚拟机的各种缺点,容器技术出现了。想要学习容器,“虚拟化技术”是必不可少的基础;那么什么是虚拟化技术呢?

3.1 虚拟化技术

首先附上百度百科对计算机虚拟化技术的定义:

虚拟化是一个广义的术语,在计算机方面通常是指计算元件在虚拟的基础上而不是真实的基础上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。CPU的虚拟化技术可以单CPU模拟多CPU 并行,允许一个平台同时运行多个操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率

虚拟技术是一种将现有的计算机资源(CPU、内存、磁盘空间等)进行组合或分区,使得这些资源表现为一个或多个操作环境,从而提供优于原有资源配置的访问方式的技术。虚拟化就是把物理资源转变为逻辑上可以管理的资源,以打破物理结构之间的壁垒。

借助虚拟化技术,作为用户的我们,能借助单个物理硬件系统,从而创建多个模拟环境或专用资源。虚拟机监控程序可直接连接到硬件,从而将一个系统划分为不同的、单独安全环境,即虚拟机(VM)。

虚拟化技术的应用

虚拟化技术的一个例子就是云计算,云计算依赖的载体就是云服务器,比如我们之前购买过的腾讯云服务器、阿里云服务器、华为云服务器等。什么是云计算呢?云计算就是将服务器锁涉及到的计算的工作,放在云上去执行,这个“云”,就是指云服务器;比如说我们现在写好了一堆代码,我们需要用到数据库,但是数据库我又不想自己去计算,那我就可以去各大云计算厂商公司去购买别人的数据库服务,例如去阿里云购买RDS数据库服务,这样就不需要我自己搭建数据库;在阿里云上就可以做数据库高可用,实现对数据的增删改查等,这些计算工作都是用的云上的数据库。这就是一个云计算应用场景的例子。
那试想一下,我们为什么能用到腾讯云的云服务器呢?那肯定是腾讯云使用了虚拟化技术;可以参考一下1.2节中的虚拟机的图,首先腾讯买了一些物理机器,然后通过虚拟化手段虚拟出大量的虚拟的机器;所以我们购买的腾讯云服务器,其实就是他们虚拟出来的虚拟机。比如我们自己在笔记本上安装虚拟机的时候,是不是要分配一定的资源,比如2g内存,20G存储等;我们购买云服务器的时候也会让我们选择购买的配置(内存+存储等),配置越高价格就越高,所以其实云服务器跟我们自己的虚拟机是一样的道理;所以云计算、云服务器的基础,就是虚拟化技术

说起虚拟化技术,我们最熟知的就是VMware workstation(属于个人学习使用的虚拟工具);vmware无论是在Windows、linux还是macOS上,都能彰显它的强大。

3.2 从虚拟化到容器

vmware虽然厉害,但是在Linux系统下,最强大的虚拟技术还是KVM(for Kernel-based Virtual Machine),即基于内核的虚拟机。与VMware作为第三方软件安装在各种不同的操作系统上所不同的是,KVM已经集成在了Linux内核之中,因此只能在Linux下使用。

KVM实现虚拟化的结构图如下:

为什么有的容器可以vi有的不行 为什么要用容器_为什么有的容器可以vi有的不行_05

了解了以上这些知识,下面,我们可以开始讲到我们的Docker了。

前面讲到的,无论是VMware,还是KVM,他们的最终结果都是虚拟出了一台完整的计算机系统,其拥有底层的物理硬件、操作系统和应用程序执行的完整环境,都对硬件资源造成了一定的消耗,而且感觉这套系统非常沉重。

有没有这么一种可能,就是我们其实并不是需要完整的操作系统,而只是需要运行使用某一个软件呢?比如说,我可能不是为了得到一个完整的系统,而仅仅想使用多个应用程序,并且希望它们之间互相独立,互不影响。

举个例子,比如我现在有两个进程,进程1需要5.7版本的mysql数据库,而进程2需要5.8版本的数据库,而且我仅仅是需要数据库这个软件,其他的我不需要;很显然,一个centos系统上是不能既安装5.7的mysql又安装5.8的mysql,如果强行安装,只能是5.8版本的mysql覆盖掉5.7版本的mysql;如果使用虚拟机,如下图所示:那么我就要安装两个完整的CentOS系统,一个装5.7的mysql,另一个装5.8的mysql;这就是我前面提到的,为了使用一个软件,而安装了一整个系统,并且在每个系统里,我只用mysql,别的软件都用不到,这样是不是既繁琐又浪费呢?为了一个软件而虚拟出两个完整的系统,实在是太繁重了!!!

为什么有的容器可以vi有的不行 为什么要用容器_docker_06

但是,我们用docker就能完美的解决这个问题,利用Docker容器,我们可以同时虚拟出两个环境(注意,是环境,不是系统),这样就能充分的利用宿主机的资源,利用Docker来实现上面的例子,如下图所示,我们宿主机上只需要安装一个CentOS系统即可,然后虚拟出两个Docker容器分别存放Mysql 5.7和Mysql 5.8即可,每一个容器相互独立,互不影响;这样是不是就轻便了很多,不只我们高兴,我们的宿主机也高兴,再也不用费力的去支撑三个系统了(一个宿主机+两个虚拟机环境),岂不是美滋滋。

为什么有的容器可以vi有的不行 为什么要用容器_docker_07

3.3 为什么要使用容器

首先我们还是要总结一下虚拟机技术和容器技术的差异,用 两张图来概括吧:

传统虚拟机技术:

为什么有的容器可以vi有的不行 为什么要用容器_java_08


容器技术:

为什么有的容器可以vi有的不行 为什么要用容器_为什么有的容器可以vi有的不行_09

通过图中我们可以看出来,容器内的程序,就好比直接运行在宿主机上,能够使用宿主机最大的硬件资源,但是各个容器之间又是相互隔离的,互不影响

所以为什么要使用容器呢,当然是因为容器相比于虚拟机有诸多的优点。通过前面的例子我们已经大致了解了容器的前世今生,所以下面我们总结一下Docker的优点:

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

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

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

4、持续交付和部署
对开发和运维(DevOps (opens new window))人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

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

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

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

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

至于容器具体的实现过程,那就是接下来我们要学习的docker知识了。