Docker 入门到实战教程(一)介绍Docker-程序员宅基地

一. Docker简介

1.1 什么是虚拟化?

在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源,如服务器、网络、内存及存储等,予以抽象、转换后呈现出来,打破实体结构间的不可切割的障碍,使用户可以比原本的组态更好的方式来应用这些资源。这些资源的新虚拟部份是不受现有资源的架设方式,地域或物理组态所限制。一般所指的虚拟化资源包括计算能力和资料存储。

在实际的生产环境中,虚拟化技术主要用来解决高性能的物理硬件产能过剩和老的旧的硬件产能过低的重组重用,透明化底层物理硬件,从而最大化的利用物理硬件 对资源充分利用

虚拟化技术种类很多,例如:软件虚拟化、硬件虚拟化、内存虚拟化、网络虚拟化(vip)、桌面虚拟化、服务虚拟化、虚拟机等等。

1.2 什么是Docker

Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。

Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

1.3 为什么选择Docker?

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

(1)更高效的利用系统资源。

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

(2)更快速的启动时间

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

(3)一致的运行环境

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

(4)持续交付和部署

对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。

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

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

(5)更轻松的迁移

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

(6)更轻松的维护和扩展

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

1.4 容器与虚拟机比较

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

传统虚拟化
Docker

与传统的虚拟机相比,Docker优势体现为启动速度快、占用体积小。

1.5 Docker 组件
1.5.1 Docker服务器与客户端

Docker是一个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。Docker提供了一个命令行工具Docker以及一整套RESTful API。你可以在同一台宿主机上运行Docker守护进程和客户端,也可以从本地的Docker客户端连接到运行在另一台宿主机上的远程Docker守护进程。

docker client是一个泛称,它可以是命令行docker,也可以是遵循了docker api规则的客户端,简单地说可以理解为一个用于交互/发送指令的接口。

1.5.2 Docker镜像

镜像是构建Docker的基石。用户基于镜像来运行自己的容器。镜像也是Docker生命周期中的“构建”部分。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。例如:

添加一个文件;
执行一个命令;
打开一个窗口

也可以将镜像当作容器的“源代码”。镜像体积很小,非常“便携”,易于分享、存储和更新。

镜像是一个只读的容器模板,含有启动docker容器所需的文件系统结构及内容 Docker以镜像和在镜像基础上构建的容器为基础,以容器开发、测试、发布的单元将应用相关的所有组件和环境进行封装,避免了应用在不同平台间迁移所带来的依赖问题,确保了应用在生产环境的各阶段达到高度一致的实际效果。

镜像可以被创建、启动、关闭、重启以及销毁。

  • 分层机制

Docker的镜像机制是有层次感的,一个镜像可以放到另一个镜像的顶部。位于下端的为父镜像,以此类推;最底部的镜像可称为基础镜像。

镜像采用分层构建,每个镜像由一系列的镜像层组成, 当需要修改容器内的某个文件时,只对处于最上方的读写层进行变动,不覆盖下面已有文件系统的内容。当提交这个修改过的容器文件系统为一个新的镜像时,保存的内容仅为最上层读写文件系统中被更新过的文件。

  • bootfs
    主要包含bootloader和kernel, bootloader主要是引导加载kernel, 当容器启动成功后,kernel被加载到内存中后而引导文件系统则会被卸载unmount+ rootfs  是容器在启动时内部进程可见的文件系统,通常包含一个操作系统运行所需的文件系统

    • 传统linux在内核启动时首先会挂载一个只读的rootfs,检测器完整性之后再切换为读写模式

    • docker在挂载rootfs时也将其设为只读模式,挂载完毕后利用联合挂载技术在已有的只读rootfs上再挂载一个读写层。

    • 只有运行中文件系统发生变化,才会把变化的内容写到读写层,并隐藏只读层中的老版本文件

    • rootfs包含的就是典型Linux系统中的 /dev,/proc,/bin, /etc等标准目录和文件。

  • 写时复制

    • 可以在多个容器之间共享镜像,每个容器启动时不需要单独复制一份镜像文件

    • 将所有镜像层以只读方式挂载到一个挂载点,在上面覆盖一个可读写的容器层。

    • 写时复制配合分层机制减少了镜像对磁盘空间的占用和容器启动时间

  • 内容寻址

    • 根据内容来索引镜像和镜像层

    • 是对镜像层的内容计算检验和,生成一个内容哈希值作为镜像层的唯一标识

    • 对于来自不同构建的镜像层,只要拥有相同的内容哈希,也能被不同镜像共享

  • 联合挂载

    • 可以在一个挂载点挂载多个文件系统,将挂载点的原目录与被挂在内容进行整合,最终可见的文件系统将包含整合后各层的文件和目录

    • 读写层处于容器文件系统的最顶层,其下可能联合挂载多个只读层。

