docker 學習筆記——第五集(數據卷)

這一集下先從一張圖開始 html

數據管理

這張圖來自於 docker 官方,主要描述了主機和 docker 間的數據溝通的 3 種方式。分別是 bind mountvolumetmpfs mount。此次主要學習前兩種方式。讓咱們開始吧~nginx

volume (數據卷)

如下內容摘抄自 docker 官方文檔 程序員

咱們知道默認狀況下,在容器內建立的全部文件都存儲在可寫容器層上,這意味着:docker

  • 當容器再也不存在時,數據不會持久存在,並且若是另外一個進程須要數據,就很難從容器中取出數據。
  • 容器可寫層與容器運行的主機緊密耦合。您不能輕易地將數據移動到其餘地方。
  • 寫入到容器的可寫層須要一個存儲驅動程序來管理文件系統。存儲驅動程序提供使用Linux內核的聯合文件系統。與使用直接寫入主機文件系統的數據卷相比,這種額外的抽象下降了性能。

經過上面的內容告訴咱們,不要在容器內容寫入數據,而要使用 volume瀏覽器

那麼數據卷是怎麼存儲數據的呢?bash

docker 默認在主機上會有一個特定的區域 /var/lib/docker/volumes/ (Linux),該區域用來存放 volume。

實例演示

// 建立一個 volume 名爲 my-data  
$ docker volume create my-data  
my-data  
  
// 建立一個 名爲 nginx1 的 nginx 容器並使用 my-data 爲 nginx 的主目錄  
$ docker run -d -p 8080:80 --name nginx1  --mount source=nginx-data,target=/usr/share/nginx/html nginx  
  
814dea34b7dbf2afd724d12ad50254e2a749f0b65684f04c730ac04181857d04  
  
// 查看容器的狀態  
$ docker container ls --format "table {{.Image}}t{{.ID}}t{{.Status}}t{{.Names}}"  
IMAGE                   CONTAINER ID        STATUS              NAMES  
nginx                   814dea34b7db        Up 3 minutes        nginx1  
  
// 進入 nginx1 容器  
$ docker exec -it nginx1 bash  
  
// 修改 index.html 內容爲 hello world  
# echo hello world > /usr/share/nginx/html/index.html  
  
// 訪問 http://127.0.0.1:8080 咱們能夠看到 hello world 頁面  
  
// 刪除 nginx1 容器  
$ docker rm -f nginx1  
  
// 建立一個 名爲 nginx2 的 nginx 容器也使用 my-data 爲 nginx 的主目錄  
$ docker run -d -p 8080:80 --name nginx2  --mount source=nginx-data,target=/usr/share/nginx/html nginx  
  
// 訪問 http://127.0.0.1:8080 咱們也能夠看到 hello world 頁面(數據共享)

經過上面的實例咱們知道了:性能

  1. volume 和容器是分離的,刪除容器並不會刪除 volume
  2. 多個容器能夠加載相同的卷
  3. volume 在任何系統的容器上都能工做,方便遷移

數據卷經常使用命令

  • 查看全部數據卷 bash docker volume ls
  • 建立數據卷 bash docker volume create [卷名稱]
  • 查看卷詳情 bash docker volume inspect <卷名稱>
  • 刪除數據卷 bash docker volume rm <卷名稱>
  • 刪除無主的卷 bash docker volume prune

舒適提示:-v 和 --mount 的區別 (由於官方建議新用戶使用 --mount,因此本文只記錄 --mount 的使用方式)

在查看網上的各類資料的時候發現有人用 -v 參數而有的人又用 --mount 參數,爲了確認他們之間的區別我特地查了一下 docker 官網,如今把內容放出來
  • 最初,-v 或--volume 參數用於獨立容器,而 --mount 參數用於羣服務。 可是,從 Docker 17.06 開始,您也能夠將 --mount 用於獨立容器。 一般,--mount 更爲明確和詳細。 他們直接最大的區別是 -v 語法在一個字段中將全部選項組合在一塊兒,而 --mount 語法將它們分開。
  • 新用戶應該嘗試—mount語法,它比—卷語法更簡單。

上面的內容主要講述的是 local 驅動下的 volume,實際上 volume 還可使用其餘的驅動,這裏先記錄一下,後面在在繼續學習。學習

