Docker学习过程 (5-数据卷)
今天要说的是数据卷和数据卷容器。所谓的数据卷就像一个硬盘分区,可以挂载在容器上。
值得一提的地方:
- 数据卷一般不会在容器停止时自动被删除
- 多个容器共享一个数据卷,则在一个容器里对数据卷的操作会马上反应在另外的容器,毕竟数据卷是一个。
- 数据卷容器其实不是把数据卷放在放在一个容器里,而只是一个管理数据卷的工具。
- 数据卷与容器的关系如图1, 数据容器如图2
基本命令
sudo docker volume create #创建数据卷容器,返回数据卷ID
sudo docker volume create --name html #指定数据卷名字
sudo docker volume inspect $volume #查看数据卷$volume
sudo docker volume ls #查看所有数据卷
sudo docker create -v $volume $container #用参数 -v 在创建容器时挂载数据卷$volume
#数据卷不存在就自动新建数据卷,自动挂载
sudo docker create -v $volume_name:$volume_dest $container
#挂载数据卷$volume_name到容器$container的$volume_dest位置
#$volume_name 可以是宿主机绝对路径的目录,这样就把宿主机目录挂载到容器上
sudo docker volume rm $volume #删除数据卷$volume,用id的话需要64位都写全。如果有其他容器在使用该数据卷,则可能引发错误
sudo docker rm -v $container #随容器删除数据卷,但如果有其他容器在用该数据卷,自动不删除该数据卷
sudo docker create --name $name -v $volume $container
#创建数据卷容器,和之前的创建数据卷一样。我看书上把$container用一个操作系统来充当
sudo docker run --volumes-from $vol_con $container
#让容器$container连接数据卷容器$vol_con
sudo docker run -it --volumes-from $vol_con -v $des:$des_dir --rm $container tar cf $des_dir/$des_file $source
#把数据从容器内部的$source 迁移到主机的$des目录下,比较长,下面仔细讲解
sudo docker run -it --volumes-from $vol_con -v $des:$des_dir --rm $container tar xf $des_dir/$des_file
#把数据从宿主机$des目录下的打包迁移到数据卷容器$vol_con
实例
创建、查看、删除数据卷
sudo docker volume ls(或list)
sudo docker volume create
sudo docker volume create --name Volume_1
sudo docker volume rm
注意:要用ID删除数据卷则要写出64位ID,不能像容器和镜像那样前几位就OK。
数据卷的迁移
sudo docker run -d --name web0 --volumes-from Volume nginx #让web0连接Volume
sudo docker create --name data -v /html ubuntu #利用Ubuntu创建一个叫data的数据卷容器
sudo docker run -it --volumes-from data -v /home:/backup --rm ubuntu tar cf /bakcup/data.tar /bin
第二行代码所做如下:
- 先用ubuntu镜像启动一个数据卷容器并把该数据卷容器命名成data
- 给data容器挂载上数据,把主机的 /home目录挂载在data容器的/backup目录下。此时/backup目录与主机的/home目录其实是一个东西,只是一个在容器下,一个在主机下
- 把容器里的/bin的数据打包成 data.tar,并放在/backup目录下,也就是主机目录/home下
- 命令执行完,关闭容器,并用–rm 删除了容器。
因为各种原因犯了些错误,下图中第一条和最后两条命令是成功的。
此时可以在/home文件下看见/data.tar
值得一提的是上面的新建容器导入导出命令可以当做专用于导入导出数据卷的命令。
导入就不说了,要赶紧去吃饭,晚了食堂关门了。
有的地方有错误在所难免,哪儿有问题可以在评论里指出。