Docker 镜像是以 layer 概念存在的,一层一层的叠加,最终成为我们需要的镜像。但该镜像的每一层都是 ReadOnly 只读的,只有在我们运行容器的时候才会创建读写层。

文件系统隔离的缺点:

  • 容器不再运行时,数据将不会持续存在,数据很难从容器中取出。
  • 无法在不同主机之间很好的进行数据迁移。
  • 数据写入容器的读写层需要内核提供联合文件系统,这会额外的降低性能。

Docker提供三种方式将数据从宿主机挂载到容器中:

  • volume:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes),保存数据的最佳方式。
  • bind mount:将宿主机上的任意位置的文件或者目录挂载到容器中。
  • tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用 tmpfs,同时避免写入容器可写层提高性能。
Volume:
管理卷: 
# docker volume create nginx-vol
# docker volume ls
# docker volume inspect nginx-vol

使用案例: 
格式一:
# docker run -d --name=nginx-test --mount src=nginx-vol,dst=/etc/nginx/html nginx
格式二:
# docker run -d --name=nginx-test -v nginx-vol:/etc/nginx/html nginx

清理:
# docker stop nginx-test 
# docker rm nginx-test
# docker volume rm nginx-vol 

注意:
1. 如果没有指定卷,则自动创建。
2. 建议使用--mount,更通用。 
Bind mount:
使用案例:
格式一:
# docker run -d -it --name=nginx-test --mount type=bind,src=/var/www,dst=/etc/nginx/html nginx
格式二:
# docker run -d -it --name=nginx-test -v /var/www:/etc/nginx/html nginx

验证绑定:
# docker inspect nginx-test

清理:
# docker stop nginx-test
# docker rm nginx-test

注意:
1. 如果源文件/var/www目录不存在,不会自动创建,会抛出一个错误。
2. 如果挂载目标在容器中非空目录,则容器中该目录已有内容将被隐藏。
Tmpfs
使用案例:
格式一:
# docker run -d -it --name nginx-test --mount type=tmpfs,dst=/var/www nginx
格式二:
# docker run -d -it --name nginx-test --tmpfs /var/www nginx

验证绑定:
# docker inspect nginx-test

清理:
# docker stop nginx-test
# docker rm nginx-test

注意:
1、tmpfs挂载不能在容器间共享。
2、tmpfs只能在 Linux 容器上工作,不能在 windows 容器上工作。
小结:
Volume特点:
• 多个运行容器之间共享数据。
• 当容器停止或被移除时,该卷依然存在。
• 多个容器可以同时挂载相同的卷。
• 当明确删除卷时,卷才会被删除。
• 将容器的数据存储在远程主机或其他存储上
• 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind mount特点:
• 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
• 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机
上构建Maven项目时,容器都可以访问构建的项目包。
• 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时。




发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注