新增挂载目录

  1. #ln -s 不支持符号链接
  2. mount --bind /宿主目录 $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录

mount —bind命令说明: Linux将会把被挂载目录的目录项(也就是该目录文件的block,记录了下级目录的信息)屏蔽,在本例里就是 $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 的下级路径被隐藏起来了(注意,只是隐藏不是删除,数据都没有改变,只是访问不到了) mount命令执行时,VFS会创建一个vfsmount对象,这个对象里包含了整个文件系统所有的mount信息,其中也会包括本次mount中的信息,这个对象是一个HASH值对应表(HASH值通过对路径字符串的计算得来),表里就有 /宿主目录 到 $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 的HASH值对应关系 命令执行完后,当访问 / $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 下的文件时,系统会告知 $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 的目录项被屏蔽掉了,自动转到内存里找VFS,通过vfsmount了解到 $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 和 /宿主目录 的对应关系,从而读取到 /宿主目录 的inode,这样在 $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 下读到的全是 /宿主目录 目录下的文件 ———————————————— 参考链接:https://blog.csdn.net/shengxia1999/article/details/52060354 参考链接:https://blog.csdn.net/wuruixn/article/details/9619127

两个目录的对应关系存在于内存里,一旦重启挂载关系就不存在了 所以开机就重新挂载

  1. vim /etc/fstab

/宿主目录/ $(docker inspect -f {{.GraphDriver.Data.MergedDir}} ${containerid})/具体目录 none rw,bind 0 0

  1. ```
  2. <a name="Rdb8B"></a>
  3. ### 修改挂载目录
  4. 修改挂载目录配置文件
  5. ```bash
  6. systemctl stop docker.service #先停掉docker服务
  7. vim /var/lib/docker/containers/${containerid}/config.v2.json #输入/ 查到目标目录字符 修改
  8. vim /var/lib/docker/containers/${containerid}/hostconfig.json #同上
  9. systemctl start docker.service

commit成新镜像再运行

  1. docker commit ${containerid} new_image:tag
  2. docker run ... #新增或者修改挂载目录再运行新镜像

export再import成新镜像再运行

  1. docker ${containerid} export -o ./myimage.docker 容器ID
  2. docker import ./myimage.docker new_image
  3. docker run ... #新增或者修改挂载目录再运行新镜像

comit与import的区别

将docker import理解为将外部文件复制进来形成只有一层文件系统的镜像,而docker commit则是将当前的改动提交为一层文件系统,然后叠加到原有镜像之上。docker import丢失了历史信息得到的镜像文件要比docker commit得到的镜像文件要小。