日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

目錄
  • 相同之處
  • 不同之處
  • volume 相對于 bind mount的 優點
  • volume操作
  • 創建容器,使用volume
  • 停止容器、移除容器
  • 移除volume
  • 使用容器填充volume
  • 以只讀方式掛載volume
  • bind mount
  • 使用bind mount啟動容器
  • 綁定到容器的非空目錄
  • 總結

不知道你在使用docker的時候,有沒有注意到 volume mount和bind mount的使用? 進一步說,他們之間的區別到底是什么?

接下來的內容,我們就為你揭開他們的神秘面紗。

相同之處

首先,說相同之處:

volume和bind mount都是持久化容器的機制。

不同之處

再來說說,他們的不同之處:

volume是由docker來進行管理的,而bind mount完全是依賴于主機的目錄結構和操作系統

volume 相對于 bind mount的 優點

  • volume更加容易進行備份和遷移
  • 可以通過docker客戶端命令或者docker api來管理volume (比如:docker volume命令)
  • volume可以在linux和windows容器中運行
  • volume可以更加安全的在多個容器之間進行共享
  • volume驅動程序允許在遠程主機或云提供商上存儲卷,以加密volume的內容或添加其他功能
  • 新volume的內容可以由容器預先填充
  • Docker Desktop上的卷比Mac和Windows主機上的綁定掛載具有更高的性能。

此外,與將數據持久化到容器的可寫層相比,volume通常是更好的選擇,因為volume不會增加使用它的容器的大小,而且volume的內容存在于給定容器的生命周期之外。

也就是說,當容器被移除了之后,volume中的內容還是可以獨立存在的。

下圖演示了volume和bind mount,以及和容器之間的關系圖:

docker中的volume和bind?mount區別講解

我們可以看到:

  • volume是可docker的存儲區域相關的
  • bind mount是直接和操作系統相關的

下面,我們分別展示,volume的掛載、使用的一些操作

volume操作

創建容器,使用volume

我們可以通過下面的命令創建一個容器,使用volume

docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

其中:-v選項,后面的第一個參數myvol2就是volume的名字,如果在容器使用volume時,volume不存在,那么會自動創建這個volume

[root@centos7 ~]# docker volume ls
DRIVER    VOLUME NAME
local     myvol2
[root@centos7 ~]#

可以查看該volume在docker 宿主機上的具體的路徑

[root@centos7 ~]# docker volume inspect myvol2
[
    {
        "CreatedAt": "2022-08-23T22:04:20-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/myvol2/_data",
        "Name": "myvol2",
        "Options": null,
        "Scope": "local"
    }
]
[root@centos7 ~]#

Mountpoint就指明了這個volume在文件系統上的具體位置。

容器通過:-v myvol2:/app 將volume掛載到容器的/app目錄中

[root@centos7 ~]# docker exec -it devtest df -h
Filesystem               Size  Used Avail Use% Mounted on
overlay                   50G  3.0G   48G   6% /
tmpfs                     64M     0   64M   0% /dev
tmpfs                    1.4G     0  1.4G   0% /sys/fs/cgroup
shm                       64M     0   64M   0% /dev/shm
/dev/mapper/centos-root   50G  3.0G   48G   6% /app
tmpfs                    1.4G     0  1.4G   0% /proc/asound
tmpfs                    1.4G     0  1.4G   0% /proc/acpi
tmpfs                    1.4G     0  1.4G   0% /proc/scsi
tmpfs                    1.4G     0  1.4G   0% /sys/firmware
[root@centos7 ~]#

向/app目錄寫文件:

docker exec -it devtest bash -c "echo test > /app/myfile.test"

查看卷中的文件是否已經被創建

[root@centos7 ~]# cd /var/lib/docker/volumes/myvol2/_data
[root@centos7 _data]# ls
myfile.test
[root@centos7 _data]# cat myfile.test 
test
[root@centos7 _data]#

沒錯,確實這個文件就是寫到了這個目錄中了。

注意:這個volume的內容寫的過程是由docker來進行管理的。

查看容器中mount信息

