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資料卷容器
資料卷容器也是一個容器,但是它的目的是專門提供資料卷給其他容器掛載,如果使用者需要在多個容器之間共享一些持續更新的資料,最簡單的方式是使用資料卷容器。
資料卷資料備份
宣告:博文內容純屬個人理解,有異議請