数据卷(volume)

问题:容器中的数据保存在内存中,一个容器就是一个进程,万一进程停止后,那么容器的数据该如何保存、保存在哪里呢,如何做容器中数据的持久化?

数据卷就是为了解决数据存储问题
作用:容器和宿主机之间共享数据,让容器中的数据可以永久保存。

docker提供了一下三种方将数据从宿主机中挂载到容器中:

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_laradock 的容器卷挂载在哪里

1. volumes:Docker管理宿主机文件系统的一部分,默认位于 /var/lib/docker/volumes 目录中;(最常用的方式)

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_docker_02


 由上图可以知道,目前所有Container的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名(就上面这一堆很长ID的名字)卷。

 

2.bind mounts: 可以存储在宿主机系统的任意位置(比较常用的方式)

 但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

3.tmpfs: 挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统(一般不会使用)

Volume的基本使用

管理卷

# docker volume create edc-nginx-vol // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息

使用挂载本地目录的方式做数据的持久化
将宿主机中的文件 /web/下的文件挂载到容器中 /usr/share/nginx/html 目录下:

[root@sc-docker-1 web]# docker run --name sc-nginx-1 -p 8080:80 -d -v /web/:/usr/share/nginx/html nginx

使用挂载数据卷的方式做持久化
有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:

docker run -d -it --name=edc-nginx -p 8080:80 -v edc-nginx-vol
:/usr/share/nginx/html nginx

其中,-v代表挂载数据卷,这里使用自定数据卷edc-nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

验证:

创建好容器之后,我们可以进入容器里面看看:

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_docker_03


进入宿主机中查看之前自定义的数据卷

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_nginx_04


关闭nginx容器,查看数据卷中的文件是否丢失

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_laradock 的容器卷挂载在哪里_05


由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是复用当前数据卷里面的文件。

此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。
  
使用volume方式做数据持久化比使用挂载方式做持久化的优势
卷是持久化 Docker 容器生成和使用的数据的首选机制。虽然绑定挂载依赖于主机的目录结构和操作系统,但卷完全由 Docker 管理。与绑定安装相比,卷有几个优点:

  1. 与绑定安装相比,卷更容易备份或迁移。
  2. 您可以使用 Docker CLI 命令或 Docker API 管理卷
  3. 卷适用于 Linux 和 Windows 容器。
  4. 卷可以在多个容器之间更安全地共享
  5. 卷驱动程序允许您将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能
  6. 卷驱动程序允许您将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能
  7. 卷驱动程序允许您将卷存储在远程主机或云提供商上,以加密卷的内容或添加其他功能
  8. 新卷的内容可以由容器预先填充
  9. Docker 桌面上的卷比 Mac 和 Windows 主机上的绑定挂载具有更高的性能。

此外,与在容器的可写层中持久化数据相比,卷通常是更好的选择,因为卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外

docker的五种网络模式

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_docker_06

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_laradock 的容器卷挂载在哪里_07


laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_docker_08


laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_数据_09


laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_nginx_10


Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。

容器在两个跨主机进行通信的时候,是使用overlay network这个网络模式进行通信;如果使用host也可以实现跨主机进行通信,直接使用这个物理的ip地址就可以进行通信。overlay它会虚拟出一个网络比如10.0.2.3这个ip地址。在这个overlay网络模式里面,有一个类似于服务网关的地址,然后把这个包转发到物理服务器这个地址,最终通过路由和交换,到达另一个服务器的ip地址。

要实现overlay网络,我们会有一个服务发现。比如说consul,会定义一个ip地址池,比如10.0.2.0/24之类的。上面会有容器,容器的ip地址会从上面去获取。获取完了后,会通过ens33来进行通信,这样就实现跨主机的通信。

laradock 的容器卷挂载在哪里 docker数据卷容器挂载到哪了_docker_11