1. 程式人生 > >docker容器與宿主機的資料互動

docker容器與宿主機的資料互動

  在生產環境中使用 Docker ,往往需要對資料進行持久化,或者需要在多個容器之間進行資料共享,這必然涉及容器的資料管理操作。

方式一、Docker cp命令

docker cp :用於容器與主機之間的資料拷貝。
語法
# 容器內檔案 copy to 宿主機
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
# 宿主機檔案 copy to 容器內
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS說明:
-L :保持源目標中的連結

操作示例:

宿主機到容器

 容器到宿主機

注:此方式雖然他也可以管理但是資料不交融,基本不會使用,僅做了解

 方式二、Docker資料卷

1. 什麼是volume

  想要了解Docker Volume,首先我們需要知道Docker的檔案系統是如何工作的。Docker映象是由多個檔案系統(只讀層)疊加而成。當我們啟動一個容器的時候,Docker會載入映象層並在其上新增一個讀寫層。如果執行中的容器修改了現有的一個已存在的檔案,那該檔案將會從讀寫層下的只讀層複製到讀寫層,該檔案的只讀版本仍然存在,只是已經被讀寫層中該檔案的副本所隱藏。當刪除Docker容器,並通過該映象重新啟動時,之前的更改將會丟失。在Docker中,只讀層以及在頂部的讀寫層的組合被稱為Union FIle System(聯合檔案系統)。
  為了能夠儲存(持久化)資料以及共享容器間的資料,Docker提出了Volume的概念。簡單來說,Volume就是目錄或者檔案,它可以繞過預設的聯合檔案系統,而以正常的檔案或者目錄的形式存在於宿主機上。

2. 資料卷的特性

• 資料卷 可以在容器之間共享和重用
• 對資料卷的修改會立馬生效
• 對資料卷的更新,不會影響映象
• 資料卷 預設會一直存在,即使容器被刪除

3. 資料卷相關操作

Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

建立資料卷

Usage:  docker volume create [OPTIONS] [VOLUME]
Create a 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[])

檢視所有資料卷

Usage:  docker volume ls [OPTIONS]
List volumes
Aliases:
  ls, list
Options:
  -f, --filter filter   Provide filter values (e.g. 'dangling=true')
      --format string   Pretty-print volumes using a Go template
  -q, --quiet           Only display volume names

檢視單一或多個數據卷詳情

Usage:  docker volume inspect [OPTIONS] VOLUME [VOLUME...]
Display detailed information on one or more volumes
Options:
  -f, --format string   Format the output using the given Go template

刪除單一資料卷

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]
Remove one or more volumes. You cannot remove a volume that is in use by a container.
Aliases:
  rm, remove
Options:
  -f, --force   Force the removal of one or more volumes

刪除所有閒置資料卷

Usage:  docker volume prune [OPTIONS]
Remove all unused local volumes
Options:
      --filter filter   Provide filter values (e.g. 'label=<label>')
  -f, --force           Do not prompt for confirmation

操作示例:

 

4. 資料卷使用

資料卷的使用,類似於 Linux 下對目錄或檔案進行 mount。

使用者可以通過docker run的--volume/-v或--mount選項來建立帶有資料卷的容器

官方文件說明連線:docker run使用說明   --volume使用說明

4.1 --volume使用詳述

引數--volume(或簡寫為-v)只能建立bind mount。示例:

docker run --name $CONTAINER_NAME -it \
-v $PWD/$CONTAINER_NAME/app:/app:rw \
-v $PWD/$CONTAINER_NAME/data:/data:ro \
avocado-cloud:latest /bin/bash

註釋:

• 命令格式:[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]]

• 如果指定HOST-DIR則必須是絕對路徑,如果路徑不存在則會自動建立

• 例項中的rw為讀寫,ro為只讀

如果沒有通過-v指定,那麼Docker會預設幫我們建立匿名資料捲進行對映和掛載。

4.2 --mount 使用詳述

對於--moun選項,目前Docker提供了三種不同型別的資料卷從宿主機掛載到容器中:

(1)volume:普通資料卷(預設即這種型別),Docker管理宿主機檔案系統的一部分,預設位於 /var/lib/docker/volumes 目錄中;

(2)bind mount:繫結資料卷,意為著可以儲存在宿主機系統的任意位置;

*注意:Dockerfile 中不支援這種用法,這是因為 Dockerfile 是為了移植和分享用的。然而,不同作業系統的路徑格式不一樣,所以目前還不能支援。

(3)tmpfs:臨時資料卷,掛載儲存在宿主機系統的記憶體中,而不會寫入宿主機的檔案系統;

三種方式的示意圖如下所示:

 

4.3 -v與-mount的區別

  -mount可以支援建立叢集服務的資料卷,而-v不行。

4.4 補充說明

(1)Docker 掛載資料卷的預設許可權是讀寫,使用者也可以通過 :ro 指定為只讀。

(2)(--mount基本包含了--volume的可選屬性內容)官方建議使用--mount的方式,原文如下:

   Even though there is no plan to deprecate --volume, usage of --mount is recommended.

 方式三、Docker資料卷容器

  資料卷容器也是一個容器,但是它的目的是專門提供資料卷給其他容器掛載,如果使用者需要在多個容器之間共享一些持續更新的資料,最簡單的方式是使用資料卷容器。

 

 

 

資料卷資料備份

 

 

 

 

 宣告:博文內容純屬個人理解,有異議請