Docker入门(1):概述
1.摘要
在这篇文章中,我将介绍一下为什么需要虚拟化的环境。
然后我将介绍耳熟能详的虚拟化技术:虚拟机,并大致的介绍一下虚拟机的原理,希望能够让你知道虚拟机的优劣。
在之后,针对虚拟机存在的问题,引出Docker是怎么提高性能的。
最后,我将简单的介绍一下Docker中比较重要的三个概念,镜像、容器、和仓库。
2.介绍
在学习Docker之前,我们需要知道Docker可以干什么,有哪些优点。
直接看看官方文档的介绍:
Developing apps today requires so much more than writing code. Multiple languages, frameworks, architectures, and discontinuous interfaces between tools for each lifecycle stage creates enormous complexity. Docker simplifies and accelerates your workflow, while giving developers the freedom to innovate with their choice of tools, application stacks, and deployment environments for each project.
现在写个项目,装个环境都可能需要很长的一段时间。如果你需要在新的机器上部署项目,尤其是当你需要在很多台机器上部署项目的时候,会显得更加的麻烦。
不仅如此,在装好了环境之后,也有可能因为你和同事之间的某些依赖版本不一致,导致可能会发生”刚刚在我电脑上还能用“的问题。
而使用Docker的话,就不需要担心环境方面的问题了,使用Docker可以构建一个一致的环境,并且可以”一次构建,多次使用“。也就是说,在你配置好一次环境之后,你可以将你构建的这个环境用在各种不同的地方。
Docker是一个虚拟环境容器,可以将你的开发环境、代码、配置文件等一并打包到这个容器中,并发布和应用到任意平台中。在这里你可能会觉得”容器“这个词比较难理解,那么你可以暂时的理解为这是一个虚拟机。
为了实现我们上面说的”一次构建,多次使用“,我们只需要把那些环境都安装在这个虚拟机里面,然后把这个虚拟机拷贝很多份,就能在不同的地方使用了。
3.虚拟机
但是上面那么说其实是不太严谨的,或者说是不对的。
但是我认为在学习一个新的东西之前,如果能够跟一个旧的事物作对比,其实是对我们的学习特别有帮助的。
思考一下Docker与虚拟机有哪些异同。
相同点:
- 可以启动一个系统镜像
- 各个”系统“之间是相互隔离的,包括网络,文件等
- 两者都像是在运行虚拟的操作系统
不同点:
- Docker的启动更快
- Docker占用的资源更小
- 虚拟机可以运行不同平台的操作系统,比如在Windows上可以模拟Android
那么在这里,我想先简单的介绍一下虚拟的的实现方式,但是因为我对这方面没有深入的研究,所以如果有哪些地方说的不对,请不吝指教!
其实虚拟机分为两类,一种是构建于操作系统之上的应用软件,比如VM Workstations,又或者是各种安卓模拟器等;另一种是直接的虚拟机管理系统。
我们主要说说应用软件类型的虚拟机,在早期,这类虚拟机是完全用模拟电路的形式来实现的。因为我们知道计算机硬件的组成,归根结底就是各种门电路,所以在早期虚拟机就通过模拟数字电路,来模拟出一套计算机所需的硬件。然后在这个硬件之上,安装所需要的操作系统。
这样的实现方式很容易理解,但是我们同样也能够推测,这样的实现方式效率很低。
所以在这之后,出现了一种新的虚拟机实现方式,如果虚拟机运行的操作系统,他需要的硬件架构跟宿主机(原来的机器)是一样的,那么也就不需要去模拟这个电路了,可以直接”借用“宿主机的电路来输入输出。这样做的话,虚拟机的效率就变高了。
此外,如果虚拟机需要运行的目标操作系统,所需要的指令集跟宿主机是不一致的,比如宿主机上安装了一个Windows,这是x86架构的,而如果我想要运行Android,这是Arm架构的,那么就没办法借用宿主机上的硬件进行输入输出了,所以就需要一个模拟器,也就是我们说的”安卓模拟器“。
介绍完这些,你大概知道了虚拟机的实现方式了,但是就算是同种架构,一样的指令集,可以借用宿主机的硬件,这样虚拟化出来的操作系统还是会显得比较慢。你想,安装一个Windows,就要十几G的硬盘空间了,就算什么都不干,也要占用两三G的内存,这些资源加起来,一台机器,最多模拟几台虚拟机。为了实现环境的隔离,在资源占用上消耗了这么多,实在是不值得。
4.Docker
所以,就有了Docker。
Docker解决了为了分割环境需要很大资源代价的这个问题。
你想,我们最开始的需求只是希望能有个独立的环境,在这个环境里面有独立的文件系统、网络系统、进程系统等等。所以其实我们不需要耗费这么大的功夫去模拟一个操作系统出来,我们只需要想办法限制每个进程能够访问的资源,分配好这些资源,让进程”以为“自己运行在一个独立的操作系统中,就可以了。我们所有的进程都是基于当前的操作系统,无论是启动,还是运行,速度都会很快。并且,也没有额外运行一个或多个操作系统的资源损耗。
所以,为了区别于硬件层面的虚拟机,就有了操作系统层虚拟化这种技术,也称为:容器。
然后我想再介绍一下Docker中很重要的两个概念:镜像和容器。
镜像就是模板,你可以理解为我们把环境配置好后,保存起来作为构建容器的模板,有点像面相对象中”类“的概念。
容器是Docker运行的实体,你可以理解为一个个”虚拟的操作系统“,这个容器是根据镜像构建出来的,比如你构建了一个包含了jdk,mysql,redis的镜像,那么只要根据这个镜像,你可以创建出很多个一模一样的容器。这里有点像面相对象中”对象“的概念。
然后我还想介绍一下仓库这个概念,你可以理解为,仓库里面存储了很多的镜像。为什么需要这么做呢,我认为一个是为了方便,另一个是为了复用。方便,是因为我们之前提到了”一次构建,多次使用“这个概念。我们只需要把配置好的环境打包成一个镜像,那么只需要把这个镜像拷贝出来,就可以在任何地方进行构建了。那么仓库就是像GitHub一样,我们可以把打包好的镜像push上去,在需要的机器上再pull下来,减少了运输成本。
另外一点,复用,是因为在很多时候,大家都是需要构建一样的环境了,比如某个版本的Redis,某个版本的MySQL,某个版本的JDK等等,那么有了仓库的话,我们就不需要再构建一次了,只需要使用别人构建过的就可以了。
如果我们把容器理解为运行在当前操作系统中的进程的话,只不过这个进程能够访问的资源是有限的,会让这个进程误以为”自己运行在了独立的操作系统中“,那么我们就能够理解这句话了:
Docker容器没有自己的Kernel,他使用的Kernel版本,跟镜像无关,宿主机有关。
这个问题其实蛮有趣的,原文在这里。
但是当初我还有个问题,我们在Docker的仓库中,有看到CentOS的镜像,也有看到Ubuntu的镜像。但是我们上面又说,容器用的是宿主机上的Kernel版本,而不是镜像的。那如果我在CentOS上运行了一个Ubuntu的镜像,该怎么解释呢?
原因是这样的,我们说的内核(Kernel),指的是Linux的核心,比如他的内存管理,文件管理等等,但是说的Ubuntu、CentOS这些,指的是Linux的发行版,这些发行版,都是基于Linux制作的,只不过在不同的发行版中,添加了不同的工具。比如在CentOS中,用的是yum包管理工具,在Ubuntu中,用的是apt包管理工具。
所以,他们的内核,其实还是Linux的内核。
写在最后
嗨,好久不见。
谢谢你能看到这里!
这篇文章主要是起到一个入门的作用,希望能够让你对Docker有一个初步的认识。
当然了,因为作者学识有限,在这篇文章中很多地方的讲解都是不到位的,如果有哪里讲得不到位,讲得不对,希望你能不吝指教,谢谢你!
在后面的文章中,我会给你介绍一下namespace这个概念,让你大概的知道容器到底是怎么实现的。
但是关于Docker的那些操作,不一定会写一篇文章。因为我觉得这方面优秀的文章已经很多了,官方文档也很详细。
《Docker入门》系列的文章目前的规划是大概会有两到三篇,定位是偏向于了解Docker及一点点的原理,实用性应该不会特别强。
再次感谢你能看到这里!
PS:如果有其他的问题,也可以在公众号找到我,欢迎来找我玩~

