Union FS【联合文件系统】

  • 一种分层、轻量级高性能的文件系统,支持对文件系统的修改作为一次提交来一层层的叠加。Union文件系统是Docker镜像的基础,镜像可以通过分层来继承,基于基础镜像可以制作各种具体的应用镜像
  • 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来

Docker镜像的最底层是引导文件系统bootfs,以此为基础添加扩展
Docker镜像层都是只读的,容器层是可写的,镜像的每一层都可以被共享。当容器启动时,一个新的可写层被加载到镜像的顶部【通常被称作容器层】,所有对容器的改动都只发生在容器层,不会改变底下的镜像

Docker镜像commit操作

docker commit提交容器副本使之成为一个新的镜像:docker commit -m=“提交的描述信息” -a=“作者” 容器ID 要创建的目标镜像名:[标签名]

将本地镜像推送到私有库

  1. 下载镜像Docker Registry
  2. 运行私有库Registry,相当于本地私有Docker hub
  3. 创建新镜像
  4. curl验证私服库上有什么镜像-curl - XGET
  5. 修改符合私服规范的Tag:docker tag 镜像:Tag Host:Port/Repository:Tag【host主机IP地址】
  6. 修改配置文件使其支持http-cat /etc/docker/daemon.json 加上"insecure-registries": [“Host:Port”]告诉本机端口是安全的
  7. push推送到私服库-docker push Host:Port/Repository:Tag
  8. curl验证私服库上有什么镜像
  9. pull到本地并运行-docker pull Host:Port/Repository:Tag

Docker挂载主机目录访问如果出现cannot open directory ‘.’: Permission denied
解决办法:在挂载目录后加–privileged=true参数,扩大容器权限,使container内的root拥有真正的root权限,否则,container内的root知识外部的一个普通用户权限

docker run -d -p 5000:5000 -v / rootdirectory: /tmp/registry --privileged=true registry
默认情况下,仓库被创建在容器的/var/lib/registry目录下,建议自行用容器卷映射,方便于宿主机联调
-v:要添加自定义的容器卷 宿主机的路径:容器内路径

容器卷

类似Redis里的rdb和aof文件,将docker容器内的数据保存进宿主机的磁盘中
卷就是目录/文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供的一些用于持续存储或共享数据的特性。卷的设计目的就是数据持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷【否则容器实例删除后,其数据也被删除了】

特点:
  • 数据卷可在容器之间共享或重用数据
  • 卷中的更改可以直接实时生效
  • 数据卷中的更改不会包含在镜像的更新中
  • 数据卷的生命周期一直持续到没有容器使用它为止

容器卷之间的继承

宿主vs容器之间映射添加容器卷-docker run -it – privileged=true -v /宿主机绝对路径目录:/容器内目录
–name=镜像名 镜像【可挂多个容器卷】
卷的继承与共享:

  • 容器2继承容器1的卷规则:docker run -it privileged=true – volumes- from 父类名 --name 子类名 镜像名
  • 父类容器挂了,子类容器卷数据不受影响【容器卷独立于容器的生命周期】

mysql运行时记得挂容器卷:docker run -d -p 3306:3306 --privileged=true -v /宿主机绝对路径:/容器内绝对路径 -e MYSQL_ROOT_PASSWORD=123456 --name mysql mysql