Docker—容器数据卷

目录

1.什么是容器数据卷

2.数据卷的使用

3.实战MySQL同步数据

4.卷 常用命令

5.匿名挂载与具名挂载

5.1 匿名挂载

 5.2 具名挂载

6.数据卷容器


1.什么是容器数据卷

Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|

卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。


卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

Docker容器卷的工作就是将docker容器数据通过映射进行备份+持久化到本地的主机目录

2.数据卷的使用

方法一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器目录

 我们测试一下

 

 

Source:来源  Destination:目的地     挂载就是主机往容器挂的,源是主机,挂载就是将宿主机的一部分空间共享给容器一起用(因此数据卷也可以用来做扩容!!)宿主机和容器都可以数据共享

 即使容器被停止,在宿主机操作的挂载目录下的文件,容器内还是会映射去的。

注意:它们类似共享文件占用一块存储,不会存两份

  

 好处:我们以后修改只需要在本地修改即可,容器内会自动同步!

3.实战MySQL同步数据

在Linux下的MySQL默认的数据文档存储目录为/var/lib/mysql,默认的配置文件的位置/etc/mysql/conf.d,为了确保MySQL镜像或容器删除后,造成的数据丢失,下面建立数据卷保存MySQL的数据和文件。

docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

-d  后台运行

-p  端口映射

-v  卷挂载

-e  配置环境,设置了密码

--name 取名

 在本机用Navicat连接测试

在连接中新建了个数据库,在服务器中的文件夹下依然可以找到,挂载成功!

4.卷 常用命令

