第一模块
课程名称:第一个docker化的java应用
章节名称:1-1 ~ 4-1
讲师姓名:刘果国
第二模块
课程内容概述:
首先简单的介绍了docker,随后讲解了docker的集装箱、标准化、隔离的思想,最后通过类比引出docker的核心技术:镜像、仓库和容器的概念,并分别深入讲解技术、原理等。之后讲解了docker安装上的一些实操。
第三模块
学习心得:
云原生的时代docker是重要的一块拼图,是虚拟化的技术落地代表,通过学习docker可以更好的理解云原生的技术细节,已经docker如何与java进行技术整合等,下面附上学习笔记:
1.1 课程简介
docker化java应用
1.2 什么是docker【时势造英雄——云原生,云部署】
docker的发展历史:
啥是docker:
开源的应用软件的【容器】,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的机器上,从而抹平【系统环境windows、Macos、Linux】的差异。源码托管在github上;
2.1 docker的理念
集装箱
标准化【运维流程化】
运输方式
存储方式
API接口
隔离:底层使用LXC技术(一种轻量的容器虚拟化技术,是Linux的一种内核限制机制)
2.2 docker解决的问题
1.抹平环境的差异,解决软件运行环境不一致所带来的问题
2.将运维的流程标准化,从而使【快速扩展】、【服务水平伸缩】变得简单
3.隔离各个应用,避免个别应用出错造成的服务雪崩
docker化的步骤:
依赖集装箱打包
鲸鱼运输到服务器
3.1docker的核心技术
Build:构建——构建镜像【镜像】
Ship:运输——运输镜像,从仓库和主机上运输【仓库】
Run:Run运行的镜像就是一个容器【容器】
图解:
3.2docker镜像【image】
镜像的本质:一系列文件(应用程序文件、运行环境文件......)按照一定的格式打包后的【文件集】
这个【格式】就是【镜像的格式】,与Linux的一项存储技术有关——联合文件系统(Union File System),是一个分层的文件系统,可以做到将【不同的目录挂到同一个虚拟文件系统下】
docker镜像利用了【分层的概念】实现了【镜像存储】
eg:
docker镜像存储格式图解:
从上图可以明显看出:docker的镜像文件是分层,分为n层,每一层存放的文件都不一样,即:每层有每层的作用;这5层堆叠起来就构成了一个docker镜像,也就是【鲸鱼身上托着的一个【集装箱】】,但是由于docker镜像采用了联合文件系统(Union File System),可以做到将【不同的目录挂到同一个虚拟文件系统下】;
从而就做到了这种效果:
docker镜像内部文件分层,但对外表现出来的效果是不分层的,所有文件都在一个层面上!
一个docker镜像当他的所有层都被加载进来后,对外展示的效果就会是【不分层的】
注意:docker镜像文件的每一层都是只读的,除了最上面的那层是可写的。
docker中从【文件】-->【镜像】-->【容器】的过程是:
3.3docker容器【container】
容器的本质:就是一个进程
把容器想象成一个虚拟机,每个虚拟机都有自己的文件系统,在这个文件系统里面,他的文件也是分层的,和【镜像】的文件分层类似,只有最上一层是可读可写的,下面的n层都是只读的,当遇到需要修改n层中的文件的时候(假设这个文件在x层),那么就会将x层的文件拷贝到【最上层】,在最上层对x层的文件进行修改。
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层(就是最上面的那一层)。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。
按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化(即:不应该存放任何数据)。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。
理清【物理机】、【虚拟机】和【容器】之间的关系:
物理机 = 操作系统 + 物理载体(eg:笔记本、主机机箱)
虚拟机 = 操作系统的镜像 + 创建虚拟机的软件 + 物理机宿主(虚拟机需要占用物理机的一部分物理硬件,比如:硬盘、内存、cpu)
容器 = docker镜像运行的实例
一个问题:已经有了【虚拟机技术】为什么还需要【docker】?
首先明确一个基本事实:
【虚拟机】和【docker】他们解决问题的技术是一样的——虚拟化技术。
但是他们所要解决的问题是存在差异的:
虚拟机主要解决的是——用户隔离
docker主要解决的是——应用隔离
这两个问题的边界是不一样的,图解:
那【用户隔离】和【应用隔离】有啥不一样?
【用户隔离】:我们都知道,现实生活中,每个人都有自己的电脑,每台电脑上都有一个完整的操作系统,那么就相当于【一个用户独占一个操作系统】,即:一个用户需要一个完整的操作系统才可以满足他的需求
那一个应用需要一个完整的操作系统资源才可以运行起来吗?显然是不用的(虽然有那种情况,但是很少,很少)
所以,这个时候就需要docker技术了,通过docker技术的【镜像化打包】,将【应用程序】、【应用程序依赖的运行时】、【应用程序依赖的操作系统资源】等一系列的【运行时依赖树】”连根拔起“,【整体文件分层】镜像化打包成一个【docker镜像】,而容器就是镜像的运行实例。
从这里可以看出:【应用隔离】比 【用户隔离】要轻量很多,【用户隔离】需要一整个操作系统,而【应用隔离】只需要操作系统的一部分。
所以,虽然使用【虚拟机技术】一样可以实现【应用隔离】,但是,消耗会很大,会产生巨大浪费,因此,docker技术的出现并席卷IT技术界,是有其真实的行业痛点存在的。
使用虚拟机运行多个相互隔离的应用图解:
使用Docker运行多个相互隔离的应用图解:
docker有docker的优势,虚拟机有虚拟机技术的应用场景;
虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。
Docker通常用于隔离不同的应用,例如前端,后端以及数据库。
两者【隔离图】对比:
docker容器使用由Linux内核提供的命名空间,大多数人把命名空间认为是一个上下文或域的授权
虚拟机的伟大在于:通过抽象来增加并行,服务于多操作系统的使用情况以及业界最好的安全性。但对于隔离,它们相当的昂贵,容器提供的隔离就便宜。
【服务器虚拟化】与【服务器Docker化】图解:
服务器:港口(拥有场地和各种设备)
服务器虚拟化:港口上的仓库(拥有独立的空间堆放各种货物或集装箱)
服务器Docker化:港口上的集装箱
不同的集装箱属于不同的运单(Docker上运行不同的应用实例),相互独立(隔离)。但由同一个人管理(主操作系统的内核),因此通过管理员可以看到所有集装箱的相关信息(因为共享操作系统内核,因此相关信息会共享)。
服务器虚拟化就好比在码头上(物理主机及虚拟化层),建立了多个独立的仓库(虚拟机)。其拥有完全独立(隔离)的空间,属于不同的客户(虚拟机所有者)。每个仓库有各自的管理员(当前虚拟机的操作系统内核),无法管理其它仓库,不存在信息共享的情况。
所以:需要根据不同的应用场景和需求采用不同的方式使用Docker技术或使用服务器虚拟化技术。
典型的Docker应用场景:主机上的Docker实例属于单一用户的情况下,在保证安全的同时可以充分发挥Docker的技术优势。
典型的虚拟机应用场景:对于隔离要求较高的环境如混合用户环境,就可以使用服务器虚拟化技术。
3.4docker仓库【warehouse】
远程docker开源仓库:hub.docker.com
国内仓库:c.163.com/hub#/home
docker仓库直接类比maven仓库就可以了,说白了,就是一个放docker镜像的地方
4.1windows安装docker
Win10与Win10之外的系统对docker支持的方式不一样,则安装方式也会存在区别
win10安装docker后的一些问题:
1.提示我们更新WSL到WSL2
处理:碰到问题了再说,先不管
参考文章:
1.https://yeasy.gitbook.io/docker_practice/basic_concept/container
2.https://www.jianshu.com/p/50f48eb25215
3.https://www.imooc.com/video/14615/0
第四模块
学习截图:
共同学习,写下你的评论
评论加载中...
作者其他优质文章