docker-Volume(四)

Volume原理

首先我们需要知道Docker的文件系统是如何工作的。

1,Docker镜像是由多个文件系统(只读层)叠加而成。当我们启动一个容器的时候,Docker会加载只读镜像层并在其上(译者注:镜像栈顶部)添加一个读写层。

2,如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。

3,当删除Docker容器,并通过该镜像重新启动时,之前的更改将会丢失。在Docker中,只读层及在顶部的读写层的组合被称为Union File System(联合文件系统)

4,为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。

Docker管理数据的方式有两种:

什么是数据卷

数据卷是一个特殊的文件或者目录,它将宿主机文件或者目录直接映射进容器中,可供一个或多个容器使用。

容器数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。

因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。

通过docker run -v命令可以将数据卷挂载到对应的容器目录空间,进行文件读取

数据卷特性

1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便

2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作

3. 对数据卷的更新不会影响镜像,解耦了应用和数据

4. 卷会一直存在,直到没有容器使用,可以安全地卸载它

数据卷绑定方式

volumes

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

 

 

bind mounts

指定宿主机目录方式,意为着可以存储在宿主机系统的任意位置;(比较常用的方式

但是,bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。

这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。

tmpfs

挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;(一般都不会用的方式

数据卷挂载使用方式

//注意:如果出现Docker挂载宿主机目录显示cannot open directory .:Permission denied

解决办法:在挂载目录后面 多加一个--privileged=true参数即可

匿名目录挂载

属于volumes绑定方式

将挂载到/var/lib/docker/volumes  目录名字将会是一串随机数

docker run -it -v /centosVolume [container]

仅指定名字挂载

属于volumes绑定方式

将挂载到/var/lib/docker/volumes/myVolme/_data 也是挂载到了volumes目录 但是下级目录是我们指定的名字

docker run -it -v hostVolume:/myVolume [container]

指定目录挂载

属于bind mounts绑定方式

将挂载到我们指定的目录/root/hostVolume

docker run -it -v /root/hostVolume:/containerVolume [container]

docker file方式

生成镜像容器 内部将有这2个目录,并跟宿主机的进行绑定,使用的是volumes绑定方式

#基于centos镜像进行构建
FROM centos

#数据卷只能指定容器数据卷,不能指定宿主机数据卷,英文并不能够保证在所有的宿主机上都存在这样的特定目录。
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]

#以 /bin/bash方式启动
CMD /bin/bash

 

管理数据卷相关命令

创建数据卷

docker volume create edc-nginx-vol // 创建一个自定义容器卷

使用通过

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

查看所有容器卷

docker volume ls // 查看所有容器卷

查看指定容器卷详情信息

docker volume inspect edc-nginx-vol // 

删除容器卷

 docker volume rm edc-nginx-vol

查看volume路径

docker info | grep "Docker Root Dir"

 

也可以通过docker info查看

docker info
......
 Docker Root Dir: /var/lib/docker
.......

 可以通过以下方式修改自定义目录

1、确保停止docker服务
# systemctl stop docker.service
2、修改/etc/docker/daemon.json文件值,文件不存在需手动创建
# vim /etc/docker/daemon.json
新增以下信息:

{
"data-root": "/opt/docker/data"
}

 一些问题

mac查看volume路径

linux下不知道 mac下 docker 文件夹需要容器进入才看得到

1.默认在此目录 但是需要容器才能进入

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

 

1.执行以下命令下载镜像并进入容器

docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
Unable to find image 'debian:latest' locally
latest: Pulling from library/debian
17c9e6141fdb: Pull complete 
Digest: sha256:bfe6615d017d1eebe19f349669de58cda36c668ef916e618be78071513c690e5
Status: Downloaded newer image for debian:latest

3.如果拉取不下来可以替换国内镜像源

通过docker info查看当前镜像仓库 以下是我替换过的

 

posted @ 2022-11-05 19:24  意犹未尽  阅读(189)  评论(0编辑  收藏  举报