0.创建数据卷 (没什么用

docker volume create #VOLUME NAME

1.查看所有的数据卷

docker volume ls

2.查看指定数据卷的信息

docker volume inspect #VOLUME NAME

 3.删除数据卷 docker volume rm ...

docker volume rm #VOLUME NAME

 无法删除正在被使用的,容器存在的。

4.删除容器之时删除相关的卷 

docker rm -v ...

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

无主的数据卷可能会占据很多空间,要清理请使用以下命令
 

docker volume prune

5.匿名挂载与具名挂载

我们之前挂载   docker run -it -v 主机目录:容器目录   这种方式是指定路径挂载的,但是我们也可以不定义主机目录路径。有两种方式挂载。

Docker所有的数据卷默认挂载在宿主机 /var/lib/docker/volumes/ 目录下

5.1 匿名挂载

匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹

如下运行并匿名挂载Nginx容器: 

docker run -d -P --name nginx01 -v /etc/nginx nginx

 5.2 具名挂载

具名挂载,就是指定文件夹名称,区别于指定路径挂载,这里的指定文件夹名称是在Docker指定的默认数据卷路径下的。通过docker volume ls命令可以查看当前数据卷的目录情况。

 有了挂载名,我们就可以更好的操作,所以这也是比较常用的。

可以查看一下volume的信息

匿名挂载,具名挂载,指定路径挂载的命令区别如下:
-v 容器内路径 #匿名挂载

-v 卷名:容器内路径 #具名挂载

-v /宿主机路径:容器内路径 #指定路径挂载

扩展:

#通过      -v 容器内路径:     ro        rw        改变读写权限

ro          readonly       #只读
rw         readwrite      #可读可写
#一旦这个了设置了容器权限,容器对我们挂载出来的内容就有限定了!
docker run -d -p --name nginx02 -v juming-nginx : /etc/nginx:ro nginx

docker run -d -p --name nginx02 -v juming-nginx : /etc/nginx:rw nginx

# ro  只要看到ro就说明这个路径只能通过宿主机来操作,容器内部是无法操作!

6.数据卷容器

容器数据卷是指建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。

 

  • 启动三个容器实现数据同步
创建docker01:因为我本机是最新版
docker run -it --name docker01 wjc/centos:latest

查看容器docekr01内容
ls
bin  home   lost+found    opt   run   sys  var
dev  lib    media    proc  sbin  tmp  volume01
etc  lib64  mnt        root  srv   usr  volume02

不关闭该容器退出
CTRL + Q + P  

创建docker02: 并且让docker02 继承 docker01
docker run -it --name docker02 --volumes-from docker01 wjc/centos:latest

查看容器docker02内容
ls
bin  home   lost+found    opt   run   sys  var
dev  lib    media    proc  sbin  tmp  volume01
etc  lib64  mnt        root  srv   usr  volume02

首先在容器2中的volume01中添加文件

[root@7f90d4147511 /]# cd volume01
[root@7f90d4147511 volume01]# touch test.java
[root@7f90d4147511 volume01]# ls
test.java

然后就可以看到容器1的文件也会添加上了

  • 创建docker03继承docker01

 

 docker run -it --name docker03 --volumes-from docker01 wjc/centos:latest
cd volume01    #进入volume01 查看是否也同步docker01的数据

ls 
docker01.txt
# 测试:可以删除docker01,查看一下docker02和docker03是否可以访问这个文件
# 测试发现:数据依旧保留在docker02和docker03中没有被删除
 

 

 

下面同步两个MySQL的数据库和配置文件,与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载

$ docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
$ docker run -d -p 3310:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01  mysql:5.7
# 这个时候,可以实现两个容器数据同步。
  • 容器之间的配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
  • 但是一旦你持久化到了本地,这个时候,本地的数据是不会删除的。
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
### 回答1: Docker的挂载指的是将主机上的目录或文件系统挂载到容器中,使容器可以访问主机上的文件或目录。挂载可以让容器与主机之间共享数据,方便容器中的应用程序对主机上的文件进行读写操作。同时,挂载还可以让容器中的数据得以持久化,即使容器被删除,挂载的数据也不会丢失。 Docker的挂载可以使用`-v`参数或者`--mount`参数来实现。`-v`参数是较早期的挂载方式,而`--mount`参数可以提供更多的挂载选项。挂载的语法为: ``` docker run -v /host/path:/container/path image_name ``` 或 ``` docker run --mount type=bind,source=/host/path,target=/container/path image_name ``` 其中,`/host/path`是主机上的目录或文件系统路径,`/container/path`是容器中的目录或文件系统路径。Docker将主机上的目录或文件系统挂载到容器中的`/container/path`目录或文件系统中,使得容器可以访问主机上的文件或目录。 除了`type=bind`,`--mount`参数还支持其他类型的挂载方式,例如`tmpfs`和`volume`。`tmpfs`类型的挂载可以将主机上的目录或文件系统挂载到容器中的一个临时文件系统中,而`volume`类型的挂载可以将主机上的目录或文件系统挂载到Docker Volume中,以便其他容器可以共享这个Volume。 ### 回答2: Docker 挂载是指将主机的文件系统的一个目录或文件挂载到 Docker 容器的指定位置,使得容器内部可以访问主机的文件或目录。通过挂载,可以实现容器与主机之间的文件共享。 Docker 提供了多种挂载的选项,包括绑定挂载、匿名挂载和临时挂载。 绑定挂载是最常用的一种挂载方式,通过将主机中的目录挂载到容器中指定的目录,容器内部可以实时读写主机中的文件。绑定挂载可以在创建容器时通过 `-v` 或者 `-mount` 参数来指定,也可以在 `docker run` 命令中使用 `-v` 参数来实现。 匿名挂载则是将匿名的挂载到容器中指定的目录,可以用来存储容器数据或共享文件。当我们不关心挂载点的具体路径时,匿名挂载是一个很方便的选择。 临时挂载和匿名挂载类似,都是将临时的挂载到容器中,不过临时挂载是临时性的,当容器被删除时,挂载的数据也会被删除。 通过挂载,容器可以访问主机的文件,这样可以实现容器与主机间的文件共享、数据持久化以及备份恢复等功能。同时,挂载也可以节省容器的空间和网络开销,提高容器的性能和可用性。 需要注意的是,在进行挂载时,需要确保主机存在被挂载的目录或文件,并且容器内部的挂载点没有被使用。挂载会覆盖容器内部的原有文件或目录,因此在进行挂载操作时需要谨慎。 ### 回答3: Docker 挂载是指将主机的文件或目录与容器内的文件或目录进行关联。通过挂载,可以在容器内访问主机上的文件,并且容器数据可以持久保存在主机上,不会随着容器的销毁而丢失。 Docker 挂载的实现方式有两种:主机挂载和命名挂载。 主机挂载是将主机上的文件或目录直接映射到容器中,并通过在容器中指定主机路径的方式进行挂载。这使得容器可以读写主机上的文件,并且对于需要持久化保存数据的应用非常有用。 命名挂载是创建一个专门用于存储数据的命名,并将其挂载到容器中。通过挂载命名,可以在容器之间共享数据,并且可以通过 Docker 命令管理这些命名。命名的优点是可以轻松备份、恢复和迁移数据。 在使用 Docker 挂载时,需要在运行容器的命令中使用 `-v` 或 `--mount` 参数来指定挂载的方式和路径。例如,可以使用以下命令将主机上的 `/data` 目录挂载到容器的 `/app/data` 目录: ``` docker run -v /data:/app/data my_image ``` 这样,容器内的 `/app/data` 目录就可以访问主机上的 `/data` 目录。 总而言之,Docker 挂载是一种将主机和容器之间的文件或目录进行关联的方式,使得容器可以访问主机上的数据,并且数据可以持久保存,方便数据的备份和迁移。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JagTom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值