[1] 外行人都能看的懂的Docker简介

在这里插入图片描述
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。

1. Docker解决了什么问题?

在软件开发中,环境配置往往是比较麻烦的。同一套代码,要想在其他机器上运行,往往需要安装并配置程序运行所需的各种依赖,稍有不慎,安装错了版本还可能不兼容,导致各种各样的问题。

以运行一个常规的Java web程序为例,目标机器必须安装JDK、Tomcat、MySQL,并配置相应的环境变量。同时版本还需要对应上,比如Java代码中用到了lambda表达式,则安装JDK版本如果小于8则肯定不能让项目跑起来,安装的JDK版本高了,也有可能导致各种不兼容。整个过程麻烦不说,还有可能跑不起来。

开发人员常听到的一句话是“你的程序有问题,跑不起来”,而你这时的第一反应就是“(胡说,默念)是你的环境有问题,在我电脑上可以跑!” 。所以,遇到这种情况,千万不要对其他开发说“你的代码有问题” ,而是说“我的运行环境可能跟你的运行环境不一样,导致你的代码在我电脑上运行不了” 。这样的话对方的第一反应则是“我的代码运行需要依赖xxx,你看看是不是没安装或者没配置对啊,扒拉扒拉”。

既然代码能打包运行,那环境可不可以打包呢?能打包的话,岂不是不需要重复配置运行环境了,也从根本上避免了因为环境问题导致代码运行不了的问题。Docker的出现,便是为了解决这个问题。开发人员可以将代码的运行环境通过Docker进行打包,然后完整的把环境及代码搬到其他机器上去跑。

2. 虚拟机?

上面说的Docker能干的事,虚拟机也可以干啊?为什么还用Docker,Docker的优势在哪里?
先贴上虚拟机的概念:

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

流行的虚拟机软件有VMware(VMWare ACE)、Virtual Box和Virtual PC,它们都能在系统上虚拟出多个计算机。用过虚拟机的小伙伴肯定知道,开一个虚拟机将会占用大量系统资源,8G运存的电脑分分钟占用率超90%。由此可见,虚拟机对资源的占用是多么的巨大。

虚拟机有以下显而易见的缺点:

  • 启动慢,毕竟要启动一个完整的操作系统,并且很多硬件功能还是软件模拟的。
  • 资源占用多,至少几百兆的内存才能使虚拟机运行,且非常占用cpu和硬盘资源。
  • 冗余,一些系统级的操作无法跳过,比如登陆。

由此可见,想要用虚拟机把一整套代码运行环境进行打包的代价太大了。比如我想要为一个10M大小的Java程序打包运行环境,那就必须把几百M甚至几G的操作系统包含进来,且在程序运行时所占用的资源远远高于原来的程序所占用的资源。

3.容器技术

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。因 此,容器虚拟化也被称为“操作系统级虚拟化”,容器技术可以将软件需要的环境配置都打包到一个隔离的容器中。 让多个独立的容器高效且轻量的运行在同一台宿主机上。而Docker就是为了实现这一切而生的。

3.1 容器和虚拟机比较

启动一个容器相当于启动一个进程,而启动一个虚拟机相当于启动一套运行在虚拟硬件上的操作系统。
在这里插入图片描述

3.2 Docker

Docker 属于 Linux 容器的一种封装,提供简单易用的容器使用接口。它是目前最流行的 Linux 容器解决方案。

Docker 将应用程序与该程序的依赖,打包在一个文件里面。运行这个文件,就会生成一个虚拟容器。程序在这个虚拟容器里运行,就好像在真实的物理机上运行一样。有了 Docker,就不用担心环境问题。

总体来说,Docker 的接口相当简单,用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

4. Docker架构

Docker的运行架构是C/S架构,即客户端-服务器架构,Docker容器运行在服务器端,docker xxx命令运行在客户端。Docker提供了一个命令行工具和一整套RESTful API,两者可以运行在同一台主机上,也可以运行在不同主机上。即本地Docker客户端可以连接本地的Docker服务器,也可以远程连接其他主机的Docker服务器。

Docker客户端职责:

  • 接收用户输入
  • 根据用户输入向服务器发送请求
  • 回显服务器的返回结果

Docker服务器职责:

  • 接收客户端请求
  • 根据接收到的请求处理
  • 返回结果

Docker简化版架构如下图所示:
在这里插入图片描述

5.Docker中的几个概念

想必大家在看Docker相关介绍时都不能跳出容器、仓库、镜像这三个关键词。下面就来介绍一下这三个关键词。

5.1 镜像(Image)

镜像是一个静态保存在磁盘里的文件。前面我们说的将程序运行环境打包,即把所有依赖打包成一个镜像。可以把镜像看作一个已经编译好但未运行的程序。

5.2 容器(Container)

容器(Container)是基于镜像创建的运行实例,一个容器中可以运行一个或多个应用程序。镜像与容器的关系可以类比为Java中的类和对象的关系。一个镜像可以创建出多个实例。容器本质上也是存储在磁盘上的一个文件,称为容器文件,容器的停止并不会导致容器文件的删除。

通过一个镜像创建出一个容器,则会存在两个文件,一个是镜像文件,一个是容器文件。

可以把一个容器看作:一个精简版的Linux系统 + 多个运行在该系统上的应用程序

5.3 仓库(repository)

仓库,即集中存放镜像(Image)文件的仓库。

仓库又分为公有仓库、私有仓库两种。

  • Docker公司提供的仓库叫做Docker Hub,用户可以在上面下载或分享镜像。
  • 阿里云、网易云在国内有提供公有的仓库,相比于Docker Hub访问速度更快。

当用户创建好了自己的镜像后,可以把镜像保存到远程公有或私有仓库。这样,在其他机器上就可以通过docker pull命令拿到镜像了。

6. Docker安装

Docker的安装,可以参考其他文章,在这里就不详细的写了,在这里直接推荐一个教程。需要注意的是,安装完后需要配置镜像加速,否则从仓库pull镜像这一过程将巨慢,本人推荐使用阿里云镜像加速。

安装完之后,可以通过docker info命令查看是否安装成功。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章