应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

Docker存储Volume,Docker数据持久化。Docker目录

10212人阅读 2022/9/1 11:44 总访问:5182325 评论:0 收藏:0 手机
分类: docker


容器默认的数据读写操作在容器的存储层,当容器被删除时其上的数据将会丢失。所以我们应该尽量保证容器存储层不发生写操作,不然我们存储的数据很容易随着容器的删除而丢失,为了实现数据的持久化存储我们需要选择一种方案来保存数据。目前实现该方案的主要有Volumes 、 Bind mounts 、 tmpfs mounts,下面我们主要介绍Volumes与Bind mounts


volumes数据卷:
docker管理宿主机文件系统的一部分,通常存储在(/var/lib/docker/volumes)中,提供很多有用的特性:
1:数据卷可以在容器之间共享和重用,多个容器共享Volumes更安全
2:对数据卷的修改会立马生效
3:对数据卷的更新,不会影响镜像
4:数据卷默认会一直存在,即使容器被删除
5: Volumes更容易备份和移植。
6: 可以通过Docker CLI或API进行管理
7: Volumes可以无区别的工作中Windows和Linux下
8:当容器外的对应目录是空的,volume会先将容器内的内容拷贝到容器外目录,而mount会将外部的目录覆盖容器内部目录,内部的文件会被清空。相当于两种挂载方式处理文件是相反的,一种是把内部的复制到外部,一种是把外部的文件覆盖到内部
9:volume 是docker的宿主机文件系统一部分,只有docker可以进行更改,其他进程不能修改


bind mounts挂载主机目录:
将宿主机上的任意位置的文件或者目录挂在到容器 (—mount type=bind,src=源目录,dst=目标目录)
1:mount方式会将外部的目录覆盖容器内部目录,内部的文件会被清空。不管外部目录有没有文件内部目录的文件都会被清空,如果外部有文件就被外部的文件给复制出来。所以如果是把容器的内部的文件映射出来在外部使用,更推荐使用Volumes方式,但是如果镜像会经常更新,而以前持久化的数据存储在外边,如果使用Volumes方式新打包的镜像启动容器就会覆盖以前的内容,所以需要根据实际情况选择挂载方式。
2:bind mounts 是挂载在宿主机文件系统的任意位置,除了docker所有进程都可以进行修改
3:bind mount可以直接挂载文件,例如挂载nginx容器的配置文件:nginx.conf。
类似于配置文件这种单文件方式不太适合使用volume,可以使用bind mount,但由于config文件中包含一些类似于数据库密码等敏感信息,因此推荐使用tmpfs。

Volume管理

1) 使用命令创建一个Volume。如图6.5所示

  1. docker volume create my-nginx-volume


图6.5

2) 使用命令查看Volumes。如图6.6所示

  1. docker volume ls


图6.6

可以使用如下命令查看volume详情,如图6.7所示。

  1. |docker volume inspect my-nginx-volume|


图6.7


我们可以看到创建的my-nginx-volume 目录保存在/var/lib/docker/volumes/下,以后所有针对该 Volume 的写数据都会保存在目录/var/lib/docker/volumes/my-nginx-volume/_data中。

3) 删除一个指定名称的Volume。如图6.8所示

  1. docker volume rm my-nginx-volume


图6.8

删除后我们再次查看了一下Volume,可以看到刚刚创建的Volume已经被删除掉了

4) 删除所有未使用的 Volumes

我们可以先创建几个Volume,如图6.9所示。

  1. docker volume create my-volume-test-1
  2. docker volume create my-volume-test-2
  3. docker volume create my-volume-test-3


图6.9

查看一下刚刚创建的Volume,如图6.10所示。

  1. docker volume ls


图6.10

使用命令执行删除所有未使用的 Volumes,如图6.11所示。

  1. docker volume prune


图6.11


删除后我们再次查看了一下Volume,可以看到很多的Volume已经被删除掉了,只剩下两个,而且执行的时候会让你输入一个y或者n进行确定和取消,因为该命令可能会造成一些误删除,所以需要用户的确认。

挂载数据卷到容器目录

1) 运行容器时通过指定—mount 参数来使用 Volume

