docker 容器运行的数据在哪里(docker容器的几种存储详解)
docker 容器运行的数据在哪里
docker容器的几种存储详解目录
- 写在前面
- 几种存储挂载方式
- 1.bind mounts
- 2.volumes
- 3.tmpfs mount
- 存储数据共享
我们在上篇学习了容器网络,对容器网络驱动bridge工作原理做了较为详细的介绍,今天小作文一起看看容器中另一个关键域-存储。
容器的存储可以分为两大类:
一种是与镜像相关的即我们在《docker容器技术基础之联合文件系统OverlayFS》一文提到的容器层Copy-On-Write特性。默认情况下,在容器内创建的所有文件都存储在可写容器层上,这种直接将文件存储在容器层的方式数据难以持久化和共享,由于依赖存储驱动与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。
另一中是宿主机存储即通过将宿主机目录绑定或挂在到容器中使用,容器停止后数据也能持久化。小作文主要介绍后者。
几种存储挂载方式这里我们根据数据存储在 Docker 主机上的不同位置绘制如下图:
1.bind mounts
绑定挂载与卷相比,功能有限。使用绑定挂载时,主机上的文件或目录会挂载到容器中。文件或目录由其在主机上的完整路径引用。目录不需要已经存在于 Docker 主机上,如果不存在,docker会帮我们创建。 注意一下,只能自动创建目录哦。
我们通过 -v 选项绑定挂载一个目录 /nginx/html 到容器中看看
docker run -dt -v /nginx/html:/usr/share/nginx/html --name nginx nginx
通过docker inspect nginx 查看容器 Mounts字段
"Mounts": [ { "Type": "bind", "Source": "/nginx/html", "Destination": "/usr/share/nginx/html", "Mode": "", "RW": true, "Propagation": "rprivate" } ],
接着我们在docker主机上创建一个index.html并写入hello nginx,然后访问容器IP,显然我们的挂载已经生效了。
[root@localhost ~]# echo "hello nginx" > /nginx/html/index.html [root@localhost ~]# curl 172.17.0.4 hello nginx
这里有一个问题,我们可以通过docker主机修改文件使容器内文件生效,反过来也一样,容器可以修改、创建和删除主机文件系统上的内容。处理这个问题我们可以在创建容器的时候配置挂载目录的权限,比如下面的只读权限:
docker run -dt -v /nginx/html:/usr/share/nginx/html:ro --name nginx nginx
所以在我们使用绑定挂载的时候,你操作的是主机文件系统,你必须清楚如下:
- 你挂载的目录包含哪些内容,以免对其他应用造成影响。
- 你的容器是否应该有权操作这些目录。
2.volumes
volume存储卷由 Docker 创建和管理,我们可以使用该docker volume create命令显式的创建卷,或者在容器创建时创建卷。
[root@localhost ~]# docker volume create nginx_volume nginx_volume [root@localhost volumes]# docker inspect nginx_volume [ { "CreatedAt": "2021-08-12T01:58:04-04:00", "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/nginx_volume/_data", "Name": "nginx_volume", "Options": {}, "Scope": "local" } ]
可以看到挂载点处于docker的根目录/var/lib/docker/volumes下
通过docker volume rm/prune 清除单个或所有未再使用的卷,可以通过docker 命令来管理卷是对比绑定挂载的一个优势。
[root@localhost ~]# docker volume ls DRIVER VOLUME NAME local owncloud-docker-server_files local owncloud-docker-server_mysql local owncloud-docker-server_redis [root@localhost ~]# docker volume prune WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: owncloud-docker-server_files owncloud-docker-server_mysql owncloud-docker-server_redis Total reclaimed space: 199.4MB
在创建容器时如果未指定容器挂载的源则docker会自动为我们创建一个匿名卷,同样位于docker根目录下。
[root@localhost volumes]# docker run -dt -v /usr/share/nginx/html --name nginx_with_volume nginx d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6 [root@localhost volumes]# docker volume ls DRIVER VOLUME NAME local d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 local nginx_volume [root@localhost volumes]# ls /var/lib/docker/volumes/ backingFsBlockDev d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980 metadata.db nginx_volume
当我们创建挂载卷之后,此时的存储与bind mounts是一致,不过当 docker 主机不能保证具有给定的目录或文件结构时,卷可帮助我们将 docker 主机的配置与容器运行时分离。这样一来当我们需要将数据从一台 Docker 主机备份、还原或迁移到另一台时,卷就很方便了,可以脱离host path的限制。
在使用绑定挂载和卷时我们要注意下面传播覆盖原则:
挂载一个空卷时:容器内目录的内容会传播(复制)到卷中。
绑定挂载或非空卷时:容器内目录的内容会被卷或绑定的主机目录覆盖。
3.tmpfs mounttmpfs挂载仅适用于linux主机,当我们使用tmpfs挂载创建容器时,容器可以在容器的可写层之外创建文件。将数据保留在内存中,当容器停止时,写入的数据也将被移除。主要用于临时存储不想保留在主机或容器可写层中的敏感文件。
通过--tmpfs选项挂载一个内存块。
docker run -dt --name busybox_tmpfs --tmpfs /etc/running busybox
通过--mount的方式带上参数,指定临时存储大小。
docker run -dt --name busybox_tmpfs2 --mount type=tmpfs,tmpfs-size=2048,destination=/etc/running busybox
在容器之间共享数据主要有两种方法,第一种比较简单,只需要将目录或者volume挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。
我们创建一个中间容器,包含绑定挂载目录和一个卷。
docker create -v /share:/volume1 -v /volume2 --name volume_share busybox
在我们需要共享的容器中通过选项--volumes-from拿过来用即可
docker run -d -t --volumes-from volume_share --name container1 busybox
我们inspect检查一下Mounts字段,此时container1已经挂载到了一个bind目录和一个volume
"Mounts": [ { "Type": "bind", "Source": "/share", "Destination": "/volume1", "Mode": "", "RW": true, "Propagation": "rprivate" }, { "Type": "volume", "Name": "21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e", "Source": "/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data", "Destination": "/volume2", "Driver": "local", "Mode": "", "RW": true, "Propagation": "" } ],
关于docker容器存储我们先学习到这,希望这篇小作文在你需要时对你有点用。
到此这篇关于docker容器的几种存储详解的文章就介绍到这了,更多相关docker容器存储内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- docker镜像配置的挂载路径(解决docker挂载的目录无法读写问题)
- docker容器根据进程号查看端口(Docker 通过端口来连接一个容器的实现)
- springboot docker 部署(详解docker部署SpringBoot及替换jar包的方法)
- docker容器分配(Docker容器数据卷原理及使用方法解析)
- docker 启动rabbitmq(docker安装rabbitmq无法进入管理页面的问题)
- dockerfile映射目录(Dockerfile中ENTRYPOINT 和 CMD的区别说明)
- docker 搭建gitlab(使用Docker搭建私有GitLab的两种方案)
- docker怎么增加端口(docker 添加端口及获取dockerfile的方法)
- docker里面安装redis(Docker上实现Redis集群搭建)
- docker搭建mysql服务(Docker部署Mysql集群的实现)
- dockerfile镜像案例(Dockerfile构建自定义镜像的实现)
- 无法访问docker容器内的端口(docker端口映射及外部无法访问问题)
- docker构建本地镜像(Docker创建本地镜像实现方法解析)
- docker重新加载nginx(Docker Nginx Log 三者的处理详解)
- 在windows安装docker详细步骤(Docker 部署 Prometheus的安装详细教程)
- docker部署mysql多实例(Docker部署mysql一主一从的操作方法)
- 八一节,说说中国女兵(八一节说说中国女兵)
- 王治郅菜鸟赛季已让八一带入正轨,大郅七大经典语录或是成功秘诀(王治郅菜鸟赛季已让八一带入正轨)
- 庆八一,重读经典红色语录,感悟互联网发展硬道理(重读经典红色语录)
- TVB新剧《黯夜守护者》将播,陈展鹏陈炜首次合作探讨人性(TVB新剧黯夜守护者将播)
- 新晋小花被称女版吴卓羲 将取代滕丽名成为TVB新一代御用女警(新晋小花被称女版吴卓羲)
- 艺人吴卓羲10年警察生涯,演足10年阿Sir,系咩玩法(艺人吴卓羲10年警察生涯)
热门推荐
- python将网站图片本地存储(详解Python下载图片并保存本地的两种方式)
- html5canvas曲线图例子(html5利用canvas实现颜色容差抠图功能)
- sqlserver如何设置定时备份(SQL Server使用脚本实现自动备份的思路详解)
- 织梦dedecms开启付费授权(修改织梦DedeCMS广告模块后,前台显示未更新的解决方法)
- sql server存储过程详解(SQL Server存储过程中编写事务处理的方法小结)
- nginx反向代理spring boot(Nginx+SpringBoot实现负载均衡的示例)
- 百度免费翻译接口(基于python实现百度翻译功能)
- python图像变换教程(详解python-图像处理映射变换)
- vue界面自动生成(Vue中实现3D标签云的详细代码)
- html5入门布局(吃透移动端 Html5 响应式布局)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9