Docker資料管理

flynike發表於2021-09-09

Docker在容器中管理資料主要有兩種方式:

  • 資料卷
  • 掛載主機目錄

    資料卷

    是一個可供一個或多個容器使用的特殊容器,它繞過UFS,提供一下特性:

    • 可以在容器之間共享和重用
    • 對資料卷的修改會立馬生效
    • 對資料卷的更新,不會影響映象
    • 預設會一直存在,及時容器被刪除
      注:資料卷的使用,類似於Linux對目錄或檔案進行mount,映象中的被指定為掛載點的目錄中的檔案會被隱藏掉,顯示的是掛載的資料卷。

      資料卷相關指令

    • 建立資料卷

      docker volume create [OPTIONS] [VOLUME]
      Options:
      -d, --driver string   Specify volume driver name (default "local")
      --label list      Set metadata for a volume
      -o, --opt map         Set driver specific options (default map[])
      # e.g
      docker volume create white-vol
    • 檢視所有的資料卷

      docker volume ls
      DRIVER              VOLUME NAME
      local               white-vol
    • 檢視指定資料卷的詳細資訊
      docker volume inspect white-vol
      [
      {
      "CreatedAt": "2018-08-29T17:45:05+08:00",
      "Driver": "local",
      "Labels": {},
      "Mountpoint": "/var/lib/docker/volumes/white-vol/_data",
      "Name": "white-vol",
      "Options": {},
      "Scope": "local"
      }
      ]
    • 啟動一個掛載資料卷的容器

      docker run -d -p 80:80 --name web -v white-vol:/usr/share/nginx/html nginx 
      # 進入資料卷目錄
      cd /var/lib/docker/volumes/white-vol/_data
      ls
      總用量 8
      -rw-r--r--. 1 root root 537 7月  24 21:02 50x.html
      -rw-r--r--. 1 root root 598 8月  29 18:53 index.html
      # 容器中的檔案已經掛載到了宿主機的資料卷中,在當前目錄中新增html或者修改html,在容器中能夠及時更新
      # 也可以透過 docker inspect web 命令檢視容器的詳情中 Mounts塊,檢視資料掛載情況
      docker inspect web
      "Mounts": [
          {
              "Type": "volume",  # 資料卷為volume,直接掛載本機檔案時為bind
              "Name": "white-vol",
              "Source": "/var/lib/docker/volumes/white-vol/_data",
              "Destination": "/usr/share/nginx/html",
              "Driver": "local",
              "Mode": "z",
              "RW": true,
              "Propagation": ""
          }
      ],
    • 刪除資料卷
      docker volume rm [OPTIONS] VOLUME [VOLUME...]
    • 清除所有無主的資料卷
      docker volume prune

      掛載主機目錄

      docker run -d -p 82:80 -v /root/app/webapp:/usr/share/nginx/html nginx 

掛載命令 -v 可以使用 --mount 代替;區別在於使用-v命令當前資料卷或者檔案目錄不存在時,Docker會自動建立資料卷或者檔案目錄,--mount則會直接報錯;
Docker 掛載主機目錄的預設許可權是 讀寫 ,使用者也可以透過增加 readonly 指定為 只讀 。

資料卷和掛載目錄區別:

卷 (Docker Volume) 是受控儲存,是由 Docker 引擎進行管理維護的。因此使用卷,你可以不必處理 uid、SELinux 等各種許可權問題,Docker 引擎在建立卷時會自動新增安全規則,以及根據掛載點調整許可權。並且可以統一列表、新增、刪除。另外,除了本地卷外,還支援網路卷、分散式卷。

而掛載目錄那就沒人管了,屬於使用者自行維護。你就必須手動處理所有許可權問題。特別是在 CentOS 上,很多人碰到 Permission Denied,就是因為沒有使用卷,而是掛載目錄,而且還對 SELinux 安全許可權一無所知導致。

參看資料

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2618/viewspace-2812919/,如需轉載,請註明出處,否則將追究法律責任。

相關文章