docker文件系统原理 docker的文件系统_centos

  • 是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下
  • Union文件系统是Docker镜像的基础。镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:

  • 一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各个文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录

Docker镜像加载原理

docker的镜像实际上是由一层一层的文件系统组成,这种层次就是文件系统UnionFS。

  • **bootfs(boot file system)**主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在整个Docker镜像的最底层时引导文件系统bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
  • rooffs(roog file system),在bootfs之上。包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,CentOS等。
  • 对于一个精简的OS,rooffs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

为什么Docker要采用这种分层结构?

  • 镜像分层的最大好处就是共享资源,方便复制迁移,就是为了复用
  • 比如说有多个镜像都从相同的base镜像构建而来,那么Docker Host 只需在磁盘上保存一份base镜像;同时内存中也只需要加载一份base镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享
  • Docker的镜像层都是只读的,容器层是可写的
  • 当容器启动时,一个新的可写层被加载到镜像的顶部。
  • 这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”
  • docker文件系统原理 docker的文件系统_容器_02

Docker操作案例

docker commit提交容器副本使之成为一个新的镜像

docker commit -m=“提交的描述信息” -a=“作者” 容器ID要创建的目标镜像名:[标签名]

案例操作详细步骤

  • 从Hub上下载ubuntu镜像到本地并成功运行
  • 原始的默认ubuntu镜像是不具备vim命令功能的
  • 外网连通的情况下,安装vim
  • 在docker容器中运行下述两条命令
  • apt-get update : 更新指令库
  • apt-get -y install vim :下载vim指令
  • 测试指令是否安装成功
  • commit到新镜像
  • 启动新镜像,和原来的镜像对比

私服库的推送与拉取

将本地镜像推送到私服库步骤
  • 从远程仓库上拉取本地私服库镜像
  • docker pull registry
  • 使用docker images命令查看已拉取到本地镜像
  • 运行registry私服库 镜像
  • docker run -id --name=myregistries -p 5000:5000 registry
  • 使用crul命令验证此时私服库上有什么镜像文件
  • curl -XGET http://10.0.24.14:5000/v2/_catalog
  • docker文件系统原理 docker的文件系统_centos_03


  • 可以看到,私服库上目前还没有上传任何镜像文件
  • 将自己的镜像名修改为符合私服库规范的镜像名
  • docker tar 镜像:TAG HOST:PORT/repository:TAG
  • 修改配置文件,让阿里云支持http【docker默认不允许使用http来推送镜像,我们可以通过修改配置文件来开启使用http推送镜像
  • vim /ect/docker/daemon.json,添加以下代码,【注意:因为是json格式,如果有内容,应该在上一行加上’,'】
  • "insecure-registries":["10.0.24.14:5000"
  • 修改配置文件后,建议重启docker
  • systemctl restart docker
  • 推送本地镜像到私服库
  • docker push 10.0.24.14:5000/myubuntu:0.0.1
  • 第二次验证私服库,本地镜像是否推送成功?
  • curl -XGET http://10.0.24.14:5000/v2/_catalog
  • 本地镜像成功上传到私服库
从本地私服库拉取镜像步骤
  • 从私服库上拉取镜像:
  • docker pull 10.0.24.14:5000/myubuntu:0.0.1
  • 运行本地镜像:
  • docker run -id HOST:PORT/repository/TAG

小结

  • Docker中的镜像分层,支持通过扩展现有镜像,创建新的镜像。类似Java继承了一个Base基类,需要扩展,直接在子类上增加新的属性和方法即可
  • 新镜像是从base镜像一层一层叠加生成的。每安装一个软件,就在现有镜像的基础上增加一层。