Docker入门(1):概述的更多相关文章
- docker 入门2 - 容器 【翻译】
入门,第 2 部分:容器 先决条件 安装的 Docker 版本是 1.13 及以上. 读完 第一部分 用下面的命令快速测试你的环境是否完备: docker run hello-world 概述 现在开 ...
- docker入门、LXC、windows container 和 Hyper知识基础、实用情况
虚拟机与容器 很明显可以看出两者在操作系统级别上的隔离和进程上的隔离的区别,VM因为隔离级别更高明显更重. linux容器主要技术特点: 文件系统隔离:每个容器都有自己的root文件系统 进程隔离:每 ...
- Docker入门与进阶(下)
Docker入门与进阶(下) 作者 刘畅 时间 2020-11-12 实验主机配置 系统centos7.5 主机名 ip 配置 应用 harbor-master 172.16.1.71 2核4G/60 ...
- Docker入门与进阶(上)
Docker入门与进阶(上) 作者 刘畅 时间 2020-10-17 目录 1 Docker核心概述与安装 1 1.1 为什么要用容器 1 1.2 docker是什么 1 1.3 docker设计目标 ...
- Docker入门系列之五:15个 Docker 命令
在这篇文章中,我们将学习15个Dockers CLI命令.如果你还不了解Docker,请查看这个系列的其他部分进行学习,Docker概念,生态系统,Dockerfile,Docker镜像. Docke ...
- Docker入门篇(一)安装docker
Docker入门篇(一)安装docker Docker的来源 由dotCloud公司首创及正式命名,但是企业规模小,影响力不够,所以在快要坚持不住的时候,开始吃百家饭--开源了.不开则已,一开惊人.越 ...
- 第三章 Docker 入门
第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...
- Docker入门教程(九)10个镜像相关的API
Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...
- Docker入门教程(八)Docker Remote API
Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...
随机推荐
- 【Socket通信】关于Socket通信原理解析及python实现
Socket(套接字)通信{网络通信其实就是Socket间的通信},首先了解下概念:[来源于百度百科] "两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket.& ...
- 又发现一款纯js开源电子表格Luckysheet
据官网介绍这个电子表格插件,是一款纯前端类似excel的在线表格,功能强大.配置简单.完全开源. 官网链接: Luckysheet官网 在线DEMO 特性包含: 表格设置,包括冻结行列.合并单元格.筛 ...
- JavaScript (四) js的基本语法 - - 函数练习、arguments、函数定义、作用域、预解析
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.函数练习 1.求最值 // - 求2个数中的最大值 function getMax(num1, nu ...
- Java实现 蓝桥杯 算法训练 审美课
算法训练 审美课 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 <审美的历程>课上有n位学生,帅老师展示了m幅画,其中有些是梵高的作品,另外的都出自五岁小朋友之手.老师 ...
- java实现放麦子问题
/* 你一定听说过这个故事.国王对发明国际象棋的大臣很佩服, 问他要什么报酬,大臣说:请在第 1 个棋盘格放 1 粒麦子, 在第 2 个棋盘格放 2 粒麦子,在第 3 个棋盘格放 4 粒麦子, 在第 ...
- Java实现第八届蓝桥杯最大公共子串
最大公共子串 最大公共子串长度问题就是: 求两个串的所有子串中能够匹配上的最大长度是多少. 比如:"abcdkkk" 和 "baabcdadabc", 可以找到 ...
- 第03组 Alpha(2/4)
队名:不等式方程组 组长博客 作业博客 团队项目进度 组员一:张逸杰(组长) 过去两天完成的任务: 文字/口头描述: 制定了初步的项目计划,并开始学习一些推荐.搜索类算法 GitHub签入纪录: 暂无 ...
- 举一个有趣的例子,让你轻松搞懂JVM内存管理
目录 前言 例子 源码 输出 图解 深入分析 学以致用 写在最后 前言 在JAVA虚拟机内存管理中,堆.栈.方法区.常量池等概念经常被提到,对理论知识的理解也常常停留在字面意思上,比如说堆内存中存放对 ...
- Android开发之StrictMode
StrictMode简介 Android开发者官网对StrictMode的介绍 StrictMode类是Android 2.3(API 9)引入的一个工具类 用来帮助开发者发现代码中一些不规范的问题, ...
- Python数据分析软件包介绍
Python数据分析主要软件包: 1.python -m pip install numpy 2.python -m pip install pandas 3.python -m pip instal ...