bind mount 掛載主機目錄

該方式其實是將主機上的一個目錄映射到容器中的一個目錄。(使用過虛擬機的朋友應該比較熟悉)

若是將空文件或目錄掛載到容器,容器中的該目錄又有文件,那麼,這些文件將會被複制到主機上的目錄中。若是將非空的文件或目錄掛載到容器,容器中的該目錄也有文件,那麼,容器中的文件將會被隱藏。spa

實例演示

// 在主機上建立一個 my-data 目錄  
$ mkdir ~/my-data  
  
// 建立一個 名爲 nginx3 的 nginx 容器並掛載 my-data 爲 nginx 的主目錄  
$ cd ~  
$ docker run -d -p 8080:80 --name nginx3 --mount type=bind,source="$(pwd)"/my-data,target=/usr/share/nginx/html nginx  
  
// 在 my-data 目錄中建立 index.html 並寫入內容  
$ touch my-data/index.html  
$ echo hello bind type > my-data/index.html  
  
// 使用瀏覽器訪問 http://127.0.0.1:8080  能夠正常顯示 hello bind type  
  
// 查看 nginx3 容器的詳情,注意 mounts 部分,很清晰的顯示了綁定的關係  
$ docker inspect nginx3  
......  
"Mounts":[  
    {  
        "Type":"bind",  
        "Source":"/Users/cc/my-data",  
        "Target":"/usr/share/nginx/html"  
    }  
]  
......

tmpfs 方式 (之後學習)

tmpfs,僅存儲在主機系統的內存中,不會寫入主機的文件系統。

程序員的藝術人生

這一集下先從一張圖開始
數據管理code

這張圖來自於 docker 官方,主要描述了主機和 docker 間的數據溝通的 3 種方式。分別是 bind mountvolumetmpfs mount。此次主要學習前兩種方式。讓咱們開始吧~

volume (數據卷)

如下內容摘抄自 docker 官方文檔

咱們知道默認狀況下,在容器內建立的全部文件都存儲在可寫容器層上,這意味着:

  • 當容器再也不存在時,數據不會持久存在,並且若是另外一個進程須要數據,就很難從容器中取出數據。
  • 容器可寫層與容器運行的主機緊密耦合。您不能輕易地將數據移動到其餘地方。
  • 寫入到容器的可寫層須要一個存儲驅動程序來管理文件系統。存儲驅動程序提供使用Linux內核的聯合文件系統。與使用直接寫入主機文件系統的數據卷相比,這種額外的抽象下降了性能。

經過上面的內容告訴咱們,不要在容器內容寫入數據,而要使用 volume

那麼數據卷是怎麼存儲數據的呢?

docker 默認在主機上會有一個特定的區域 /var/lib/docker/volumes/ (Linux),該區域用來存放 volume。

實例演示

// 建立一個 volume 名爲 my-data
$ docker volume create my-data
my-data

// 建立一個 名爲 nginx1 的 nginx 容器並使用 my-data 爲 nginx 的主目錄
$ docker run -d -p 8080:80 --name nginx1  --mount source=nginx-data,target=/usr/share/nginx/html nginx

814dea34b7dbf2afd724d12ad50254e2a749f0b65684f04c730ac04181857d04

// 查看容器的狀態
$ docker container ls --format "table {{.Image}}t{{.ID}}t{{.Status}}t{{.Names}}"
IMAGE                   CONTAINER ID        STATUS              NAMES
nginx                   814dea34b7db        Up 3 minutes        nginx1

// 進入 nginx1 容器
$ docker exec -it nginx1 bash

// 修改 index.html 內容爲 hello world
# echo hello world > /usr/share/nginx/html/index.html

// 訪問 http://127.0.0.1:8080 咱們能夠看到 hello world 頁面

// 刪除 nginx1 容器
$ docker rm -f nginx1

// 建立一個 名爲 nginx2 的 nginx 容器也使用 my-data 爲 nginx 的主目錄
$ docker run -d -p 8080:80 --name nginx2  --mount source=nginx-data,target=/usr/share/nginx/html nginx

// 訪問 http://127.0.0.1:8080 咱們也能夠看到 hello world 頁面(數據共享)

