为了账号安全,请及时绑定邮箱和手机立即绑定

【学习打卡】第7天 docker入门

标签:
Docker

第一模块

课程名称:第一个docker化的java应用

章节名称:1-1 ~ 4-1

讲师姓名:刘果国


第二模块

课程内容概述:

首先简单的介绍了docker,随后讲解了docker的集装箱、标准化、隔离的思想,最后通过类比引出docker的核心技术:镜像、仓库和容器的概念,并分别深入讲解技术、原理等。之后讲解了docker安装上的一些实操。


第三模块

学习心得:

云原生的时代docker是重要的一块拼图,是虚拟化的技术落地代表,通过学习docker可以更好的理解云原生的技术细节,已经docker如何与java进行技术整合等,下面附上学习笔记:

1.1 课程简介

docker化java应用

1.2 什么是docker【时势造英雄——云原生,云部署】

docker的发展历史:

https://img1.sycdn.imooc.com//62f51f1500016c8a05450178.jpg

啥是docker:

开源的应用软件的【容器】,可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的机器上,从而抹平【系统环境windows、Macos、Linux】的差异。源码托管在github上;

2.1 docker的理念

  • 集装箱

  • 标准化【运维流程化】

    • 运输方式

    • 存储方式

    • API接口

  • 隔离:底层使用LXC技术(一种轻量的容器虚拟化技术,是Linux的一种内核限制机制)

2.2 docker解决的问题

1.抹平环境的差异,解决软件运行环境不一致所带来的问题

2.将运维的流程标准化,从而使【快速扩展】、【服务水平伸缩】变得简单

3.隔离各个应用,避免个别应用出错造成的服务雪崩

docker化的步骤:

  • 依赖集装箱打包

  • 鲸鱼运输到服务器

3.1docker的核心技术

Build:构建——构建镜像【镜像】

Ship:运输——运输镜像,从仓库和主机上运输【仓库】

Run:Run运行的镜像就是一个容器【容器】

图解:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f260001530005220233.jpg

3.2docker镜像【image】

镜像的本质:一系列文件(应用程序文件、运行环境文件......)按照一定的格式打包后的【文件集】

这个【格式】就是【镜像的格式】,与Linux的一项存储技术有关——联合文件系统(Union File System),是一个分层的文件系统,可以做到将【不同的目录挂到同一个虚拟文件系统下】

docker镜像利用了【分层的概念】实现了【镜像存储】

eg:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f2c0001c75e05370163.jpg

docker镜像存储格式图解:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f33000140df05430195.jpg

从上图可以明显看出:docker的镜像文件是分层,分为n层,每一层存放的文件都不一样,即:每层有每层的作用;这5层堆叠起来就构成了一个docker镜像,也就是【鲸鱼身上托着的一个【集装箱】】,但是由于docker镜像采用了联合文件系统(Union File System),可以做到将【不同的目录挂到同一个虚拟文件系统下】;

从而就做到了这种效果:

docker镜像内部文件分层,但对外表现出来的效果是不分层的,所有文件都在一个层面上!

一个docker镜像当他的所有层都被加载进来后,对外展示的效果就会是【不分层的】

注意:docker镜像文件的每一层都是只读的,除了最上面的那层是可写的。

docker中从【文件】-->【镜像】-->【容器】的过程是:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f39000164f505310229.jpg

3.3docker容器【container】

容器的本质:就是一个进程

把容器想象成一个虚拟机,每个虚拟机都有自己的文件系统,在这个文件系统里面,他的文件也是分层的,和【镜像】的文件分层类似,只有最上一层是可读可写的,下面的n层都是只读的,当遇到需要修改n层中的文件的时候(假设这个文件在x层),那么就会将x层的文件拷贝到【最上层】,在最上层对x层的文件进行修改。

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的 命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样。这种特性使得容器封装的应用比直接在宿主运行更加安全。也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。

前面讲过镜像使用的是分层存储,容器也是如此。每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层(就是最上面的那一层)。

容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡。因此,任何保存于容器存储层的信息都会随容器删除而丢失。

按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化(即:不应该存放任何数据)。所有的文件写入操作,都应该使用 数据卷(Volume)、或者 绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

理清【物理机】、【虚拟机】和【容器】之间的关系:

物理机 = 操作系统 + 物理载体(eg:笔记本、主机机箱)

虚拟机 = 操作系统的镜像 + 创建虚拟机的软件 + 物理机宿主(虚拟机需要占用物理机的一部分物理硬件,比如:硬盘、内存、cpu)