我们先创建一个Volume,如图6.12所示。

  1. docker volume create my-nginx-volume


图6.12

然后运行容器的时候通过指定—mount 参数来使用 Volume,如图6.13所示。

  1. docker run -d \
  2. --name=nginxtest \
  3. --mount source=my-nginx-volume,destination=/usr/share/nginx/html \
  4. nginx:latest


图6.13

source 指定 volume,destination 指定容器内的文件或文件夹。


挂载成功后,容器从 /usr/share/nginx/html 目录下读取或写入数据,实际上都是从宿主机的 my-nginx-volume 数据卷中读取或写入数据。因此 Volumes 或 Bind mounts 也可以看作是容器和宿主机共享文件的一种方式。

运行成功后可以查询一下刚刚启动的容器,如图6.14所示。


图6.14

2) 运行容器时通过指定 -v参数来使用 Volume

我们先创建一个Volume,如图6.15所示。

  1. docker volume create my-nginx-volume-2


图6.15

然后运行容器的时候通过指定—v 参数来使用 Volume,如图6.16所示。

  1. docker run -d \
  2. --name=nginxtest-2 \
  3. -v my-nginx-volume-2:/usr/share/nginx/html \
  4. nginx:latest


图6.16

-v 参数使用冒号分割 source 和 destination,冒号前半部分是 source,后半部分是 destination。

注意如果你挂载的数据卷不存在,Docker 会自动创建它,所以通常不需要手动去创建数据卷

如果容器中的待挂载的目录不是一个空目录,那么该目录下的文件会被复制到数据卷中。Bind mounts模式下,宿主机上的目录总会覆盖容器中的待挂载目录

-v 参数和 —mount 参数总的来说功能几乎一样,唯一的区别是在运行一个 service 时只能够使用—mount 参数来挂载数据卷。

3) 查看一下上面我们使用的数据卷,如图6.17所示

  1. docker volume ls


图6.17

通过如下命令查看volume详情,可以看volume使用的目录,如图6.18所示。

  1. docker volume inspect my-nginx-volume


图6.18

可以通过如下进入volume使用的目录查看文件,如图6.19所示。

  1. cd /var/lib/docker/volumes/my-nginx-volume/_data
  2. ls


图6.19

可以看到有个50x.html与index.html

查看一下index.html的内容,如图6.20所示。

  1. cat index.html


图6.20

可以看到就是nginx里边的起始页

4) 修改挂载目录内容,测试数据。

重新运行容器,指定一下端口,如图6.21所示。

  1. docker run -d \
  2. --name=nginxtest-3 \
  3. -p 9000:80 \
  4. -v my-nginx-volume-3:/usr/share/nginx/html \
  5. nginx:latest


图6.21

访问指定映射的9000端口,如图6.22所示。


图6.22

查看刚刚的挂载卷与对应的目录,如图6.23所示。


图6.23

进入volume使用的目录查看文件,如图6.24所示。

  1. cd /var/lib/docker/volumes/my-nginx-volume-3/_data
  2. ls


图6.24

使用vi命令修改index.html文件

  1. vi index.html

把提示语句修改一点即可,如图6.25所示。


图6.25

然后在访问数据已经变化了,如图6.26所示。证明我们的挂载已经成功了,因为我们并没有进入容器内部修改,而是通过在容器外部修改达到修改内部资源的效果。


图6.26

bind mounts挂载主机目录


这种挂载比较简单,可以挂载系统盘的任意可用目录,直接挂载就可以。如果挂载的目录不存在也会自动创建。

比如运行nginx的时候挂载目录html出来

  1. docker run -d \
  2. --name=mynginx \
  3. -p 8000:80 \
  4. -v ~/aj/nginx-html:/usr/share/nginx/html \
  5. nginx

又比如挂载.net6项目下面的wwwroot目录下个某个文件

  1. docker run --name=wy_jbland_api \
  2. -p 8003:8003 \
  3. -v ~/fb/wy_jbland_api_volumne_uploads:/app/wwwroot/uploads \
  4. wy_jbland_api:v1


