詳解Docker掛載本地目錄及實現(xiàn)文件共享的方法
docker掛載本地目錄的方法總結:
Docker容器啟動的時候,如果要掛載宿主機的一個目錄,可以用-v參數(shù)指定。
譬如我要啟動一個centos容器,宿主機的/test目錄掛載到容器的/soft目錄,可通過以下方式指定:
# docker run -it -v /test:/soft centos /bin/bash
這樣在容器啟動后,容器內(nèi)會自動創(chuàng)建/soft的目錄。通過這種方式,我們可以明確一點,即-v參數(shù)中,冒號":"前面的目錄是宿主機目錄,后面的目錄是容器內(nèi)目錄。
貌似簡單,其實不然,下面我們來驗證一下:
一、容器目錄不可以為相對路徑
[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不是一個絕對路徑,所謂的絕對路徑,必須以下斜線“/”開頭。
二、宿主機目錄如果不存在,則會自動生成
如果宿主機中存在/test目錄,首先刪除它
[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
啟動容器
[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
查看宿主機,發(fā)現(xiàn)新增了一個/test目錄
[root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
三、宿主機的目錄如果為相對路徑呢?
這次,我們換個目錄名test1試試
# docker run -it -v test1:/soft centos /bin/bash
再到宿主機上查看是否新增了一個/test1目錄,結果沒有,是不是因為我用的是相對路徑,所以生成的test1目錄在當前目錄下,結果發(fā)現(xiàn)還是沒有。那容器內(nèi)的/soft目錄掛載到哪里去了?通過docker inspect命令,查看容器“Mounts”那一部分,我們可以得到這個問題的答案。
"Mounts":[ { "Name": "test1", "Source": "/var/lib/docker/volumes/test1/_data", "Destination": "/soft", "Driver": "local", "Mode": "z", "RW": true } ],
可以看出,容器內(nèi)的/soft目錄掛載的是宿主機上的/var/lib/docker/volumes/test1/_data目錄
原來,所謂的相對路徑指的是/var/lib/docker/volumes/,與宿主機的當前目錄無關。
四、如果只是-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中的結果類似,只不過,它不是相對路徑的目錄名,而是隨機生成的一個目錄名。
五、如果在容器內(nèi)修改了目錄的屬主和屬組,那么對應的掛載點是否會修改呢?
首先開啟一個容器,查看容器內(nèi)/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/
查看宿主機內(nèi)/test目錄的屬性
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/
在容器內(nèi)新建用戶,修改/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/
再來看看宿主機內(nèi)/test目錄的屬主和屬組是否會發(fā)生變化?
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/
竟然變?yōu)閙ycat了。。。
原來,這個與UID有關系,UID,即“用戶標識號”,是一個整數(shù),系統(tǒng)內(nèi)部用它來標識用戶。一般情況下它與用戶名是一一對應的。
首先查看容器內(nèi)victor對應的UID是多少,
[root@b5ed8216401f /]# cat /etc/passwd | grep victor victor:x:1000:1000::/home/victor:/bin/bash
victor的UID為1000,那么宿主機內(nèi)1000對應的用戶是誰呢?
[root@localhost ~]# cat /etc/passwd |grep 1000 mycat:x:1000:1000::/home/mycat:/bin/bash
可以看出,宿主機內(nèi)UID 1000對應的用戶是mycat。
六、容器銷毀了,在宿主機上新建的掛載目錄是否會消失?
在這里,主要驗證兩種情況:一、指定了宿主機目錄,即 -v /test:/soft。二、沒有指定宿主機目錄,即-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參數(shù)指定了容器的名字 [root@82ad7f3a779a /]# exit exit [root@localhost ~]# docker rm centos_test --刪除容器 centos_test [root@localhost ~]# ls / --發(fā)現(xiàn) /test目錄依舊存在 bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
可以看出,即便容器銷毀了,新建的掛載目錄不會消失。進一步也可驗證,如果宿主機目錄的屬主和屬組發(fā)生了變化,容器銷毀后,宿主機目錄的屬主和屬組不會恢復到掛載之前的狀態(tài)。
第二種情況,通過上面的驗證知道,如果沒有指定宿主機的目錄,則容器會在/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
發(fā)現(xiàn)該目錄依舊存在,即便重啟了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
七、掛載宿主機已存在目錄后,在容器內(nèi)對其進行操作,報“Permission denied”。
可通過兩種方式解決:
1> 關閉selinux。
臨時關閉:# setenforce 0
永久關閉:修改/etc/sysconfig/selinux文件,將SELINUX的值設置為disabled。
2> 以特權方式啟動容器
指定--privileged參數(shù)
如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash
docker掛載本地目錄實現(xiàn)文件共享:
Docker可以支持把一個宿主機上的目錄掛載到鏡像里。
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash
通過-v參數(shù),冒號前為宿主機目錄,必須為絕對路徑,冒號后為鏡像內(nèi)掛載的路徑。
現(xiàn)在鏡像內(nèi)就可以共享宿主機里的文件了。
默認掛載的路徑權限為讀寫。如果指定為只讀可以用:ro
docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash
docker還提供了一種高級的用法。叫數(shù)據(jù)卷。
數(shù)據(jù)卷:“其實就是一個正常的容器,專門用來提供數(shù)據(jù)卷供其它容器掛載的”。感覺像是由一個容器定義的一個數(shù)據(jù)掛載信息。其他的容器啟動可以直接掛載數(shù)據(jù)卷容器中定義的掛載信息。
看示例:
docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash
創(chuàng)建一個普通的容器。用--name給他指定了一個名(不指定的話會生成一個隨機的名子)。
再創(chuàng)建一個新的容器,來使用這個數(shù)據(jù)卷。
docker run -it --volumes-from dataVol ubuntu64 /bin/bash
--volumes-from用來指定要從哪個數(shù)據(jù)卷來掛載數(shù)據(jù)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
docker安裝RocketMQ的實現(xiàn)(附填坑經(jīng)驗connect to failed)
本文主要介紹了docker安裝RocketMQ(附填坑經(jīng)驗connect to failed)2024-06-06多云環(huán)境下的Docker部署策略實現(xiàn)
在多云環(huán)境下,Docker容器技術為應用程序的部署提供了高度的靈活性和可擴展性,本文就來介紹一下多云環(huán)境下的Docker部署策略實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-01-01Dockerfile 中 VOLUME 與 docker -v 的區(qū)別說明
這篇文章主要介紹了Dockerfile 中 VOLUME 與 docker -v 的區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03Docker搭建prometheus(普羅米修斯)的方法步驟
phometheus:當前一套非常流行的開源監(jiān)控和報警系統(tǒng),本文主要介紹了Docker搭建prometheus(普羅米修斯)的方法步驟,具有一定的參考價值,感興趣的可以了解一下2024-02-02記 -bash: docker-compose: command not&nbs
這篇文章主要介紹了記 -bash: docker-compose: command not found 的問題解決方法,本文給大家介紹的非常詳細對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01