容器 = docker镜像运行的实例

一个问题:已经有了【虚拟机技术】为什么还需要【docker】?

首先明确一个基本事实:

【虚拟机】和【docker】他们解决问题的技术是一样的——虚拟化技术。

但是他们所要解决的问题是存在差异的:

虚拟机主要解决的是——用户隔离

docker主要解决的是——应用隔离

这两个问题的边界是不一样的,图解:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f450001e6e605350326.jpg

那【用户隔离】和【应用隔离】有啥不一样?

【用户隔离】:我们都知道,现实生活中,每个人都有自己的电脑,每台电脑上都有一个完整的操作系统,那么就相当于【一个用户独占一个操作系统】,即:一个用户需要一个完整的操作系统才可以满足他的需求

那一个应用需要一个完整的操作系统资源才可以运行起来吗?显然是不用的(虽然有那种情况,但是很少,很少)

所以,这个时候就需要docker技术了,通过docker技术的【镜像化打包】,将【应用程序】、【应用程序依赖的运行时】、【应用程序依赖的操作系统资源】等一系列的【运行时依赖树】”连根拔起“,【整体文件分层】镜像化打包成一个【docker镜像】,而容器就是镜像的运行实例。

从这里可以看出:【应用隔离】比 【用户隔离】要轻量很多,【用户隔离】需要一整个操作系统,而【应用隔离】只需要操作系统的一部分。

所以,虽然使用【虚拟机技术】一样可以实现【应用隔离】,但是,消耗会很大,会产生巨大浪费,因此,docker技术的出现并席卷IT技术界,是有其真实的行业痛点存在的。

使用虚拟机运行多个相互隔离的应用图解:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f4d000169d405560279.jpg

使用Docker运行多个相互隔离的应用图解:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f53000116fa05420157.jpg

docker有docker的优势,虚拟机有虚拟机技术的应用场景;

虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。

Docker通常用于隔离不同的应用,例如前端,后端以及数据库。

两者【隔离图】对比:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f660001c07805360244.jpg

docker容器使用由Linux内核提供的命名空间,大多数人把命名空间认为是一个上下文或域的授权

虚拟机的伟大在于:通过抽象来增加并行,服务于多操作系统的使用情况以及业界最好的安全性。但对于隔离,它们相当的昂贵,容器提供的隔离就便宜。

【服务器虚拟化】与【服务器Docker化】图解:

spacer.gifhttps://img1.sycdn.imooc.com//62f51f6d0001d50d05530243.jpg

服务器:港口(拥有场地和各种设备)

服务器虚拟化:港口上的仓库(拥有独立的空间堆放各种货物或集装箱)

服务器Docker化:港口上的集装箱

不同的集装箱属于不同的运单(Docker上运行不同的应用实例),相互独立(隔离)。但由同一个人管理(主操作系统的内核),因此通过管理员可以看到所有集装箱的相关信息(因为共享操作系统内核,因此相关信息会共享)。

服务器虚拟化就好比在码头上(物理主机及虚拟化层),建立了多个独立的仓库(虚拟机)。其拥有完全独立(隔离)的空间,属于不同的客户(虚拟机所有者)。每个仓库有各自的管理员(当前虚拟机的操作系统内核),无法管理其它仓库,不存在信息共享的情况。

所以:需要根据不同的应用场景和需求采用不同的方式使用Docker技术或使用服务器虚拟化技术。

典型的Docker应用场景:主机上的Docker实例属于单一用户的情况下,在保证安全的同时可以充分发挥Docker的技术优势。

典型的虚拟机应用场景:对于隔离要求较高的环境如混合用户环境,就可以使用服务器虚拟化技术。

3.4docker仓库【warehouse】

远程docker开源仓库:hub.docker.com

国内仓库:c.163.com/hub#/home

docker仓库直接类比maven仓库就可以了,说白了,就是一个放docker镜像的地方

4.1windows安装docker

spacer.gifhttps://img1.sycdn.imooc.com//62f51f79000118e705490206.jpg

Win10与Win10之外的系统对docker支持的方式不一样,则安装方式也会存在区别

win10安装docker后的一些问题:

1.提示我们更新WSL到WSL2

处理:碰到问题了再说,先不管

官方教程:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package

spacer.gifhttps://img1.sycdn.imooc.com//62f51f8100017cb805610186.jpg

参考文章:

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



第四模块

学习截图:
https://img1.sycdn.imooc.com//62f51dab0001a0e107640785.jpg

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消