<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • docker學習筆記(4)- 應用數據管理(容器外)

    簡介

    docker storage driver支持了image分層存儲和容器可寫層的存儲管理,使用掛載主機目錄的方式可以將數據存儲在主機的文件系統上或內存中。

    1. 之前學習過鏡像的分層存儲,以Dockerfile構建鏡像每行有關數據寫入的命令會給鏡像增加一層,容器基于鏡像啟動,會在鏡像最上層之上再啟動一層可寫層(writable layer),如果容器被刪除,那么該可寫層也會消失,所以容器內的可寫層不宜用來對需要持久化的數據做存儲,應當存儲一些臨時數據,這些數據不影響應用的后續使用,比如之前使用的busybox用來執行wget、ping等命令,執行期間產生的數據我們無需保存,即使容器被刪除,后面再次使用時啟動新容器還是可以達到相同的目的。
    2. 可以使用volumes和bind mounts的方式將數據存儲在主機上,這樣即使容器被刪除,數據仍然在,而且很容的對數據進行遷移與共享。
    3. 由于容器可寫層需要storage dirver的支持,需要通過內核提供一個union filesystem,維護了額外的數據結構,相較于直接使用數據卷性能更差些,具體的實現方式在后面研究相關底層技術再記錄,先整理下存儲卷的相關知識。

    掛載方式

    有三種掛載方式將容器內部數據存儲到主機上,Volumes、bind mounts、tmpfs mounts

    Volumes

    由docker創建和管理,主機上的其他程序不可修改,將數據卷存儲在主機的一片區域上(linux路徑/var/lib/docker/volumes/),使用某個volume其實是將該volume在主機上的目錄mount到容器內,如果該目錄下已有內容,則原有的數據會被復制到volume中。

    使用場景

    1. 多個容器共享數據,多個容器可以同時掛載一個volume
    2. 允許使用volume driver,不需要更改應用程序,通過更換volume dirvier存儲容器數據到遠端主機或云端(例如NFS or S3)
    3. 備份和遷移數據
    # 創建volume
    docker volume create volume-test1
    # 查看volume詳細信息
    docker volume inspect volume-test1
    # 刪除volume,只有沒有任何容器使用時才可刪除(包括停止的容器)
    docker volume rm volume-test1
    

    啟動容器時指定volume參數

    # 啟動容器nginx1,卷volume-test1掛載到nginx1內部的/app路徑下
    docker run -d \
      --name nginx1 \
      --mount source=volume-test1,target=/app \
      nginx:latest
    
    • 如果將新建的volume掛載到容器某個目錄下,并且該目錄下已有內容,那么會將這些內容拷貝到volume中,其他容器使用該volume時也可以看到

    使用volume driver

    例如,使用vieux/sshfs驅動允許容器使用sshfs掛載遠端文件夾

    # 下載vieux/sshfs驅動插件
    docker plugin install --grant-all-permissions vieux/sshfs
    # 使用vieux/sshfs驅動創建volume,驅動配置選項通過-o指定
    docker volume create --driver vieux/sshfs \
      -o sshcmd=test@node2:/home/test \
      -o password=testpassword \
      sshvolume1
    
    # 啟動時創建并使用volume,volume-opt指定使用volume需要的參數
    docker run -d \
      --name sshfs-container \
      --volume-driver vieux/sshfs \
      --mount src=sshvolume2,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
      nginx:latest
    

    創建CIFS/Samba volume,可以直接使用容器掛載samba文件夾

    # local是默認的driver
    docker volume create \
        --driver local \
        --opt type=cifs \
        --opt device=//uxxxxx.your-server.de/backup \
        --opt o=addr=uxxxxx.your-server.de,username=uxxxxxxx,password=*****,file_mode=0777,dir_mode=0777 \
        --name cif-volume
    

    備份volume

    # 創建一個容器dbstore
    docker run -v /app --name dbstore ubuntu /bin/bash
    # 再創建一個新容器,將主機當前目錄$(pwd)掛載到新容器/backup目錄下,新容器與容器dbstore共享其volume,之后運行新容器執行tar cvf /backup/backup.tar /app將/app目錄歸檔到/backup/backup.tar下面(即主機$(pwd)下面)
    docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /app
    

    恢復

    # 創建新的容器 
    docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
    # 共享新容器的volume卷,并將備份文件所在目錄$(pwd)掛載到當前容器/backup下,解壓backup.tar到容器dbstore2的/dbdata
    docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar"
    

    bind mounts

    1. 與volume不同的是,除了可以掛載目錄,還可以掛載文件到容器內。

    2. 可以提供更好的性能,具體效果依賴主機使用的文件系統。

    3. 因為使用絕對路徑與主機目錄綁定,所以容器的移植性較volume更弱,隔離性差(其他程序也可以修改該路徑的內容)。

    4. 可以對容器設置只讀或讀寫權限

    使用場景

    1. 將源代碼目錄掛載到容器中,在主機修改代碼,可以看到容器應用的變化效果
    2. 共享主機文件到容器,比如將主機的/etc/resolv.conf掛載到容器,為容器提供DNS解析

    使用bind mounts

    # 使用bind mounts,將主機target目錄掛載到容器/app下,容器對該目錄有只讀權限
    docker run -d \
      -it \
      --name devtest \
      --mount type=bind,source="$(pwd)"/target,target=/app,readonly \
      nginx:latest
    
    • 如果容器目錄已有內容,將主機目錄bind mounts到該目錄下時,容器該目錄下原有的內容被隱藏,只顯示主機目錄下已有的內容

    tmpfs mounts

    tmpfs mounts方式與上兩種不同,是將容器內該掛載點下的內容寫到主機內存中,容器停止時候,掛載點被移除,這些內容就會丟失。

    使用場景

    1. 存放一些臨時的敏感信息(不想將其存放到主機或容器中)
    2. 容器應用需要寫入大量的非持久化數據時提高性能

    使用tmpfs mounts

    # 運行容器,使用tmpfs mounts到容器的/app目錄下,設置容器內使用權限為770,/app目錄大小為10M
    docker run -d -it \
      --name tmptest \
      --mount type=tmpfs,destination=/app,tmpfs-mode=1770 tmpfs-size=10m\
      nginx:latest
    
    • 默認tmpfs mounts不對目錄大小做限制

    小結

    對于以上三種掛載方式,bind mounts與volumes的使用與功能差異較小,通過表格的方式對比下:

    對比項(source:主機;dest:容器) bind mount volume
    創建時主機路徑不在 報錯 自動創建
    source路徑 使用時指定 /var/lib/docker/volumes
    source路徑為空 隱藏dest,顯示source內容 將dest內容復制到source后顯示source內容
    source路徑不為空 隱藏dest,顯示source內容 隱藏dest,顯示source內容
    可移植性 弱(綁定主機路徑) 強(docker完全控制,不依賴主機路徑)
    主機程序訪問 容易(chown修改用戶組即可訪問) 受限(需root用戶)

    學習自:

    《Docker技術入門與實戰(第3版)》Nigel,Poulton(奈吉爾·波爾頓) 著,李瑞豐,劉康 譯
    《深入淺出Docker》楊保華,戴王劍,曹亞侖 著
    https://docs.docker.com/

    https://shichen.blog.csdn.net/article/details/106292036

    posted @ 2022-03-24 00:05  Hui_Tong  閱讀(249)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看