經過上面的實例咱們知道了:

  1. volume 和容器是分離的,刪除容器並不會刪除 volume
  2. 多個容器能夠加載相同的卷
  3. volume 在任何系統的容器上都能工做,方便遷移

數據卷經常使用命令

  • 查看全部數據卷 bash docker volume ls
  • 建立數據卷 bash docker volume create [卷名稱]
  • 查看卷詳情 bash docker volume inspect <卷名稱>
  • 刪除數據卷 bash docker volume rm <卷名稱>
  • 刪除無主的卷 bash docker volume prune

舒適提示:-v 和 --mount 的區別 (由於官方建議新用戶使用 --mount,因此本文只記錄 --mount 的使用方式)

在查看網上的各類資料的時候發現有人用 -v 參數而有的人又用 --mount 參數,爲了確認他們之間的區別我特地查了一下 docker 官網,如今把內容放出來
  • 最初,-v 或–volume 參數用於獨立容器,而 --mount 參數用於羣服務。 可是,從 Docker 17.06 開始,您也能夠將 --mount 用於獨立容器。 一般,–mount 更爲明確和詳細。 他們直接最大的區別是 -v 語法在一個字段中將全部選項組合在一塊兒,而 --mount 語法將它們分開。
  • 新用戶應該嘗試—mount語法,它比—卷語法更簡單。
    • *

上面的內容主要講述的是 local 驅動下的 volume,實際上 volume 還可使用其餘的驅動,這裏先記錄一下,後面在在繼續學習。

bind mount 掛載主機目錄

該方式其實是將主機上的一個目錄映射到容器中的一個目錄。(使用過虛擬機的朋友應該比較熟悉)

若是將空文件或目錄掛載到容器,容器中的該目錄又有文件,那麼,這些文件將會被複制到主機上的目錄中。若是將非空的文件或目錄掛載到容器,容器中的該目錄也有文件,那麼,容器中的文件將會被隱藏。

實例演示

// 在主機上建立一個 my-data 目錄
$ mkdir ~/my-data

// 建立一個 名爲 nginx3 的 nginx 容器並掛載 my-data 爲 nginx 的主目錄
$ cd ~
$ docker run -d -p 8080:80 --name nginx3 --mount type=bind,source="$(pwd)"/my-data,target=/usr/share/nginx/html nginx

// 在 my-data 目錄中建立 index.html 並寫入內容
$ touch my-data/index.html
$ echo hello bind type > my-data/index.html

// 使用瀏覽器訪問 http://127.0.0.1:8080  能夠正常顯示 hello bind type

// 查看 nginx3 容器的詳情,注意 mounts 部分,很清晰的顯示了綁定的關係
$ docker inspect nginx3
......
"Mounts":[
    {
        "Type":"bind",
        "Source":"/Users/cc/my-data",
        "Target":"/usr/share/nginx/html"
    }
]
......

tmpfs 方式 (之後學習)

tmpfs,僅存儲在主機系統的內存中,不會寫入主機的文件系統。

程序員的藝術人生

幫助文檔

快捷鍵

目錄

標題

文本樣式

列表

連接

代碼片

表格

註腳

註釋

自定義列表

LaTeX 數學公式

插入甘特圖

插入UML圖

插入Mermaid流程圖

插入Flowchart流程圖

插入類圖

快捷鍵

Markdown

圖標

快捷鍵

撤銷

Ctrl /⌘+Z

重作

Ctrl /⌘+Y

加粗

Ctrl /⌘+B

斜體

Ctrl /⌘+I

標題

Ctrl /⌘+Shift +H

有序列表

Ctrl /⌘+Shift +O

無序列表

Ctrl /⌘+Shift +U

待辦列表

Ctrl /⌘+Shift +C

插入代碼

Ctrl /⌘+Shift +K

插入連接

Ctrl /⌘+Shift +L

插入圖片

Ctrl /⌘+Shift +G

查找

Ctrl /⌘+F

替換

Ctrl /⌘+G

volume (數據卷)

實例演示

數據卷經常使用命令

舒適提示:-v 和 --mount 的區別 (由於官方建議新用戶使用 --mount,因此本文只記錄 --mount 的使用方式)

bind mount 掛載主機目錄

實例演示

tmpfs 方式 (之後學習)

Markdown 2987 字數 117 行數 當前行 1, 當前列 0

HTML 2491 字數 73 段落