詳解Docker掛載本地目錄及實(shí)現(xiàn)文件共享的方法
docker掛載本地目錄的方法總結(jié):
Docker容器啟動(dòng)的時(shí)候,如果要掛載宿主機(jī)的一個(gè)目錄,可以用-v參數(shù)指定。
譬如我要啟動(dòng)一個(gè)centos容器,宿主機(jī)的/test目錄掛載到容器的/soft目錄,可通過(guò)以下方式指定:
# docker run -it -v /test:/soft centos /bin/bash
這樣在容器啟動(dòng)后,容器內(nèi)會(huì)自動(dòng)創(chuàng)建/soft的目錄。通過(guò)這種方式,我們可以明確一點(diǎn),即-v參數(shù)中,冒號(hào)":"前面的目錄是宿主機(jī)目錄,后面的目錄是容器內(nèi)目錄。
貌似簡(jiǎn)單,其實(shí)不然,下面我們來(lái)驗(yàn)證一下:
一、容器目錄不可以為相對(duì)路徑
[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'.
直接報(bào)錯(cuò),提示soft不是一個(gè)絕對(duì)路徑,所謂的絕對(duì)路徑,必須以下斜線“/”開(kāi)頭。
二、宿主機(jī)目錄如果不存在,則會(huì)自動(dòng)生成
如果宿主機(jī)中存在/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
啟動(dòng)容器
[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
查看宿主機(jī),發(fā)現(xiàn)新增了一個(gè)/test目錄
[root@localhost ~]# ls / bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys test tmp usr var
三、宿主機(jī)的目錄如果為相對(duì)路徑呢?
這次,我們換個(gè)目錄名test1試試
# docker run -it -v test1:/soft centos /bin/bash
再到宿主機(jī)上查看是否新增了一個(gè)/test1目錄,結(jié)果沒(méi)有,是不是因?yàn)槲矣玫氖窍鄬?duì)路徑,所以生成的test1目錄在當(dāng)前目錄下,結(jié)果發(fā)現(xiàn)還是沒(méi)有。那容器內(nèi)的/soft目錄掛載到哪里去了?通過(guò)docker inspect命令,查看容器“Mounts”那一部分,我們可以得到這個(gè)問(wèn)題的答案。
"Mounts":[
{
"Name": "test1",
"Source": "/var/lib/docker/volumes/test1/_data",
"Destination": "/soft",
"Driver": "local",
"Mode": "z",
"RW": true
}
],
可以看出,容器內(nèi)的/soft目錄掛載的是宿主機(jī)上的/var/lib/docker/volumes/test1/_data目錄
原來(lái),所謂的相對(duì)路徑指的是/var/lib/docker/volumes/,與宿主機(jī)的當(dāng)前目錄無(wú)關(guān)。
四、如果只是-v指定一個(gè)目錄,這個(gè)又是如何對(duì)應(yīng)呢?
啟動(dòng)一個(gè)容器
[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命令查看宿主機(jī)的掛載目錄
"Mounts":[
{
"Name": "96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a",
"Source": "/var/lib/docker/volumes/96256232eb74edb139d652746f0fe426e57fbacdf73376963e3acdb411b3d73a/_data",
"Destination": "/test2",
"Driver": "local",
"Mode": "",
"RW": true
}
],
可以看出,同3中的結(jié)果類(lèi)似,只不過(guò),它不是相對(duì)路徑的目錄名,而是隨機(jī)生成的一個(gè)目錄名。
五、如果在容器內(nèi)修改了目錄的屬主和屬組,那么對(duì)應(yīng)的掛載點(diǎn)是否會(huì)修改呢?
首先開(kāi)啟一個(gè)容器,查看容器內(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/
查看宿主機(jī)內(nèi)/test目錄的屬性
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 root root 6 Sep 24 11:48 /test/
在容器內(nèi)新建用戶(hù),修改/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/
再來(lái)看看宿主機(jī)內(nèi)/test目錄的屬主和屬組是否會(huì)發(fā)生變化?
[root@localhost ~]# ll -d /test/ drwxr-xr-x 2 mycat mycat 6 Sep 24 11:48 /test/
竟然變?yōu)閙ycat了。。。
原來(lái),這個(gè)與UID有關(guān)系,UID,即“用戶(hù)標(biāo)識(shí)號(hào)”,是一個(gè)整數(shù),系統(tǒng)內(nèi)部用它來(lái)標(biāo)識(shí)用戶(hù)。一般情況下它與用戶(hù)名是一一對(duì)應(yīng)的。
首先查看容器內(nèi)victor對(duì)應(yīng)的UID是多少,
[root@b5ed8216401f /]# cat /etc/passwd | grep victor victor:x:1000:1000::/home/victor:/bin/bash
victor的UID為1000,那么宿主機(jī)內(nèi)1000對(duì)應(yīng)的用戶(hù)是誰(shuí)呢?
[root@localhost ~]# cat /etc/passwd |grep 1000 mycat:x:1000:1000::/home/mycat:/bin/bash
可以看出,宿主機(jī)內(nèi)UID 1000對(duì)應(yīng)的用戶(hù)是mycat。
六、容器銷(xiāo)毀了,在宿主機(jī)上新建的掛載目錄是否會(huì)消失?
在這里,主要驗(yàn)證兩種情況:一、指定了宿主機(jī)目錄,即 -v /test:/soft。二、沒(méi)有指定宿主機(jī)目錄,即-v /soft
第一種情況:
[root@localhost ~]# rm-rf/test
--首先刪除宿主機(jī)的/test目錄
[root@localhost ~]# ls / --可以看到,宿主機(jī)上無(wú)/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 --啟動(dòng)容器,為了刪除方便,我用--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
可以看出,即便容器銷(xiāo)毀了,新建的掛載目錄不會(huì)消失。進(jìn)一步也可驗(yàn)證,如果宿主機(jī)目錄的屬主和屬組發(fā)生了變化,容器銷(xiāo)毀后,宿主機(jī)目錄的屬主和屬組不會(huì)恢復(fù)到掛載之前的狀態(tài)。
第二種情況,通過(guò)上面的驗(yàn)證知道,如果沒(méi)有指定宿主機(jī)的目錄,則容器會(huì)在/var/lib/docker/volumes/隨機(jī)配置一個(gè)目錄,那么我們看看這種情況下的容器銷(xiāo)毀是否會(huì)導(dǎo)致相應(yīng)目錄的刪除
首先啟動(dòng)容器
[root@localhost ~]# docker run -it --name=centos_test -v /soft centos /bin/bash [root@6b75579ec934 /]# exit exit
通過(guò)docker inspect命令查看容器在宿主機(jī)上生成的掛載目錄
"Mounts":[
{
"Name": "b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301",
"Source": "/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data",
"Destination": "/soft",
"Driver": "local",
"Mode": "",
"RW": true
}
],
對(duì)應(yīng)的是/var/lib/docker/volumes/b53164cb1c9f1917788638692fb22ad11994cf1fbbc2461b6c390cd3e10ea301/_data目錄
銷(xiāo)毀容器,看目錄是否存在
[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服務(wù),該目錄依舊存在
[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
七、掛載宿主機(jī)已存在目錄后,在容器內(nèi)對(duì)其進(jìn)行操作,報(bào)“Permission denied”。
可通過(guò)兩種方式解決:
1> 關(guān)閉selinux。
臨時(shí)關(guān)閉:# setenforce 0
永久關(guān)閉:修改/etc/sysconfig/selinux文件,將SELINUX的值設(shè)置為disabled。
2> 以特權(quán)方式啟動(dòng)容器
指定--privileged參數(shù)
如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash
docker掛載本地目錄實(shí)現(xiàn)文件共享:
Docker可以支持把一個(gè)宿主機(jī)上的目錄掛載到鏡像里。
docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash
通過(guò)-v參數(shù),冒號(hào)前為宿主機(jī)目錄,必須為絕對(duì)路徑,冒號(hào)后為鏡像內(nèi)掛載的路徑。

現(xiàn)在鏡像內(nèi)就可以共享宿主機(jī)里的文件了。
默認(rèn)掛載的路徑權(quán)限為讀寫(xiě)。如果指定為只讀可以用:ro
docker run -it -v /home/dock/Downloads:/usr/Downloads:ro ubuntu64 /bin/bash
docker還提供了一種高級(jí)的用法。叫數(shù)據(jù)卷。
數(shù)據(jù)卷:“其實(shí)就是一個(gè)正常的容器,專(zhuān)門(mén)用來(lái)提供數(shù)據(jù)卷供其它容器掛載的”。感覺(jué)像是由一個(gè)容器定義的一個(gè)數(shù)據(jù)掛載信息。其他的容器啟動(dòng)可以直接掛載數(shù)據(jù)卷容器中定義的掛載信息。
看示例:
docker run -v /home/dock/Downloads:/usr/Downloads --name dataVol ubuntu64 /bin/bash
創(chuàng)建一個(gè)普通的容器。用--name給他指定了一個(gè)名(不指定的話(huà)會(huì)生成一個(gè)隨機(jī)的名子)。

再創(chuàng)建一個(gè)新的容器,來(lái)使用這個(gè)數(shù)據(jù)卷。
docker run -it --volumes-from dataVol ubuntu64 /bin/bash
--volumes-from用來(lái)指定要從哪個(gè)數(shù)據(jù)卷來(lái)掛載數(shù)據(jù)。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker報(bào)錯(cuò)Operation?not?permitted問(wèn)題的解決方法
剛開(kāi)始接觸Docker的朋友經(jīng)常會(huì)遇到問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Docker報(bào)錯(cuò)Operation?not?permitted問(wèn)題的解決方法,需要的朋友可以參考下2023-02-02
解決docker容器與宿主機(jī)相差8小時(shí)的問(wèn)題
使用docker-compose部署時(shí),在輸出的日志以及相關(guān)事件校驗(yàn)及輸出時(shí),導(dǎo)致事件與現(xiàn)實(shí)相差8小時(shí)。糾結(jié)怎么回事呢?下面小編給大家分享下解決docker容器與宿主機(jī)相差8小時(shí)的問(wèn)題,一起看看吧2021-09-09
docker找不到鏡像無(wú)法成功下載ragflow-main的問(wèn)題解決辦法
這篇文章主要介紹了docker找不到鏡像無(wú)法成功下載ragflow-main的問(wèn)題解決辦法,文中通過(guò)代碼及圖文將解決的辦法介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用docker具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2025-04-04
Portainer部署和添加其他docker服務(wù)器的方法
文章介紹了如何部署Portainer并添加其他Docker服務(wù)器,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧2025-03-03
解決Docker警告:Your kernel does not support&
這篇文章主要介紹了解決Docker警告:Your kernel does not support swap limit capabilities or the cgroup is not mounted問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04
Docker鏡像的導(dǎo)入導(dǎo)出的實(shí)現(xiàn)方法
這篇文章主要介紹了Docker鏡像的導(dǎo)入導(dǎo)出的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
docker容器通信參數(shù)使用及l(fā)ink參數(shù)介紹
這篇文章主要介紹了docker容器通信參數(shù)使用及l(fā)ink參數(shù)介紹,link的原理就是在/etc/hosts里面添加了一個(gè)alias的名稱(chēng),本文通過(guò)案例分析給大家詳細(xì)講解,需要的朋友可以參考下2022-09-09

