我个人学习一个新的东西的时候,总喜欢从几个方面入手:
```
1、是什么
2、有什么
3、能干什么
```
本篇文章,主要从这几个方面,描述一下Docker的基本概念
# Docker是什么
Docker是基于容器技术的轻量级虚拟化,是一个能够把开发的应用程序自动部署到容器的开源引擎。
Docker借鉴集装箱的概念,只不过集装箱用来运输货物,Docker运输软件,Docker并不关心:装的内容是什么、也不关心要运到何处
所以其实描述Docker,主要要理解两个概念:
```
容器:容器是啥? 就是个装东西的篮子,至于这个篮子装的是鸡蛋,还是冬瓜它不关心,它要关心的内容是如何更好的装东西
```
```
虚拟化:通过某种技术将一台计算机虚拟为多台逻辑计算机
```
---
那么Docker其实总结下来就是一句话: 一个在物理机器的基础上开辟出来的一种"篮子",至于用它来装什么,怎么装不关心,它只关心如何更好的装东西
比如我们有个Java项目, 我们需要安装JDK、Tomcat和一个APP, 那么我们可以用这个"篮子"把他们三个装起来,只要在任何一台能识别Docker的机器上,我们都能运行这个APP, 就是这个道理
# Docker有什么
1:Docker客户端和服务端
客户端用来通过Docker守护进程,去访问Docker容器,Docker容器运行在Docker主机上,也就是服务器上
2:Docker镜像
镜像相当于容器的“源代码”,镜像类似于类,而容器类似于实例;镜像类似于Maven仓库管理的jar
3:Registry
类似于Maven仓库,Docker公司提供的官方registry被称为Docker Hub
4:Docker 容器
容器是镜像的运行时实例,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境。容器为镜像提供了一个标准的和隔离的运行环境
# Docker能干什么
1:加速本地开发和构建流程,使其更加高效、更加轻量化
2:能让独立服务或应用程序在不同的环境中,得到相同的运行结果
3:用Docker创建隔离的环境来测试
4:Docker可以在开发者本机上构建复杂的环境,用来进行测试
5:构建一个多用户的平台即服务(PaaS)的基础设施
6:为开发、测试提供一个轻量级的独立沙盒环境
7:提供软件即服务(SaaS)应用程序
8:支持高性能、超大规模的宿主机部署
# Docker技术组件
1:文件系统隔离:每个容器都有自己的root系统
2:进程隔离:每个容器都运行在自己的进程环境中
3:网络隔离:容器间的虚拟网络接口和IP地址都是分开的
4:资源隔离和分组:使用cgroups,将cpu和内存之类的资源独立分配给每个docker容器
5:写时复制:文件系统都是通过写时复制创建的,这意味着文件系统是分层的、快速的,且
占用磁盘空间更小
6:日志:容器会收集日志流并计入日志,用来进行日志分析和故障排查
7:交互式shell:用户可以通过终端,使用交互式shell来与docker服务器交互
# Docker和传统虚拟机技术的不同 【面试点哦!~~】
1:虚拟机是利用硬件虚拟化技术,来实现对硬件资源进行划分,同时通过一个hypervisor来实现对资源的完全隔离;容器上操作系统级别的虚拟化,利用的时候内核的cgroup和namespace特性,完全通过软件实现。
2:虚拟机会独占分配给自己的资源,各个虚拟机之间基本完全隔离,不存在资源共享,比较重量级;容器与主机共享操作系统内核,不同容器之间可以共享部分系统资源,因此相对更轻量级。
3:在一台物理机上能启动的虚拟机很有限,而且启动通常都在十几秒以上;我们可以在一台服务器上启动成百上千Docker容器,启动时间通常在秒级
![](http://114.67.95.79/wp-content/uploads/2019/04/9693890e04f6c0f72fa83cda9a61c28f.png)
# Docker中基本概念
镜像(Image)
镜像,从认识上简单的来说,就是面向对象中的类,相当于一个模板。从本质上来说,镜像相当于一个文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
容器(Container)
容器,从认识上来说,就是类创建的实例,就是依据镜像这个模板创建出来的实体。容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。
仓库(Repository)
仓库,从认识上来说,就好像软件包上传下载站,有各种软件的不同版本被上传供用户下载。镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。