1.5.3 容器

Docker可以帮助你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。我们可以认为,镜像是Docker生命周期中的构建或者打包阶段,而容器则是启动或者执行阶段。容器基于镜像启动,一旦容器启动完成后,我们就可以登录到容器中安装自己需要的软件或者服务。

所以Docker容器就是:

一个镜像格式;
一些列标准操作;
一个执行环境

Docker借鉴了标准集装箱的概念。标准集装箱将货物运往世界各地,Docker将这个模型运用到自己的设计中,唯一不同的是:集装箱运输货物,而Docker运输软件。

 和集装箱一样,Docker在执行上述操作时,并不关心容器中到底装了什么,它不管是web服务器,还是数据库,或者是应用程序服务器什么的。所有的容器都按照相同的方式将内容“装载”进去。

 Docker也不关心你要把容器运到何方:我们可以在自己的笔记本中构建容器,上传到Registry,然后下载到一个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱一样,Docker容器方便替换,可以叠加,易于分发,并且尽量通用。
1.5.4 Registry(仓库)

Docker用Registry来保存用户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。用户可以在Docker Hub注册账号,分享并保存自己的镜像(说明:在Docker Hub下载镜像巨慢,可以自己构建私有的Registry)。

用户也可以在Docker Hub上保存自己的私有镜像。https://hub.docker.com/

参考资料:
https://www.jianshu.com/p/3bfa8d09bc8b https://www.cnblogs.com/saryli/p/10061097.html https://blog.csdn.net/cx55887/article/details/84667622

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_34936541/article/details/104890251

智能推荐

分布式统计计算------逆变换法生成随机数 - R Studio_假设离散型随机变量x的分布率如下,使用逆变换方法产生1000随机数-程序员宅基地

文章浏览阅读1w次,点赞12次,收藏153次。摘要文章目录摘要几个缩写连续型分布情况下离散型分布情况下几个缩写pmf(probability mass function):概率质量函数。离散随机变量在各特定取值上的概率。只有离散型随机变量才有概率质量函数。PDF/pdf(probability density function):概率密度函数,简称密度函数。描述随机变量的输出值,在某个确定的取值点附近的可能性的函数CDF/cdf(cumulatative distributionfunction):累积分布函数,简称分布函数。是概_假设离散型随机变量x的分布率如下,使用逆变换方法产生1000随机数

推荐 130 个令你眼前一亮的网站,总有一个用得着-程序员宅基地

文章浏览阅读1.3k次。文章目录130 余个相见恨晚的超实用网站搞学习找书籍冷知识 / 黑科技写代码资源搜索小工具导航页(工具集)看视频学设计搞文档找图片搞学习CSDN: https://www.csdn.net/TED(最优质的演讲):https://www.ted.com/谷粉学术: https://gfsoso.99lb.net/scholar.html大学资源网:http://www.dxzy16...

详解热备份路由协议(HSRP)-程序员宅基地

文章浏览阅读238次。了解HSRP概述HSRP(热备份路由协议):是思科私有的一种技术,它确保了的那个网络边缘设备或接入链路出现故障时,用户通信能迅速并透明地恢复,以此为IP网络提供冗余性。热备份路由协议为IP网络提供容错和增强的路由选择功能。通过使用一个虚拟的IP地址和虚拟MAC地址,LAN网段上的两台或者多台路由器可以作为一台虚拟路由器对外提供服务。熟悉HSRP组成员HSRP备份有一台活跃路由..._hsrp占先圈的概念

python中数组转矩阵_python实现矩阵和array数组之间的转换-程序员宅基地

文章浏览阅读7.4k次。python 列表、矩阵、数组之间的关系矩阵可以实现多维切片,如: b = m[1:10, 3:20] 但是 多维列表却不可以首先,没见过b = m[1:10, 3:20] 这种写法,小编试了一下有错误 其次,多维列表也是可以切片的。python怎么将数组转换为矩阵?python将数组转换为矩阵,方法如下: 数组转换矩阵: A = mat(s[]) Python的定义: Python是一种面向对象..._python将数组转化为矩阵

