Docker容器啓動的時候,若是要掛載宿主機的一個目錄,能夠用-v參數指定。linux
譬如我要啓動一個centos容器,宿主機的/test目錄掛載到容器的/soft目錄,可經過如下方式指定:docker
# docker run -it -v /test:/soft centos /bin/bashcentos
這樣在容器啓動後,容器內會自動建立/soft的目錄。經過這種方式,咱們能夠明確一點,即-v參數中,冒號":"前面的目錄是宿主機目錄,後面的目錄是容器內目錄。bash
貌似簡單,其實否則,下面咱們來驗證一下:spa
1、容器目錄不能夠爲相對路徑3d
[root@localhost ~]# docker run -it -v /test:soft centos /bin/bash invalid value "/test:soft" for flag -v: soft is not an absolute path See 'docker run --help'.
直接報錯,提示soft不是一個絕對路徑,所謂的絕對路徑,必須如下斜線「/」開頭。rest
2、宿主機目錄若是不存在,則會自動生成code
若是宿主機中存在/test目錄,首先刪除它blog
[root@localhost ~]# rm -rf /test [root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
啓動容器it
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash [root@a487a3ca7997 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin soft srv sys tmp usr var
查看宿主機,發現新增了一個/test目錄
[root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
3、宿主機的目錄若是爲相對路徑呢?
此次,咱們換個目錄名test1試試
# docker run -it -v test1:/soft centos /bin/bash
再到宿主機上查看是否新增了一個/test1目錄,結果沒有,是否是由於我用的是相對路徑,因此生成的test1目錄在當前目錄下,結果發現仍是沒有。那容器內的/soft目錄掛載到哪裏去了?經過docker inspect命令,查看容器「Mounts」那一部分,咱們能夠獲得這個問題的答案。
"Mounts": [ { "Name": "test1", "Source": "/var/lib/docker/volumes/test1/_data", "Destination": "/soft", "Driver": "local", "Mode": "z", "RW": true } ],
能夠看出,容器內的/soft目錄掛載的是宿主機上的/var/lib/docker/volumes/test1/_data目錄
原來,所謂的相對路徑指的是/var/lib/docker/volumes/,與宿主機的當前目錄無關。
4、若是隻是-v指定一個目錄,這個又是如何對應呢?
啓動一個容器
[root@localhost ~]# docker run -it -v /test2 centos /bin/bash [root@ea24067bc902 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys test2 tmp usr var
一樣使用docker inspect命令查看宿主機的掛載目錄
"Mounts": [ { "Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a", "Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data", "Destination": "/test2", "Driver": "local", "Mode": "", "RW": true } ],
能夠看出,同3中的結果相似,只不過,它不是相對路徑的目錄名,而是隨機生成的一個目錄名。
5、若是在容器內修改了目錄的屬主和屬組,那麼對應的掛載點是否會修改呢?
首先開啓一個容器,查看容器內/soft目錄的屬性
[root@localhost ~]# docker run -it -v /test:/soft centos /bin/bash [root@b5ed8216401f /]# ll -d /soft/ drwxr-xr-x 2 root root 6 Sep 24 03:48 /soft/
查看宿主機內/test目錄的屬性
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/
在容器內新建用戶,修改/soft的屬主和屬組
[root@b5ed8216401f /]# useradd victor [root@b5ed8216401f /]# chown -R victor.victor /soft/ [root@b5ed8216401f /]# ll -d /soft/ drwxr-xr-x 2 victor victor 6 Sep 24 03:48 /soft/
再來看看宿主機內/test目錄的屬主和屬組是否會發生變化?
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/
居然變爲mycat了。。。
原來,這個與UID有關係,UID,即「用戶標識號」,是一個整數,系統內部用它來標識用戶。通常狀況下它與用戶名是一一對應的。
首先查看容器內victor對應的UID是多少,
[root@b5ed8216401f /]# cat /etc/passwd | grep victor victor:x:1000:1000::/home/victor:/bin/bash
victor的UID爲1000,那麼宿主機內1000對應的用戶是誰呢?
[root@localhost ~]# cat /etc/passwd |grep 1000 mycat:x:1000:1000::/home/mycat:/bin/bash
能夠看出,宿主機內UID 1000對應的用戶是mycat。
6、容器銷燬了,在宿主機上新建的掛載目錄是否會消失?
在這裏,主要驗證兩種狀況:1、指定了宿主機目錄,即 -v /test:/soft。2、沒有指定宿主機目錄,即-v /soft
第一種狀況:
[root@localhost ~]# rm -rf /test --首先刪除宿主機的/test目錄 [root@localhost ~]# ls / --能夠看到,宿主機上無/test目錄 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]# docker run -it --name=centos_test -v /test:/soft centos /bin/bash --啓動容器,爲了刪除方便,我用--name參數指定了容器的名字 [root@82ad7f3a779a /]# exit exit [root@localhost ~]# docker rm centos_test --刪除容器 centos_test [root@localhost ~]# ls / --發現 /test目錄依舊存在 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
能夠看出,即使容器銷燬了,新建的掛載目錄不會消失。進一步也可驗證,若是宿主機目錄的屬主和屬組發生了變化,容器銷燬後,宿主機目錄的屬主和屬組不會恢復到掛載以前的狀態。
第二種狀況,經過上面的驗證知道,若是沒有指定宿主機的目錄,則容器會在/var/lib/docker/volumes/隨機配置一個目錄,那麼咱們看看這種狀況下的容器銷燬是否會致使相應目錄的刪除
首先啓動容器
[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash [root@6b75579ec934 /]# exit exit
經過docker inspect命令查看容器在宿主機上生成的掛載目錄
"Mounts": [ { "Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301", "Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data", "Destination": "/soft", "Driver": "local", "Mode": "", "RW": true } ],
對應的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目錄
銷燬容器,看目錄是否存在
[root@localhost ~]# docker rm centos_test centos_test [root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total 0 drwxr-xr-x 2 root root 6 Sep 24 14:25 _data
發現該目錄依舊存在,即使重啓了docker服務,該目錄依舊存在
[root@localhost ~]# systemctl restart docker [root@localhost ~]# ll /var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301 total 0 drwxr-xr-x 2 root root 6 Sep 24 14:25 _data
7、掛載宿主機已存在目錄後,在容器內對其進行操做,報「Permission denied」。
可經過兩種方式解決:
1> 關閉selinux。
臨時關閉:# setenforce 0
永久關閉:修改/etc/sysconfig/selinux文件,將SELINUX的值設置爲disabled。
2> 以特權方式啓動容器
指定--privileged參數
如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash