Docker run 运行原理:
- 例:docker run tomcat
-
简单描述:
- 首先会从本地获取 Tomcat 的镜像文件,如果本地没有该镜像则会去阿里云仓库创建查找该镜像文件
- 如果阿里云仓库也没有改镜像文件,则会报错找不到镜像文件
- 如果有镜像文件,获取到镜像文件后直接运行
-
详细描述:
- docker 在本机缓存中查找 Tomcat 镜像文件,如果本地存在该镜像文件,则该镜像文件作为模板在容器中运行
- 如果本地缓存中没有 Tomcat 镜像文件,则会从 docker 或者加速镜像中查找,如果查找不到的话,则返回错误查找不到该镜像
- 如果能查找到该镜像,则以该镜像文件作为模板运行
![](https://i-blog.csdnimg.cn/direct/cec88ee6cb274bb59d34383f3af51f28.png)
Docker 镜像原理:
-
镜像:
- 镜像是一种轻量级、可执行的独立软件包,用来打包运行环境和基于环境的开发软件,它包含运行某个软件所需的内容,包括代码,运行时:库、环境变量和配置文件
- 镜像文件的组成通过 Union fs
- 运行我们的 Tomcat 镜像文件
-
Tomcat 镜像文件:
- 依赖与 JDK 和 Linux 服务器
- Tomcat 镜像文件包含 JDK 依赖镜像
- 底层 dockerfile :描述配置 JDK 环境
镜像加载的原理:
-
Linux 文件系统由 bootfs 和 rootfs 两部分组成
- bootfs:包含 bootloader(引导加载程序) 和 kernel(内核)
- rootfs:root 文件系统,包含的就是典型 Linux 系统中的 /dev,/proc,/etc 等标准目录和文件
- 不同的 Linux 发行版,bootfs 基本一样,而 rootfs 不同,如 ubuntu,centos 等
-
Docker 镜像底层实际上有很多个不同的联合文件系统组成的
- 最底层:bootf,并使用宿主机的 bootfs(复用)
- 第二层:root 文件系统 rootfs,成为 base image
- 第三层:Union fs
- 在网上就可以叠加其他镜像的文件
-
统一文件系统(Union File System):
- 能够将不同层整合成一个文件系统,这些层提供了一个统一的视角,隐藏多层的存在,我们看来只是存在一个文件系统
- 所以当我们安装的 Tomcat 镜像文件大小是 600 多MB,是因为里面还包含了 JDK 和 CentOS 的镜像。而 CentOS 镜像复用了宿主机的 bootfs,下载的只有 rootfs,所以文件就会小很多
![](https://i-blog.csdnimg.cn/direct/a087fef78493489db8f079594684d318.png)
- 所以 Tomcat > JDK > CentOS ,整个文件向外暴露就是 600+ MB
-
镜像只读:
- 当从一个镜像启动容器时,Docker 会在镜像上面加载一个可读可写的文件系统作为容器运行
Docker Commit:
-
主要作用:
- 根据当前容器制作为镜像文件
-
流程:
- 下载镜像文件,如:docker commit tomcat8.0
- 运行 tomcat8.0 镜像文件,进入容器中
- 在 tomcat webapps 目录中新增 boyatop 文件夹,创建文件 index.html
- 书写内容:echo "boyatop" >> index.html
- 将当前容器内容根据模板制作为镜像文件
- docker commit 提交容器副本使之成为一个新的镜像
- 命令:docker commit -m "提交的描述信息" -a "作者" 容器 ID 要创建的目标镜像:标签名
Docker 数据卷:
-
基本概念:
- 数据卷就是宿主机上的一个文件或目录
- 当容器目录和数据卷(宿主机) 目录绑定,双发修改会立即同步操作
- 一个数据卷可以被多个容器同时挂载
- 数据卷作用:容器数据的持久化,外部机器和容器间通信,容器之间数据交换使用 -v 命令
-
数据卷添加的方式:
- 容器内与宿主机实现数据的共享
- 方式一:
- 直接命令形式添加:docker run -it -v 宿主机绝对路径目录:容器内目录 镜像文件名
- 方式二:Dockerfile 方式添加
-
volumes-from:
- 容器间传递共享数据