溫馨提示×

溫馨提示×

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

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

Docker實現掛載的方式有哪些

發布時間:2023-02-25 15:36:00 來源:億速云 閱讀:96 作者:iii 欄目:開發技術

這篇文章主要講解了“Docker實現掛載的方式有哪些”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Docker實現掛載的方式有哪些”吧!

    Docker實現掛載的方式

    在介紹VOLUME指令之前,我們來看下如下場景需求:

    1.容器是基于鏡像創建的,最后的容器文件系統包括鏡像的只讀層+可寫層,容器中的進程操作的數據持久化都是保存在容器的可寫層上。一旦容器刪除后,這些數據就沒了,除非我們人工備份下來(或者基于容器創建新的鏡像)。能否可以讓容器進程持久化的數據保存在主機上呢?這樣即使容器刪除了,數據還在。

    2. 當我們在開發一個web應用時,開發環境是在主機本地,但運行測試環境是放在docker容器上。這樣的話,我在主機上修改文件(如html,js等)后,需要再同步到容器中。這顯然比較麻煩。

    3. 多個容器運行一組相關聯的服務,如果他們要共享一些數據怎么辦?

    對于這些問題,我們當然能想到各種解決方案。而docker本身提供了一種機制,可以將主機上的某個目錄與容器的某個目錄(稱為掛載點、或者叫卷)關聯起來,容器上的掛載點下的內容就是主機的這個目錄下的內容,這類似linux系統下mount的機制。 這樣的話,我們修改主機上該目錄的內容時,不需要同步容器,對容器來說是立即生效的。 掛載點可以讓多個容器共享。

    一、通過docker run命令

    1.運行命令:docker run --name test -it -v /home/xqh/myimage:/data ubuntu /bin/bash

    其中的 -v 標記 在容器中設置了一個掛載點 /data(就是容器中的一個目錄),并將主機上的 /home/xqh/myimage 目錄中的內容關聯到 /data下。

    這樣在容器中對/data目錄下的操作,還是在主機上對/home/xqh/myimage的操作,都是完全實時同步的,因為這兩個目錄實際都是指向主機目錄。

    2.運行命令:docker run --name test1 -it -v /data ubuntu /bin/bash

    上面-v的標記只設置了容器的掛載點,并沒有指定關聯的主機目錄。這時docker會自動綁定主機上的一個目錄。通過docker inspect 命令可以查看到。

    xqh@ubuntu:~/myimage$ docker inspect test1
    [
    {
        "Id": "1fd6c2c4bc545163d8c5c5b02d60052ea41900a781a82c20a8f02059cb82c30c",
    .............................
        "Mounts": [
            {
                "Name": "0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01",
                "Source": "/var/lib/docker/volumes/0ab0aaf0d6ef391cb68b72bd8c43216a8f8ae9205f0ae941ef16ebe32dc9fc01/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true
            }
        ],

    上面 Mounts下的每條信息記錄了容器上一個掛載點的信息,“Destination” 值是容器的掛載點,"Source"值是對應的主機目錄??梢钥闯鲞@種方式對應的主機目錄是自動創建的,其目的不是讓在主機上修改,而是讓多個容器共享。

    二、通過dockerfile創建掛載點

    上面介紹的通過docker run命令的-v標識創建的掛載點只能對創建的容器有效。通過dockerfile的 VOLUME 指令可以在鏡像中創建掛載點,這樣只要通過該鏡像創建的容器都有了掛載點。

    還有一個區別是,通過 VOLUME 指令創建的掛載點,無法指定主機上對應的目錄,是自動生成的。

    #test
    FROM ubuntu
    MAINTAINER hello1
    VOLUME ["/data1","/data2"]

    上面的dockfile文件通過VOLUME指令指定了兩個掛載點 /data1 和 /data2.

    我們通過docker inspect 查看通過該dockerfile創建的鏡像生成的容器,可以看到如下信息

    "Mounts": [
        {
            "Name": "d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21",
            "Source": "/var/lib/docker/volumes/d411f6b8f17f4418629d4e5a1ab69679dee369b39e13bb68bed77aa4a0d12d21/_data",
            "Destination": "/data1",
            "Driver": "local",
            "Mode": "",
            "RW": true
        },
        {
            "Name": "6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36",
            "Source": "/var/lib/docker/volumes/6d3badcf47c4ac5955deda6f6ae56f4aaf1037a871275f46220c14ebd762fc36/_data",
            "Destination": "/data2",
            "Driver": "local",
            "Mode": "",
            "RW": true
        }
    ],

    可以看到兩個掛載點的信息。

    三、容器共享卷(掛載點)

    下面我們創建另一個容器可以和test1(已經創建好的容器)共享 /data1 和 /data2卷,這是在 docker run中使用 --volumes-from標記,如:

    可以是來源不同鏡像,如:

    docker run --name test2 -it --volumes-from test1 ubuntu /bin/bash

    也可以是同一鏡像,如:

    docker run --name test3 -it --volumes-from test1 myimage /bin/bash

    上面的三個容器 test1 , test2 , test3 均有 /data1 和 /data2 兩個目錄,且目錄中內容是共享的,任何一個容器修改了內容,別的容器都能獲取到。

    四、最佳實踐:數據容器

    如果多個容器需要共享數據(如持久化數據庫、配置文件或者數據文件等),可以考慮創建一個特定的數據容器,該容器有1個或多個卷。

    其它容器通過–volumes-from 來共享這個數據容器的卷。

    因為容器的卷本質上對應主機上的目錄,所以這個數據容器也不需要啟動。

    如: docker run --name dbdata myimage echo “data container”

    說明:有個卷,容器之間的數據共享比較方便,但也有很多問題需要解決,如權限控制、數據的備份、卷的刪除等。以后在介紹。

    關于Docker中掛載的解釋

    現在有這么一個命令:

    docker run -p 33061:3306 --name mysql  --restart=always -e MYSQL_ROOT_PASSWORD=pisen  -v /etc/localtime:/etc/localtime:ro  -v /etc/timezone:/etc/timezone:ro  -d mysql:5.7

    因為著重要說掛載的問題,就單獨揪出來參數來說

    -v /etc/localtime:/etc/localtime:ro

    就是將  宿主機的/etc/localtime文件掛載到容器的/etc/localtime 文件,并且容器內的/etc/localtime文件設置為只讀(:ro)

    實際的效果就是mysql容器啟動后,時間時區的設置,使用的就是宿主機的 /etc/localtime 文件內設置的內容起作用。

    如果沒有設置只讀的情況下,該掛載實現的效果是:

    情況1:使用echo命令去修改

    echo 'lq' > timezone

    無論更改宿主機上的/etc/localtime文件內容還是修改容器內的/etc/localtime文件內容,都會影響到對方?! ?/p>

    情況2:使用vi命令去修改

    vi timezone

    則無論修改哪邊都不會影響到另外一方的文件內容。

    感謝各位的閱讀,以上就是“Docker實現掛載的方式有哪些”的內容了,經過本文的學習后,相信大家對Docker實現掛載的方式有哪些這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

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

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女