2025/12/29 19:16:50
网站建设
项目流程
潮州网站建设,中国建设银行网站开通短信服务,网站开发的技术简介是什么,长沙服务专业的建网站volume 在容器创建时就会初始化#xff0c;在容器运行时就可以使用其中的文件。 volume 能在不同的容器之间共享和重用。 对volume中数据的操作会马上生效。 对volume中数据的操作不会影响镜像本身。 volume的生存周期独立于容器的生命周期#xff0c;即使删除容器#…volume 在容器创建时就会初始化在容器运行时就可以使用其中的文件。volume 能在不同的容器之间共享和重用。对volume中数据的操作会马上生效。对volume中数据的操作不会影响镜像本身。volume的生存周期独立于容器的生命周期即使删除容器volume仍然会存在没有任何容器使用的volume也不会被Docker删除。二、数据卷的使用Docker 提供docker volume命令管理数据卷展开代码语言Bash自动换行AI代码解释Usage: docker volume COMMAND Manage volumes Commands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes2.1、创建数据卷创建一个名为vol_simple的存储卷代码语言Bash自动换行AI代码解释docker volume create --name vol_simple查看数据卷的信息包括创建时间、驱动、挂载点代码语言Bash自动换行AI代码解释docker volume inspect vol_simple示例展开代码语言Bash自动换行AI代码解释flyfly:~$ docker volume create --name vol_simple vol_simple flyfly:~$ docker volume inspect vol_simple [ { CreatedAt: 2023-01-04T11:59:24Z, Driver: local, Labels: {}, Mountpoint: /var/lib/docker/volumes/vol_simple/_data, Name: vol_simple, Options: {}, Scope: local } ]Docker run 和 docker create 通过指定-v参数 可以为容器挂载一个数据卷。代码语言Bash自动换行AI代码解释#没有指定volume卷只指定了容器中的挂载点/data docker run -d -it -v /data ubuntu /bin/bash # 查看随机创建的volume位置查看mounts的内容 docker inspect {ID} # 创建一个指定名字的volume 并挂载到容器中的/data目录 docker run -d -v vol_simple:/data ubuntu示例展开代码语言Bash自动换行AI代码解释flyfly:~$ docker run -dit -v vol_simple:/data ubuntu e86204b7a02ccb62e6cf4f00b7246ac0d70aadf0d9915df5418ad73f0bf8f00a flyfly:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e86204b7a02c ubuntu bash 4 seconds ago Up 2 seconds charming_bhaskara flyfly:~$ docker inspect charming_bhaskara ... Mounts: [ { Type: volume, Name: vol_simple, Source: /var/lib/docker/volumes/vol_simple/_data, Destination: /data, Driver: local, Mode: z, RW: true, Propagation: } ], ...测试数据持久性展开代码语言Bash自动换行AI代码解释flyfly:~$ docker exec -it charming_bhaskara bash roote86204b7a02c:/# ls bin boot data dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var roote86204b7a02c:/# echo abcd /data/1.txt roote86204b7a02c:/# cat data/1.txt abcd roote86204b7a02c:/# exit exit flyfly:~$ docker stop charming_bhaskara charming_bhaskara flyfly:~$ docker rm charming_bhaskara charming_bhaskara flyfly:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 22634e72e7a3 registry:2 /entrypoint.sh /etc… 3 weeks ago Up 21 minutes 0.0.0.0:5000-5000/tcp, :::5000-5000/tcp registry flyfly:~$ sudo cat /var/lib/docker/volumes/vol_simple/_data/1.txt abcd2.2、挂载数据卷使用docker run 或者 docker create 创建新容器是可以使用-v标签为容器添加volume。可以将自行创建或者有Docker创建的volume挂载到容器中也可以将宿主机上的目录或者文件作为volume挂载到容器中。将宿主机中指定目录作为volume挂载到容器中的/data目录下文件夹必须使用绝对路径如果宿主机中不存在指定的目录则会创建一个空文件夹如果宿主机文件夹已经存在容器可以通过访问挂载点/data 从而访问宿主机文件夹中的所有内容。如果容器下原本已经存在/data文件夹且不为空那么容器中文件夹下原有的内容将被隐藏来保持与宿主机中的文件夹一致。挂载方式1创建名为vol_simple的数据卷并挂载到容器中的/data目录下代码语言Bash自动换行AI代码解释docker volume create --name vol_simple docker run -d -v vol_simple:/data ubuntu /bin/bash2创建一个随机的ID的volume并将其挂载到容器中的/data目录下代码语言Bash自动换行AI代码解释docker run -d -v /data ubuntu /bin/bash3关联宿主机目录代码语言Bash自动换行AI代码解释docker run -d -v $HOME/data:/data ubuntu /bin/bash挂载权限ro表示只读rw表示读写默认为rw代码语言Bash自动换行AI代码解释# ro表示只读rw表示读写默认为rw docker run -it -v $HOME/data:/data:ro ubuntu /bin/bash # 通过修改文件验证 echo 123456abcdefg /data/test同时挂载多个数据卷代码语言JavaScript自动换行AI代码解释docker run -it -v $HOME/data:/data:ro -v /data1 -v /data2 ubuntu /bin/bash通过dockerfile指定数据卷挂载代码语言Bash自动换行AI代码解释# dockerfile 添加指令 VOLUME /data # 指定多个数据卷的挂载点 VOLUME [/data1,/data2]使用dockerfile VOLUME 指令与docker run -v 不同的是dockerfile指令不能挂载主机中指定的文件夹。这时为了保证Dockerfile的可移植性因为不能保证所有的宿主机都有对应的文件夹。如果镜像中存才/data文件夹这个文件夹中的内容将全部被复制到宿主机上对应文件夹中并且根据容器中的文件设置合适的权限和所有者。注意在Dockerfile中使用VOLUME指令后的代码如果尝试对这个volume进行修改这些修改都不会生效。因为volume 是独立于rootfs的存储镜像构建过程每一层类似docker commit 提交临时镜像为镜像层docker commit不会对挂载的volume进行保存。示例1VOLUME指定了挂载点之后再对挂载点进行操作由于docker commit 提交临时镜像不会对volume进行保存所以该data下的file并没有被保存更不会同步到宿主机。代码语言Bash自动换行AI代码解释FROM ubuntu RUN useradd fly2 VOLUME /data RUN touch /data/file RUN chown -R fly2:fly2 /data构建代码语言Bash自动换行AI代码解释docker build -t test1:v1 -f Dockerfile . docker run -d -it test1:v1 /bin/bash查看挂载点信息 代码语言Bash自动换行AI代码解释docker inspect 容器ID查看宿主机存储卷目录 代码语言Bash自动换行AI代码解释sudo ls 宿主机存储卷目录示例2由于挂载volume时/data目录已经存在所以/data中的文件以及它们的权限和所有者设置都会被复制到volume中。代码语言Bash自动换行AI代码解释FROM ubuntu RUN useradd fly2 RUN mkdir /data touch /data/file RUN chown -R fly2:fly2 /data VOLUME /data构建代码语言Bash自动换行AI代码解释docker build -t test1:v2 -f Dockerfile1 . docker run -d -it test1:v2 /bin/bash查看挂载点信息代码语言JavaScript自动换行AI代码解释docker inspect 容器ID查看宿主机存储卷目录 代码语言JavaScript自动换行AI代码解释sudo ls 宿主机存储卷目录示例3通过CMD和ENTRYPOINT指令在容器启动时执行挂载点下文件的初始化。代码语言JavaScript自动换行AI代码解释FROM ubuntu RUN useradd fly2 VOLUME /data CMD touch /data/file chown -R fly2:fly2 /data2.3、共享数据卷在使用docker run 或docker create创建新容器时可以使用–volumes-from 标签使得容器与已有容器共享volume。可以使用多个–volumes-from标签使得容器与多个已有容器共享volume。一个容器挂载了一个volume即使这个容器停止运行该volume仍然存在其他容器也可以使用–volumes-from与这个容器共享volume。共享数据卷作用如果有一些数据比如配置文件、数据文件等要在多个容器之间共享一种常见的做法是创建一个数据容器其他的容器与之共享volume。实践 创建一个带数据卷的容器。创建目录和数据卷代码语言Bash自动换行AI代码解释mkdir $HOME/data mkdir $HOME/readOlny_data docker volume create vol_simple docker volume create vol_simple1创建一个数据容器 包含已创建数据卷只读数据卷私有数据卷等 代码语言JavaScript自动换行AI代码解释docker run -d -it -v vol_simple:/vol_simple -v $HOME/data:/data -v $HOME/readOlny_data:/readOlny_data:ro --name share_data ubuntu /bin/bash docker run -d -it -v vol_simple1:/vol_simple1 --name share_data1 ubuntu /bin/bash进入容器查看 代码语言JavaScript自动换行AI代码解释docker exec -it 容器ID /bin/bash运行新的容器通过数据容器共享数据卷 容器名代码语言JavaScript自动换行AI代码解释volume_from1 docker run -d -it --volumes-from share_data --volumes-from share_data1 --name volume_from1 ubuntu /bin/bash运行新的容器通过数据容器共享数据卷 容器名代码语言JavaScript自动换行AI代码解释volume_from2 docker run -d -it --volumes-from share_data --volumes-from share_data1 --name volume_from2 ubuntu /bin/bash只读共享点不能被写入。可以同时共享多个容器的数据卷。docker inspect 查看容器元数据。2.4、删除数据卷如果创建容器时从容器中挂载了volume在/var/lib/docker/volumes下会生产与volume对应的目录可使用docker inspect 命令查看容器信息找到对应的信息。使用docker rm 删除容器并不会删除与volume对应的目录这些目录会占据不必要的存储空间。删除volume的三种方式使用docker volume rm volume_name 删除数据卷。使用docker rm -v container_name 删除容器时一并删除它挂载的数据卷。在运行容器时使用docker run --rm 标签会在容器停止运行时删除容器以及容器所挂载的volume。注意在使用第一种docker volume rm 删除时只有当没有任何容器使用该volume的时候才能被删除成功。另外两种删除方式只会对挂载在该容器上的未指定名称匿名的的volume进行删除而会对用户指定名称的具名的volume进行保留。如果volume 是在创建容器时从宿主机中挂载的无论对容器进行任何操作都不会导致其在宿主机中被删除如果不需要这些文件只能手动删除。从宿主机中挂载是指 docker run -v dir:dir 这种模式。2.5、备份和迁移数据卷volume 作为数据的载体在很多情况下需要对其中的数据进行备份、迁移或是从已有数据恢复。最简单的备份还原的方式通过inspect 命令查看容器信息找到对应的数据卷手动打包数据同样的还原那就是把打包好的数据解压到对应的数据卷。用–volumes-from实现备份与还原1备份启动另外一个临时容器共享挂载数据容器share_data同时挂载当前目录到容器的/backup。启动容器时执行打包命令将/data挂载点下的数据打包到/backup/data.tar 文件中。–rm 表示该容器停止后会删除该容器和该容器的数据卷。代码语言JavaScript自动换行AI代码解释docker run --rm --volumes-from share_data -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data2恢复创建临时容器通过共享存储的方式与目标容器共享存储同时挂载当前目录到容器的/backup。启动容器时从backup挂载点下的data.tar 解压文件到容器的根目录。代码语言JavaScript自动换行AI代码解释docker run -d -it --name vol_bck -v /data ubuntu /bin/bash代码语言JavaScript自动换行AI代码解释docker run --rm --volumes-from vol_bck -v $(pwd):/backup ubuntu tar xvf /backup/data.tar -C /三、总结数据卷是 Docker 解决容器数据持久化、共享和管理的核心机制。数据卷解决的问题就是容器数据的持久化问题比如日志、容器间共享数据、配置文件等。容器和镜像使用的同一套文件即依赖相同的镜像层这是一个只读的权限要修改底层文件内容就需要将文件从只读层拷贝出来放到读写层进行改变改变后会隐藏只读层的那个文件使用读写层的文件。