中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用Docker掛載本地目錄及實現文件共享

發布時間:2022-05-20 15:53:51 來源:億速云 閱讀:276 作者:iii 欄目:大數據

這篇文章主要介紹“怎么用Docker掛載本地目錄及實現文件共享”,在日常操作中,相信很多人在怎么用Docker掛載本地目錄及實現文件共享問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”怎么用Docker掛載本地目錄及實現文件共享”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

docker掛載本地目錄的方法總結:

docker容器啟動的時候,如果要掛載宿主機的一個目錄,可以用-v參數指定。

譬如我要啟動一個centos容器,宿主機的/test目錄掛載到容器的/soft目錄,可通過以下方式指定:

# docker run -it -v /test:/soft centos /bin/bash

這樣在容器啟動后,容器內會自動創建/soft的目錄。通過這種方式,我們可以明確一點,即-v參數中,冒號":"前面的目錄是宿主機目錄,后面的目錄是容器內目錄。

貌似簡單,其實不然,下面我們來驗證一下:

一、容器目錄不可以為相對路徑

[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

查看宿主機,發現新增了一個/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目錄在當前目錄下,結果發現還是沒有。那容器內的/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/,與宿主機的當前目錄無關。

四、如果只是-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中的結果類似,只不過,它不是相對路徑的目錄名,而是隨機生成的一個目錄名。

五、如果在容器內修改了目錄的屬主和屬組,那么對應的掛載點是否會修改呢?

首先開啟一個容器,查看容器內/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。

六、容器銷毀了,在宿主機上新建的掛載目錄是否會消失?

在這里,主要驗證兩種情況:一、指定了宿主機目錄,即 -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參數指定了容器的名字
[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

七、掛載宿主機已存在目錄后,在容器內對其進行操作,報“permission denied”。

可通過兩種方式解決:

1> 關閉selinux。

臨時關閉:# setenforce 0

永久關閉:修改/etc/sysconfig/selinux文件,將selinux的值設置為disabled。

2> 以特權方式啟動容器

指定--privileged參數

如:# docker run -it --privileged=true -v /test:/soft centos /bin/bash

docker掛載本地目錄實現文件共享:

docker可以支持把一個宿主機上的目錄掛載到鏡像里。

docker run -it -v /home/dock/downloads:/usr/downloads ubuntu64 /bin/bash

通過-v參數,冒號前為宿主機目錄,必須為絕對路徑,冒號后為鏡像內掛載的路徑。

怎么用Docker掛載本地目錄及實現文件共享

現在鏡像內就可以共享宿主機里的文件了。

默認掛載的路徑權限為讀寫。如果指定為只讀可以用:ro

docker run -it -v /home/dock/downloads:/usr/downloads:ro ubuntu64 /bin/bash

docker還提供了一種高級的用法。叫數據卷。

數據卷:“其實就是一個正常的容器,專門用來提供數據卷供其它容器掛載的”。感覺像是由一個容器定義的一個數據掛載信息。其他的容器啟動可以直接掛載數據卷容器中定義的掛載信息。

看示例:

docker run -v /home/dock/downloads:/usr/downloads --name datavol ubuntu64 /bin/bash

創建一個普通的容器。用--name給他指定了一個名(不指定的話會生成一個隨機的名子)。

怎么用Docker掛載本地目錄及實現文件共享

再創建一個新的容器,來使用這個數據卷。

docker run -it --volumes-from datavol ubuntu64 /bin/bash

--volumes-from用來指定要從哪個數據卷來掛載數據。

到此,關于“怎么用Docker掛載本地目錄及實現文件共享”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

开远市| 定结县| 内乡县| 定西市| 灵石县| 文登市| 白水县| 景谷| 饶河县| 宜川县| 华宁县| 江口县| 安龙县| 大邑县| 来凤县| 蕉岭县| 濮阳市| 杭州市| 阿巴嘎旗| 芮城县| 玛多县| 楚雄市| 萝北县| 伊吾县| 杭州市| 衡阳县| 垣曲县| 汝城县| 黄龙县| 肃南| 镇原县| 依安县| 古丈县| 汕尾市| 佛冈县| 会同县| 资溪县| 曲阜市| 黑水县| 米林县| 清新县|