注意:当容器外的对应目录是空的,mount会将外部的目录覆盖容器内部目录,也就是说内部目录的数据也会被清空。如果外部目录有文件,也被复制进去,而且内部原有的文件会被清空。相当于两种挂载方式处理文件是相反的,一种是把内部的复制到外部,一种是把外部的文件复制到内部,可以根据不同的需求选择不同的挂载方式。


mount方式会将外部的目录覆盖容器内部目录,内部的文件会被清空。不管外部目录有没有文件内部目录的文件都会被清空,如果外部有文件就被外部的文件给复制出来。所以如果是把容器的内部的文件映射出来在外部使用,更推荐使用Volumes方式,但是如果镜像会经常更新,而以前持久化的数据存储在外边,如果使用Volumes方式新打包的镜像启动容器就会覆盖以前的内容,所以需要根据实际情况选择挂载方式。

视频地址:
链接: https://pan.baidu.com/s/1Z8PoO9sHIx8pTPlZkTT0hA?pwd=26y6 提取码: 26y6 复制这段内容后打开百度网盘手机App,操作更方便哦


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

window7 Docker启动失败 error: Failed to create the VirtualBox object。VirtualBox com对象失败

docker启动失败 报错 error: Failed to create the VirtualBox object这个错是因为:virtuelbox 无法启动,所以启动之后会...

Docker启动报错 No default Boot2Docker ISO found locally downloading the latest

这是因为,启动时如果检测到没有 Boot2Docker,就会去下载,这个下载过程出现网络连接上的错误了,导致启动失败。可以去下...

Docker常用命令删除镜像命令进入容器、Docker重启命令等

1. docker version查看 Docker 版本信息2. docker info显示 Docker 系统信息,包括镜像,容器数等3. 运行容器第一次使用:d...

Docker 二次启动失败(本人这里使用的是hyper-v)

fatal: failed to start daemon: Error initializing network controller: Error creating default network: hnsCall faile...

Docker中Sware集群与service

swarm 总结:1,docker中使用swarm集群可以达到多任务分配到不同的节点进行处理,如果有空闲的docker机子将会把请求的处理...

.netCore 使用分布式缓存(Docker+redis)

1. 通过docker创建 Redis执行命令:dockerrun--nameasp-redis-p6379:6379-dredis查看redis状态:dockerps可以发现alreadywo...

.net Core3.0在Ubuntu 16.04上面的部署(Supervisor+nginx)(扩展Docker)

前 言Linux 随着Linux越来越流行,本人一个.net程序员也多次研究linux与.net的相关产品,以及中间件的使用方式。So今天给...

Docker 下载 mcr.microsoft.com/dotnet/core/sdk:3.1 老不行

请将其修改为:mcr.azk8s.cn/dotnet/core/sdk:3.1

Docker常用命令

Docker简单命令整理清单[TOC] Login 获取账户信息获取账户信息 docker info | sed '/Username:/!d;s/.* //' ...

windows安装Docker

win7、win8 等需要利用 docker toolbox 来安装,国内可以使用阿里云的镜像来下载,下载地址:http://mirrors.aliyun.com/do...

Linux 安装Web版Vscode(Docker+Local)

Linux 安装Web版Vscode(Docker+Local)[TOC] code-server 介绍 在任何地方的任何机器上运行VS代码,并在浏览器中访问它...

Docker运行 Elasticsearch Kibana和Cerebro

Docker运行 Elasticsearch Kibana和Cerebro[TOC] Demo 运行 Docker-compose,本地构建更高效的开发环境,更直观地了解 El...

Docker部署简单的mysql

Docker部署简单的mysql[TOC] 首先这玩意我是真不想写,网上写的太多了,但是又没有找到快速的创建方式。so…有疑问都可...

Unable to get the local Boot2Docker ISO version: Did not find prefix "-v" in version string

我已经从 github 上下载 v19.03.12 的镜像到 vps 然后拖回本地放在 C:\Users\Administrator.docker\machine\cache 下了。依...

Docker容器和镜像的区别

下面这两个比喻说得比较好 镜像就类似操作系统光盘介质,容器相当于通过光盘安装后的系统。通过光盘(镜像),我们能在不同...