docker镜像原理(一)
在理解什么是docker镜像之前我们需要搞懂虚拟机系统到底是怎么组成的如何实现的,docker中又是如何安装和使用虚拟机系统的,怎样可以高效灵活的切换系统发行版等问题
一、centos7系统长什么样
我们一直以来,是用Vm虚拟机安装的系统,是一个完整的系统文件,包括两部分
- linux内核,作用是提供操作系统基本功能和机器硬件交互,读取磁盘数据,网络管理等。
- centos7发行版,作用提供软件功能,例如yum安装包管理等。
因此,linux内核+centos发行版,就组成一个系统,让我们用户使用。(如:centos、ubuntu...)
查看linux系统的内核和发行版
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
[root@localhost ~]# uname -r
3.10.0-862.el7.x86_64
是否有办法可以灵活的替换发行版,让我们使用不同的【系统】?
- docker实现了这个功能,技术手段是docker images
# 利用多次docker获取不同的发行版镜像
docker pull centos:7.8.2003
docker pull ubuntu
# 确认当前的宿主机发行版
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
# 运行centos:7.8.2003发行版
# 运行容器且进入容器内
# 参数解释 -i 交互式命令操作 -t 开启一个终端(进行命令操作) afb6fca791e0 容器id bash 进入容器后执行的命令
[root@localhost ~]# docker run -it afb6fca791e0 bash
[root@cac5c0088f69 /]#
# 查看容器内的发行版本
[root@cac5c0088f69 /]# cat /etc/redhat-release
CentOS Linux release 7.8.2003 (Core)
# 安装运行ubuntu系统查看内核参数
[root@localhost ~]# docker pull ubuntu
[root@localhost ~]# docker run -it ubuntu bash
root@1ff8d92d7c70:/#
# 查看容器内的ubuntu版本
root@1ff8d92d7c70:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.3 LTS"
#Ubuntu的包管理工具
# 安装suse系统
# 在容器内查找是否opensuse镜像
[root@localhost ~]# docker search opensuse
# 安装opensuse镜像
[root@localhost ~]# docker pull opensuse
# 运行opensuse镜像
[root@localhost ~]# docker run -it opensuse bash
# 查看的opensuset
88997e5e7b5d:/ # cat /etc/SuSE-release
openSUSE 42.3 (x86_64)
VERSION = 42.3
CODENAME = Malachite
# /etc/SuSE-release is deprecated and will be removed in the future, use /etc/os-release instead
上述总结
- 系统是如何组成的?
- 一个完整的系统,是由linux内核+发行版,才组成了一个完整的系统
- docker中是如何安装和使用系统、并完成高效切换的?
- 利用docker容器,可以获取不同的发行版镜像,然后基于该镜像,运行出各种容器去使用
二、理解什么是docker的镜像原理
在此之前我们需要先了解一下使用docker可以具体解决哪些问题?
docker images的搜索地址: https://hub.docker.com/
假设开发老王的笔记本Windows,需要安装各种软件环境去运行项目,如果你直接安装在宿主机上,那受限于宿主机的环境。
- 有哪些限制?
- 环境不兼容,比如软件系统不兼容,你安装的Windows,软件需要linux运行
- 会将你当前系统的环境搞的一团糟
- 不如你要卸载这些工具。。很麻烦。
docker解决这些问题,还是Windows系统
- 解决了环境不兼容问题,在容器中运行linux发行版以及各种软件【windows+docker+容器1(centos)+容器2(ubuntu)】
- 环境很干净,你安装的所有内容,都在容器里,不想要了直接删除容器
- 比如你想吧mysql容器内的数据、配置、全部迁移到到服务器上,只需要提交该容器,生成镜像,镜像放到服务器上,直接 docker run运行就可以了
docker架构,镜像就是一个【发行版】的作用,你需要提前准备好一个linux内核,然后上层正常使用不同的发行版就好了,这样你可以自由的使用各种版本系统来兼容环境
docker镜像下载过程中我们发现他耗时是一个块一块下载的,为什么?
[root@localhost ~]# docker pull redis
Using default tag: latest
latest: Pulling from library/redis
a2abf6c4d29d: Already exists
c7a4e4382001: Pull complete
4044b9ba67c9: Pull complete
c8388a79482f: Pull complete
413c8bb60be2: Pull complete
1abfd3011519: Pull complete
Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339
Status: Downloaded newer image for redis:latest
docker.io/library/redis:latest
docker镜像原理示意图
既然docker是分层的那我们得到的镜像文件为什么又是一整个?
- docker通过联合文件系统(union file system),将上图中每一层,整合为一个文件系统,为用户隐藏了多层视角。
上述总结
- 当通过一个image启动容器时,docker会在该image最顶层,为我们添加一个读写文件系统作为容器,然后运行该容器。
- docker镜像本质是基于union file System管理的分层文件系统。
- docker镜像为什么小?
- 因为docker镜像只有rootfs(发行版)和其他镜像层,共用宿主机的内核,因此很小
- 为什么下载一个docker的nginx镜像,要比正常nginx装包大那么多?
- 因为docker的nginx是分层的,nginx是的安装包就几M,但是一个用于运行nginx的镜像文件,依赖于父镜像(上一层)和基础镜像(发行版),所以下载的nginx镜像才会比正常安装包大
所有博客仅用于自己学习记录,如有侵权请联系删除,文章来源于公开视频资料,如有需要请移步这里:
https://www.bilibili.com/video/BV1o14y1w7b8?p=12&vd_source=6a0e07382af7c460c1a03694e4d4f4c7
docker镜像原理(一)的更多相关文章
- 深入分析 Docker 镜像原理
摘要:近日, DaoCloud 软件工程师孙宏亮在 CSDN Container 微信群为大家带来了 Docker 镜像原理的深度分享,本次分享的重点是 Docker 镜像,分享的内容主要包含两个部分 ...
- Docker镜像原理
⒈是什么? 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量以及配置文件等. 引用 UnionFs( ...
- Docker镜像原理和最佳实践
https://yq.aliyun.com/articles/68477 https://yq.aliyun.com/articles/57126 DockerCon 2016 深度解读: Dock ...
- Docker基础修炼2--Docker镜像原理及常用命令
通过前文的讲解对Docker有了基本认识之后,我们开始进入实战操作,本文先演示Docker三要素之镜像原理和相关命令. 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境,如果你本地没有 ...
- Docker 学习3 Docker镜像管理基础
一.docker 常用操作及原理 1.docker 常用操作 2.docker 机制 1.docker client端是通过http或者https与server端通信的.个 2.docker 镜像可以 ...
- 004.Docker镜像管理
一 镜像基本操作 镜像是一个包含程序运行必要依赖环境和代码的只读文件,其本质是磁盘上一系列文件的集合.它采用分层的文件系统,将每一次改变以读写层的形式增加到原来的只读文件上.镜像是容器运行的基石. 1 ...
- docker运行原理与使用总结
docker运行原理概述 Client-Server架构 docker守护进程运行在宿主机上systemctl start docker daemon进程通过socket从客户端(docker命令)接 ...
- Docker镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的? 每个镜像都由很多层次构成,Docker 使用 Union FS 将这些不同的层结合到一个镜像中去. 通常 Union FS 有两个用途, 一方面可以实 ...
- docker 10 docker的镜像原理
镜像是什么? 镜像是一个轻量级,可执行的软件包,用来打包运行环境和基于运行环境开发的软件包,它包含某个软件运行环境的所有内容.包括代码,运行时的库,配置文件和环境变量 UnionFs(联合文件系统) ...
- docker学习笔记-03:docker的镜像原理
镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件.它包含运行某个环境所需的所有内容,包括代码.库.环境变量和配置文件. 一.镜像是什么 (一).联合文件系统(Unio ...
随机推荐
- vue学习笔记:Vue生命周期
概念 一个Vue 实例从开始创建.初始化数据.编译模板.挂载 DOM.渲染→更新→渲染.卸载等一系列过程,这就是 Vue 的生命周期.同时在这个过程中也会运行一些叫做生命周期钩子的函数,这给了用户在不 ...
- 2.2 在resources目录下,新建applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans> <!-- 这个bean标签的作用是, ...
- Gitlab CICD
简介 最近公司要求要通过Gitlab CICD做一个项目的自动打包,我之前也没接触过,所以只能现学现卖.不过说实话,让我这个连大学英语四级都没过的人看Gitlab官网的纯英文教程,我真的是脑阔昏,于是 ...
- vue3 使用clodop打印插件实现不预览直接打印
一.下载安装C-LODOP https://www.lodop.net/download.html 解压文件后点击exe程序,启用服务 将上述的 LodopFuncs.js 文件放到工程某个文件下 二 ...
- Fiddler自动响应
自动响应 自带了几个自动响应的规则: regex:(?inx).+.jpg$ # 以jpg结尾 这里写的是正则表达式,所以如果要拦截其他格式只需要改请求文件的后缀名即可. regex:(?inx).+ ...
- 支持批量图片转文字的【OCR】文字识别工具,支持截图识别,速度快,准确度高,免费OCR,开源软件
想必大家偶尔也有需要从图片中提取文字的需求,虽然现在手机上都自带了拍照识别功能,可是从电脑上的图片传到手机识别再将结果发回来实 在是有点麻烦,尤其当图片数量较多时,更是费时费力,使用网页版工具又要面临 ...
- git 修改commit 备注
1.没有push 1.修改最后一次的提交备注 git commit --amend 输入 i 进行编辑模式,修改好以后 esc 退出编辑模式 :wq 保存并退出. 2.修改之前的备注 git reba ...
- 初学银河麒麟linux笔记 第五章 windows中开发的QT程序适配linux的修改——外部控件重新调用
本人在WINDOWS系统中使用了"飞扬青云"的控件 https://gitee.com/feiyangqingyun/QUCSDK 由于系统移植,调用库应改为linux系统,首先下 ...
- Ubuntu子系统shell脚本自动连接xfce4界面
脚本功能 命令行参数指定ip连接/获取ifconfig中的本地ip连接 修改.bashrc #!/bin/bash net_dev="wifi0" #默认的设备名 FALSE=&q ...
- Java-net
Java网络编程 相关概念: IP地址 端口 socket 理论 TCP 区分服务端和客户端 服务端: (1)创建ServerSocket对象,传入监听的端口号 (2)等待客户端的连接,调用accep ...