Docker深度解析:运行原理

发布于:2025-02-10 ⋅ 阅读:(25) ⋅ 点赞:(0)

Docker run 运行原理:

  1. 例:docker run  tomcat
  2. 简单描述:
    1. 首先会从本地获取 Tomcat 的镜像文件,如果本地没有该镜像则会去阿里云仓库创建查找该镜像文件
    2. 如果阿里云仓库也没有改镜像文件,则会报错找不到镜像文件
    3. 如果有镜像文件,获取到镜像文件后直接运行
  3. 详细描述:
    1. docker 在本机缓存中查找 Tomcat 镜像文件,如果本地存在该镜像文件,则该镜像文件作为模板在容器中运行
    2. 如果本地缓存中没有 Tomcat 镜像文件,则会从 docker 或者加速镜像中查找,如果查找不到的话,则返回错误查找不到该镜像
    3. 如果能查找到该镜像,则以该镜像文件作为模板运行

Docker 镜像原理:

  1. 镜像:
    1. 镜像是一种轻量级、可执行的独立软件包,用来打包运行环境和基于环境的开发软件,它包含运行某个软件所需的内容,包括代码,运行时:库、环境变量和配置文件
    2. 镜像文件的组成通过 Union fs
    3. 运行我们的 Tomcat 镜像文件
  2. Tomcat 镜像文件:
    1. 依赖与 JDK 和 Linux 服务器
    2. Tomcat 镜像文件包含 JDK 依赖镜像
    3. 底层 dockerfile :描述配置 JDK 环境

镜像加载的原理:

  1. Linux 文件系统由 bootfs 和 rootfs 两部分组成
    1. bootfs:包含 bootloader(引导加载程序) 和 kernel(内核)
    2. rootfs:root 文件系统,包含的就是典型 Linux 系统中的 /dev,/proc,/etc 等标准目录和文件
    3. 不同的 Linux 发行版,bootfs 基本一样,而 rootfs 不同,如 ubuntu,centos 等
  2. Docker 镜像底层实际上有很多个不同的联合文件系统组成的
    1. 最底层:bootf,并使用宿主机的 bootfs(复用)
    2. 第二层:root 文件系统 rootfs,成为 base image
    3. 第三层:Union fs
    4. 在网上就可以叠加其他镜像的文件
  3. 统一文件系统(Union File System):
    1. 能够将不同层整合成一个文件系统,这些层提供了一个统一的视角,隐藏多层的存在,我们看来只是存在一个文件系统
    2. 所以当我们安装的 Tomcat 镜像文件大小是 600 多MB,是因为里面还包含了 JDK 和 CentOS 的镜像。而 CentOS 镜像复用了宿主机的 bootfs,下载的只有 rootfs,所以文件就会小很多
    3. 所以 Tomcat > JDK > CentOS ,整个文件向外暴露就是 600+ MB
  4. 镜像只读:
    1. 当从一个镜像启动容器时,Docker 会在镜像上面加载一个可读可写的文件系统作为容器运行

Docker Commit:

  1. 主要作用:
    1. 根据当前容器制作为镜像文件
  2. 流程:
    1. 下载镜像文件,如:docker commit tomcat8.0
    2. 运行 tomcat8.0 镜像文件,进入容器中
    3. 在 tomcat webapps 目录中新增 boyatop 文件夹,创建文件 index.html
    4. 书写内容:echo "boyatop" >> index.html
    5. 将当前容器内容根据模板制作为镜像文件
    6. docker commit 提交容器副本使之成为一个新的镜像
    7. 命令:docker  commit -m  "提交的描述信息" -a "作者"  容器 ID  要创建的目标镜像:标签名

Docker 数据卷:

  1. 基本概念:
    1. 数据卷就是宿主机上的一个文件或目录
    2. 当容器目录和数据卷(宿主机) 目录绑定,双发修改会立即同步操作
    3. 一个数据卷可以被多个容器同时挂载
    4. 数据卷作用:容器数据的持久化,外部机器和容器间通信,容器之间数据交换使用  -v  命令
  2. 数据卷添加的方式:
    1. 容器内与宿主机实现数据的共享
    2. 方式一:
      1. 直接命令形式添加:docker  run -it -v 宿主机绝对路径目录:容器内目录  镜像文件名
    3. 方式二:Dockerfile 方式添加
  3. volumes-from:
    1. 容器间传递共享数据