Mybatis中使用Foreach遍历数组查询_mybatis foreach int数组-程序员宅基地

文章浏览阅读2k次,点赞4次,收藏2次。一入开发深似海,从此路人皆"对象"Mybatis中使用Foreach遍历数组查询(集合雷同)前言一、话不多说直接上图方法1.在sql层面上解决问题方法2 在代码方面解决问题总结前言我是在查询的过程中将数组作为查询条件用到了foreach in 进行查询,以及如何避免数据超过1000mybatis抛出异常。提示:以下是本篇文章正文内容,下面案例可供参考一、话不多说直接上图方法1.在sql层面上解决问题在写的时候注意重点最终执行的效果为:where(poolid in 1 or po_mybatis foreach int数组

JDK1.7和JDK1.8中HashMap为什么是线程不安全的_hashmap为什么线程不安全 jdk17-程序员宅基地

文章浏览阅读141次。JDK1.7和JDK1.8中HashMap为什么是线程不安全的_hashmap为什么线程不安全 jdk17

随便推点

三只水桶等分水问题_三个桶分水-程序员宅基地

文章浏览阅读3.9k次。转自:http://blog.csdn.net/orbit/article/details/6596521 算法系列之二: 三只水桶等分水问题 有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它辅助容器。 这是一道经典题目,一般人都可以在一分_三个桶分水

《重构 改善既有代码的设计 2》重新组织函数、数据-程序员宅基地

文章浏览阅读840次,点赞19次,收藏9次。每年转战互联网行业的人很多,说白了也是冲着高薪去的,不管你是即将步入这个行业还是想转行,学习是必不可少的。作为一个Java开发,学习成了日常生活的一部分,不学习你就会被这个行业淘汰,这也是这个行业残酷的现实。如果你对Java感兴趣,想要转行改变自己,那就要趁着机遇行动起来。或许,这份限量版的Java零基础宝典能够对你有所帮助。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!!**如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

C语言实现青蛙跳台阶_青蛙跳一百个台阶c语言-程序员宅基地

文章浏览阅读470次,点赞2次,收藏3次。C语言,超简单,读过一遍差不多就会了_青蛙跳一百个台阶c语言

数据结构考研笔记之栈与队列(四)栈与队列应用----括号匹配、中缀表达式转前缀后缀问题_中缀表达式转前缀题目-程序员宅基地

文章浏览阅读1.6k次。栈与队列1.括号匹配问题栈例题1例题2-----不匹配例题1例题3-----不匹配例题22. 表达式求值问题例题1.中缀表达式转前缀表达式2.中缀表达式转后缀表达式实现过程:3. 递归:递归产生的问题:1.括号匹配问题栈例题1算法思想:1)初始一个空栈,顺序读入括号。若是右括号,则与栈顶元素进行匹配·若匹配,则弹出栈顶元素并进行下一个元素·若不匹配,则该序列不合法3)若是左括号,则压入栈中4)若全部元素遍历完毕,栈中非空则序列不合法解题:1.首先1、2都是左括号,直接进栈2._中缀表达式转前缀题目

C# 文件监控,任何文件夹或文件修改后 ,如何立即触发监控_c#监控文件夹是否有文件更新-程序员宅基地

文章浏览阅读9.8k次,点赞11次,收藏46次。一、场景有时候,我们需要监控文件夹以及文件的变化,然后做出一些业务处理,这里面,最典型的例子,估计前端攻城狮老熟的,就是各种打包了。那么在C#后端,也会遇到要监控变化的情况。一个文件如何被修改,就会触发什么动作。二、C#中的文件监控可以用钩子函数来处理,这种会处理得让你抓狂,一可能是太多消息事件,你头都大,二估计你不是C/C++的程序员,对win32函数本身就不熟,找资料都要你老费劲了。那么C#中的文件监控还有什么办法呢?C#庞大的类库中,提供了FileSystemWatcher类,该类_c#监控文件夹是否有文件更新

Java(顾客最短等待时间)_java 根据人数 安排最少时间怎么写-程序员宅基地

文章浏览阅读2k次。题目如下:设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti(1<i<n),共有s处可以提供此项服务。应如何安排n个顾客的服务次序才能使得平均等待时间达到最小?平均等待时间是n个顾客等待时间的总和除以n。代码如下:package TXSF;import java.util.Scanner;public class ZY { public static vo..._java 根据人数 安排最少时间怎么写

推荐文章

热门文章

相关标签