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
    image
# 利用多次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,需要安装各种软件环境去运行项目,如果你直接安装在宿主机上,那受限于宿主机的环境。

image

  • 有哪些限制?
    • 环境不兼容,比如软件系统不兼容,你安装的Windows,软件需要linux运行
    • 会将你当前系统的环境搞的一团糟
    • 不如你要卸载这些工具。。很麻烦。
docker解决这些问题,还是Windows系统

image

  • 解决了环境不兼容问题,在容器中运行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镜像原理示意图

image

既然docker是分层的那我们得到的镜像文件为什么又是一整个?
  • docker通过联合文件系统(union file system),将上图中每一层,整合为一个文件系统,为用户隐藏了多层视角。
上述总结
  1. 当通过一个image启动容器时,docker会在该image最顶层,为我们添加一个读写文件系统作为容器,然后运行该容器。
  2. docker镜像本质是基于union file System管理的分层文件系统。
  3. docker镜像为什么小?
    • 因为docker镜像只有rootfs(发行版)和其他镜像层,共用宿主机的内核,因此很小
  4. 为什么下载一个docker的nginx镜像,要比正常nginx装包大那么多?
    • 因为docker的nginx是分层的,nginx是的安装包就几M,但是一个用于运行nginx的镜像文件,依赖于父镜像(上一层)和基础镜像(发行版),所以下载的nginx镜像才会比正常安装包大

所有博客仅用于自己学习记录,如有侵权请联系删除,文章来源于公开视频资料,如有需要请移步这里:

https://www.bilibili.com/video/BV1o14y1w7b8?p=12&vd_source=6a0e07382af7c460c1a03694e4d4f4c7

posted on   辍学当码农  阅读(91)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示