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 ...
随机推荐
- http协议与tcp协议的理解
1.区别 tcp协议是对应于传输层,http协议是对应于应用层,从本质上来说,二者是没有可比性的.http协议是建立在tcp协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发送一次http请 ...
- Open vSwitch虚拟交换机实践
实验2:Open vSwitch虚拟交换机实践 (一)基本要求 1.ovs-vsctl基础操作实践: 创建OVS交换机,完成相关要求后查看网络状态与端口信息: 2.使用Mininet搭建的SDN拓扑, ...
- css实现水波纹
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情 ui设计的元素有时候需要有一些动画效果,可以直接用css动画来实现. 实现一个中心圆向四周有水波纹的效果 ...
- 你到底懂不懂JavaScript?来做做这12道面试题试试!
携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 21 天,点击查看活动详情 JavaScript 是每一个前端开发者都应该掌握的基础技术,但是很多时候,你可能并不完全懂 Jav ...
- docker指令 —— MySQL一条龙服务
一.拉取MySQL镜像 简单粗暴拉取: docker pull mysql 拉取合适的版本,docker mysql Tag: # 例如拉取8.0.25 docker pull mysql:8.0.2 ...
- elementUI合并单元格
<el-table :data="tableDataFormat" border :header-cell-style="{background:'#FAFAFA' ...
- GPS北斗卫星时钟同步系统提升电信支撑网性能
GPS北斗卫星时钟同步系统提升电信支撑网性能 京准科技提供参考--更多资料VX(ahjzsz) 各项新的数据业务,如电子商务.多媒体通信.IP电话等都是电信业务发展的新增长点,而传统业务也存在多家企业 ...
- flink 1.10.0源码编译
1.安装git yum -y install git 2.安装maven 安装了3.3以下低版本的maven会有提示升级,这里安装3.6.3 wget https://mirrors.tuna.tsi ...
- pkill 直接对进程对名字进行操作,可以同时杀死多个进程。
Linux pkill 命令 Linux 命令大全 Linux pkill 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程,类似于 killall 命令. kill 命令杀死指定 ...
- (0617 ) centos7运行脚本提示: 没有那个文件或目录 :No such file or directory
https://blog.csdn.net/hehuihh/article/details/88174007 之前也 遇到: https://www.cnblogs.com/fancy2333/p/1 ...