Docker 的需知概念
学习一门技术,不仅仅只是会用,还需要理解为什么要这样,这也是我为什么写这篇笔记的原因-
为什么用docker
没有用docker 之前,可能有一种情况似曾相识,当上线时,突然间发现开发者机上面的可以运行的包 打包上去,运行不起来,常常因为环境的不对成 导致通宵,这是很难受的事。
我们可能要搭建集群,比如mysql,redis ,各种中间件,每部署到一台机上面 都要重复来一次,尤其当你打开linux 系统 ,发现安装包都没有,你需要安装jdk ,需要安装各种软件,到了另外一台机又要重复执行一次,哪怕传统可以保存一个快照,镜像复制,但是多多少少不好管理。
公司经费紧张,在一台服务器塞满了很多进程,可能一个进程出错,整台服务器重启,这对生产环境影响很大,还有每个服务峰值使用量过大,导致服务挂了,要么就jvm 设置比较大,还有空余的内存没有好好压榨。
docker的优势就出来了,相对于vm,我在网上
docker是基本组成的呢?
- 镜像 (image):类似于模板,镜像可以用来创建容器,同样的镜像可以创建很多容器,就类似于类文件可以实例多个对象一样
- 容器(container):Docker 利用容器 独立运行一个或一组应用。容器是用镜像创建的运行实例。可能一个容器里面就有多个应用,每个容器都是互相隔离独立运行。
- 仓库(Repository):仓库是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),国内的公开仓库包括阿里云 、华为云等
docker 的架构图
docker run 的执行流程
UnionFS(联合文件系统)
说这个之前,我们看看镜像装着啥,可能装着应用和应用的基本环境,如果每个镜像都需要共用这些,可能导致镜像特别臃肿,所以如果我们能把共用的东西抽取出来,那么可以大大节约内存,加上镜像本身就是可复用的。
docker 解决了这个问题,UnionFS(联合文件系统)
Unionfs 是2004年在stony brook大学开始的,它是一个可叠放的联合文件系统,它能够联合多个目录(因此可称为分支)同时独立地保持它们的物理内容。它允许任何ro和rw分支的 结合,同时允许在分支中修改和删除不使用的分支。Unionfs可以使用在几个方面,例如联合在不同磁盘上的不同的文件系统到一个home目录,或者把几 张cd合并成一个统一的归档镜像。所以,具有复制可写功能的unionfs可以用来把ro和rw的文件系统合并起来,并且实现了允许修改只读文件系统并把 这些修改保存在可写文件系统。
大概意思就是 镜像中 还含有多个 分支的文件,镜像由这些分支的文件组装起来,这些每个文件都可以可读写,把这些文件合并起来就是镜像,当然镜像更新时 ,提交时也交给Unionfs 管理,只更新修改部分即可,类似git 的文件系统。
Docker镜像加载原理
dockers 镜像不只是 UnionFS ,找一张图来解释一下
通过查看 docker image 的发现,docker 镜像是分层 组成,套娃
**bootfs(boot file system):**主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。
**rootfs (root file system) :**在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。
在上面一层 属于应用层,也是我们最经常更新的层
Docker 容器的数据卷
docker 中 容器独立运行,一旦rm 就连同数据一起删除了,假如我们装了个mysql ,然后把数据库删了,真正意义做到了删库跑路了哈哈哈,这是不对的,所以dockers 对这种需要持久化保存的,或者容器与容器间需要共享的数据,比如我们有两个mysql 客户端希望通过操作一个 数据文件,当然这种方式不太好。我们应该怎么办?
能不能 把数据都存在 一个公共的地方,比如宿主机上面?
当然可以啦。挂在数据卷就好了,而且还能做到 同步
docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash
具名挂载 和 匿名挂载
什么意思呢 ,我们挂载的目录,docker 都称为卷,当我们 启动容器的时候,有设置 卷名时,我们可以快速找到挂载的路径。如果没有指定,docker 也帮我们保存到本地中,以一个匿名卷形式保存。
存放在 本地 /var/lib/docker 下
此外还有一种方式啊 就是上面这种宿主机和 容器内目录的挂载 # Docker 的需知概念
学习一门技术,不仅仅只是会用,还需要理解为什么要这样,这也是我为什么写这篇笔记的原因-