06.容器卷

/ Docker / 没有评论 / 720浏览

为什么用容器卷

正常情况下容器内的数据和容器是共生共存的,当容器被删除时数据也会丢失。容器卷就是将容器内部的指定路径和宿主机上的指定路径进行映射。达到数据共享的目的。

怎么用容器卷

docker run -it -v 宿主机目录:/容器目录 - - privileaged=true 镜像名

特点

  1. 可以在容器之间共享或者重用数据;
  2. 卷中的更改可以直接实时生效;
  3. 数据卷中的更改不会包含在镜像的更新中;
  4. 数据卷的生命周期一直持续到没有容器使用其为止。

实操

docker操作

➜  ~ docker run -it -v /Users/huzd/Desktop/aaa:/aaa --name="u1" ubuntu   # 启动docker并且做文件映射
root@fecc8941c253:/# ls
aaa  bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@fecc8941c253:/# cd /aaa/  # 验证aaa目录是否存在
root@fecc8941c253:/aaa# ls
root@fecc8941c253:/aaa# touch dockerin.txt # 创建dockerin.txt 文件夹
root@fecc8941c253:/aaa# ll  # 查看宿主机创建的dockerout.txe文件夹
total 4
drwxr-xr-x 4 root root  128 Jun 22 00:47 ./
drwxr-xr-x 1 root root 4096 Jun 22 00:47 ../
-rw-r--r-- 1 root root    0 Jun 22 00:47 dockerin.txt
-rw-r--r-- 1 root root    0 Jun 22 00:47 dockerout.txt
root@fecc8941c253:/aaa# ls
a.txt  dockerin.txt  dockerout.txt
root@fecc8941c253:/aaa# more a.txt 
hello docker !
root@fecc8941c253:/aaa# echo 'hello host!' >> a.txt 
root@fecc8941c253:/aaa# more a.txt 
hello docker !
hello host!
root@fecc8941c253:/aaa# 

宿主机操作

➜  Desktop cd aaa         
➜  aaa touch dockerout.txt
➜  aaa ls
dockerin.txt  dockerout.txt
➜  aaa echo 'hello docker !' > a.txt
➜  aaa cat a.txt                                                  
hello docker !
➜  aaa 
➜  aaa cat a.txt 
hello docker !
hello host!
➜  aaa 

查看挂载情况

docker inspect 容器ID

docker inspect fecc8941c253

 "Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/huzd/Desktop/aaa",
                "Destination": "/aaa",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

只读不能写

命令: docker run -it -v /Users/huzd/Desktop/aaa:/ccc**:ro** --name=u2 ubuntu

ro read-only 只读

rw read-write 读写

此时宿主机的任何改动容器里面会实时同步,但是容器无法写挂在的数据卷。

➜  ~ docker ps                                                        
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
➜  ~ docker run -it -v /Users/huzd/Desktop/aaa:/ccc:ro --name=u2 ubuntu   #按照只读方式挂载一个容器卷
root@6985bfbf7b48:/# ls
bin  boot  ccc  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@6985bfbf7b48:/# cd ccc/
root@6985bfbf7b48:/ccc# touch test.txt  #操作只读容器卷
touch: cannot touch 'test.txt': Read-only file system
root@6985bfbf7b48:/ccc# 

容器卷继承

命令:docker run -it --privileged=true --volumes-from 父类容器ID --name='Container2' 镜像名字或容器ID:版本号

➜  aaa docker run -it --volumes-from 6985bfbf7b48 --name u3 ubuntu
root@a124153c09b2:/# ls
bin  boot  ccc  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@a124153c09b2:/# cd /ccc/
root@a124153c09b2:/ccc# ls
a.txt  dockerin.txt  dockerout.txt  test.json
root@a124153c09b2:/ccc# touch aa.json  # 集成了父容器数据卷可读的属性
touch: cannot touch 'aa.json': Read-only file system
root@a124153c09b2:/ccc# ls
a.txt  ccc.json  dockerin.txt  dockerout.txt  test.json