什么是数据卷与数据卷容器

描述

容器可以承载微服务,也可以承载数据库,微服务的配置文件,数据库的数据文件,都需要持久化,也就是即使容器销毁了,这些数据也需要存在。

一方面可以釆用手工方式用命令行拷贝,在容器很多的情况下,是不可取的。另一方面可以自动保存到宿主机或者远程存储上。

容器中将用于存储的文件目录称为卷(Volume),可见容器的存储便是对目录的操作。

可以直接将容器目录映射到主机目录,称为数据卷;也可以构建专门挂载数据卷的容器,称为数据卷容器。

1. docker cp命令

首先启动名称为dockervolumtest1的ubuntu环境,并以/bin/bash方式进入到容器。

root@linux:/home# docker run -it --name="dockervolumtest1" ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
125a6e411906: Pull complete 
Digest: sha256:26c68657ccce2cb0a31b330cb0be2b5e108d467f641c62e13ab40cbec258c68d
Status: Downloaded newer image for ubuntu:latest
root@51d152e09898:/# 进入到容器

再新建dockerdata1.log作为测试文件。

root@51d152e09898:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@51d152e09898:/# cd tmp
root@51d152e09898:/tmp# ls
root@51d152e09898:/tmp# touch dockerdata1.log
root@51d152e09898:/tmp# echo this is docker data test > dockerdata1.log 
root@51d152e09898:/tmp# cat dockerdata1.log 
this is docker data test
root@51d152e09898:/tmp#

使用docker cp命令在主机和容器进行数据拷贝。

命令格式:

docker cp 容器ID:/目录 主机目录
root@linux:/# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED         STATUS         PORTS     NAMES
51d152e09898   ubuntu    "/bin/bash"   4 minutes ago   Up 4 minutes             dockervolumtest1
root@linux:/# docker cp 51d152e09898:/tmp /
root@linux:/# cd tmp
root@linux:/tmp# ls
dockerdata1.log
root@linux:/tmp# cat dockerdata1.log 
this is docker data test
root@linux:/tmp#

2. 数据卷

使用docker run命令,并指定-v选项,便可在启动容器的时挂载数据卷;

命令格式1:

docker run -v /宿主机路径:容器内路径 镜像名
# 如指定的目录不存在,系统会自动创建
root@linux:/home# docker run -it --name="volummnttest1" -v /tmp/hostdir:/tmp/dockerdir ubuntu /bin/bash 
root@ae1b5eda679d:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
# 新建测试文件volum.log
root@ae1b5eda679d:/# cd /tmp/dockerdir/
root@ae1b5eda679d:/tmp/dockerdir# ls
root@ae1b5eda679d:/tmp/dockerdir# touch volum.log
root@ae1b5eda679d:/tmp/dockerdir# echo this is a volum test > volum.log 
root@ae1b5eda679d:/tmp/dockerdir#

新建命令窗口,查看Host宿主机的文件信息:

root@linux:/tmp/hostdir# ll
total 12
drwxr-xr-x  2 root root 4096 May 12 17:12 ./
drwxrwxrwt 16 root root 4096 May 12 17:11 ../
-rw-r--r--  1 root root   21 May 12 17:13 volum.log
root@linux:/tmp/hostdir# cat volum.log 
this is a volum test
root@linux:/tmp/hostdir#

命令格式2:docker run -v 容器内路径 镜像名

# 不指定主机目录,系统会默认存储在/var/lib/docker/volumes/容器ID目录
root@linux:/tmp/hostdir# docker run -it --name="volummnttest2" -v /tmp/dockerdir2 ubuntu /bin/bash
root@cf7f42544b8f:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@cf7f42544b8f:/# cd /tmp/
root@cf7f42544b8f:/tmp# ls
dockerdir2
root@cf7f42544b8f:/tmp#

新建命令窗口,查看volum2.log的相关信息:

root@linux:/# cd /var/lib/docker/
root@linux:/var/lib/docker# ls
buildkit  containers  image  network  overlay2  plugins  runtimes  swarm  tmp  trust  volumes
root@linux:/var/lib/docker# cd volumes/
root@linux:/var/lib/docker/volumes# ls
9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b  backingFsBlockDev  metadata.db
root@linux:/var/lib/docker/volumes# cd 9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b/
root@linux:/var/lib/docker/volumes/9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b# ls
_data
root@linux:/var/lib/docker/volumes/9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b# cd _data/
root@linux:/var/lib/docker/volumes/9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b/_data# ls
volum2.log
root@linux:/var/lib/docker/volumes/9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b/_data# cat volum2.log 
this is for volum2 test
root@linux:/var/lib/docker/volumes/9c8c17797ea4efdee595d1eea56ea39906b4879fd150a17e5312dc5c6c62851b/_data#

也可通过docker inspect 容器ID,查看详情

3. 数据卷容器

首先启动容器volumedockertest

root@linux:/# docker run -it --name="volumedockertest" -v volumebase:/tmp/volumbasedata ubuntu /bin/bash
root@2933ebe42b98:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@2933ebe42b98:/# cd tmp
root@2933ebe42b98:/tmp# ll
total 12
drwxrwxrwt 1 root root 4096 May 12 09:50 ./
drwxr-xr-x 1 root root 4096 May 12 09:50 ../
drwxr-xr-x 2 root root 4096 May 12 09:50 volumbasedata/

再启动容器volumedockertest1,使用--volumes-from参数继承的volumedockertest数据卷。

root@linux:/# docker run -it --name="volumedockertest1" --volumes-from volumedockertest ubuntu /bin/bash
root@9ee901a1d422:/# ls

新建测试文件:

root@9ee901a1d422:/tmp/volumbasedata# echo this is test add data > basedata.log 
root@9ee901a1d422:/tmp/volumbasedata#

宿主机查看文件

root@linux:~# cat /var/lib/docker/volumes/volumebase/_data/basedata.log 
this is test add data
root@linux:~#
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分