docker inspect devtest
        "Mounts": [
            {
                "Type": "volume",
                "Name": "myvol2",
                "Source": "/var/lib/docker/volumes/myvol2/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ]

可以看到Mounts部分的信息:

  • Type: volume
  • Source:就是在宿主機上的具體的目錄位置
  • Destination: 容器中的掛載路徑
  • Driver: volume的驅動程序類型
  • RW: 是否是讀寫模式

停止容器、移除容器

docker stop devtest
docker rm devtest

容器移除后,volume是否還存在嗎?

[root@centos7 _data]# docker volume ls
DRIVER    VOLUME NAME
local     myvol2
[root@centos7 _data]# ls
myfile.test
[root@centos7 _data]# cat myfile.test 
test
[root@centos7 _data]#

和你想的一模一樣,volume還在,其中的寫入的內容,仍然存在

移除volume

docker volume rm  myvol2

注意!

移除容器和移除volume是2個獨立的操作。

使用容器填充volume

另外一個 非常重要的點 :如果將volume掛載到目錄中,如果目錄中原來就是有文件或子目錄的,那么掛載之后,會將內容拷貝到卷中來。

啥意思?

比如,我們有個鏡像,在/app目錄下有個a.log文件

[root@centos7 test-volume]# ls
a.log  Dockerfile
[root@centos7 test-volume]# cat a.log 
123456
12345
[root@centos7 test-volume]# cat Dockerfile 
from nginx:latest
RUN mkdir /app
copy a.log /app/a.log
[root@centos7 test-volume]#
# 構建鏡像
docker build -t vol:2 .

掛載數據卷

docker run -d   --name=vo3   -v nginx-vo3:/app   vol:2

發現容器運行后,/app目錄下的文件,被拷貝到volume中

[root@centos7 test-volume]# cd /var/lib/docker/volumes/nginx-vo3/_data
[root@centos7 _data]# ls
a.log
[root@centos7 _data]# cat a.log 
123456
12345
[root@centos7 _data]#

而沒有,覆蓋!這個點,十分的有意思!之前肯定你沒有關注過!

以只讀方式掛載volume

如何以只讀的方式掛載volume,方法非常的簡單:

只需要加上ro選項即可

-v nginx-vol:/usr/share/nginx/html:ro

示例:

docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx:latest

查看容器的Mounts部分的信息

docker inspect nginxtest
"Mounts": [
            {
                "Type": "volume",
                "Name": "nginx-vol",
                "Source": "/var/lib/docker/volumes/nginx-vol/_data",
                "Destination": "/usr/share/nginx/html",
                "Driver": "local",
                "Mode": "ro",
                "RW": false,
                "Propagation": ""
            }
        ]

發現:"RW": false,也就是,非Read-Write的模式

試試向其中寫入文件:

[root@centos7 ~]# docker exec -it nginxtest bash -c "echo 1234 > /usr/share/nginx/html/1.log "
bash: line 1: /usr/share/nginx/html/1.log: Read-only file system
[root@centos7 ~]#

和你猜的一樣,會提示:只讀文件系統。

OK,OK,說完了volume的原理,相關的操作,接下來,要看的就是bind mount

bind mount

使用bind mount時,將宿主機上的文件或者目錄掛載到容器上。文件或者目錄在主機上,是以絕對路徑的方式來使用。

相比之下,當使用volume時,在主機上的Docker存儲目錄中創建一個新目錄,由Docker管理該目錄的內容。

要掛載的文件或目錄不需要在Docker主機上已經存在。如果它還不存在,則按需創建它。bind mount的性能非常好,但是它們依賴于主機的文件系統具有特定的目錄結構。

建議:如果你正在開發新的Docker應用程序,請考慮使用命名的volume。因為,對于bind mount來說,你不能使用Docker CLI命令來直接管理。

使用bind mount啟動容器

使用以下得命令,將一個容器通過bind 掛載的方式,將宿主機的目錄,掛載到容器中

docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app \
  nginx:latest

查看容器的bind掛載情況

docker inspect devtest
"Mounts": [
            {
                "Type": "bind",
                "Source": "/tmp/source/target/target",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

可以看到

  • Type : 掛載的類型是bind
  • source: 宿主機上的目錄,當然這里使用$(pwd)變量來獲取當前的工作目錄

關閉、刪除容器

docker container stop devtest
 docker container rm devtest

OK,接下來的這個點,非常的關鍵,如果綁定掛載到容器中的一個非空的目錄會如何?

綁定到容器的非空目錄

nginx鏡像中/usr/share/nginx/html是非空的,有登錄頁

docker run -d \
  -it \
  --name non-empty \
  -v /tmp/soure/base:/usr/share/nginx/html \
  nginx:latest  
[root@centos7 base]# docker exec -it non-empty ls /usr/share/nginx/html
[root@centos7 base]#

發現,掛載了之后,是空的,也就是把鏡像中的內容給覆蓋了。

這個和volume是一個巨大的區別! 注意 !

總結

OK,我們這里總結一下,讓你更好的理解voLume 和 bind 類型的掛載的區別:

  • 管理方式,volume由docker管理,docker客戶端命令可操作,bind掛載不行
  • 容器中有內容的目錄,volume會復制,bind mount直接將容器中的內容覆蓋
  • bind mount可以設置 bind 傳播參數。
  • volume可以設置驅動程序

后面的文章中,會帶你看看,如何安裝volume驅動,來創建特定類型的volume,實現多個節點間的數據共享······

分享到:
標簽:Docker volume 區別 服務器 講解
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定