日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

容器学习 之 docker存储(十五)

發布時間:2024/2/28 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 容器学习 之 docker存储(十五) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Docker 為容器提供了兩種存放數據的資源:

  • 由 storage driver 管理的鏡像層和容器層。
  • Data Volume。
  • storage driver

    Docker分層結構

    storage driver 實現了多層數據的堆疊并為用戶提供一個單一的合并之后的統一視圖。

    Docker 支持多種 storage driver,有 AUFS、Device Mapper、Btrfs、OverlayFS、VFS 和 ZFS。它們都能實現分層的架構,同時又有各自的特性。Docker
    優先使用 Linux 發行版默認的 storage driver。

    運行docker info查看 Ubuntu 的默認 driver:

    Ubuntu 用的 AUFS,底層文件系統是 extfs,各層數據存放在 /var/lib/docker/aufs。

    對于某些容器,直接將數據放在由 storage driver 維護的層中是很好的選擇,比如那些無狀態的應用。無狀態意味著容器沒有需要持久化的數據,隨時可以從鏡像直接創建。但對于另一類應用這種方式就不合適了,它們有持久化數據的需求,容器啟動時需要加載已有的數據,容器銷毀時希望保留產生的新數據,也就是說,這類容器是有狀態的。

    這就要用到 Docker 的另一種存儲機制:

    Data Volume

    Data Volume 有以下特點:

  • Data Volume 是目錄或文件。
  • 容器可以讀寫 volume 中的數據。
  • volume數據可以被永久的保存,即使使用它的容器已經銷毀。
  • docker 提供了兩種類型的 volume:bind mount 和 docker managed volume

    bind mount

    bind mount 是將 host 上已存在的目錄或文件 mount 到容器。

    例如 docker host 上有目錄 $HOME/htdocs:

    root@ubuntu:~/htdocs# cat index.html this is a file in host file system

    通過 -v 將其 mount 到 httpd 容器:

    root@ubuntu:~/htdocs# docker run -d -p 80:80 -v ~/htdocs:/usr/local/apache2/htdocs httpd 8940a1cf3724e03583c4eac7dca0380c368cf4c75763913f3353b57ae1f23050

    /usr/local/apache2/htdocs 就是 apache server 存放靜態文件的地方。由于 /usr/local/apache2/htdocs 已經存在,原有數據會被隱藏起來,取而代之的是 host $HOME/htdocs/ 中的數據。

    root@ubuntu:~/htdocs# curl 127.0.0.1:80 this is a file in host file system

    curl 顯示當前主頁確實是 $HOME/htdocs/index.html 中的內容。更新一下,看是否能生效:

    root@ubuntu:~/htdocs# echo "update index page in mypage" > ~/htdocs/index.html root@ubuntu:~/htdocs# curl 127.0.0.1:80 update index page in mypage

    host 中的修改確實生效了,bind mount 可以讓 host 與容器共享數據。這在管理上是非常方便的。

    下面我們將容器銷毀,看看對 bind mount 有什么影響:

    root@ubuntu:~/htdocs# docker stop 8940a1cf3724 8940a1cf3724 root@ubuntu:~/htdocs# docker rm 8940a1cf3724 8940a1cf3724 root@ubuntu:~/htdocs# cat ~/htdocs/index.html update index page in mypage

    mount point 有很多應用場景,比如我們可以將源代碼目錄 mount 到容器中,在 host 中修改代碼就能看到應用的實時效果。再比如將 mysql 容器的數據放在 bind mount 里,這樣 host 可以方便地備份和遷移數據。

    不過bind mount 需要指定 host 文件系統的特定路徑,這就限制了容器的可移植性,當需要將容器遷移到其他 host,而該 host 沒有要 mount 的數據或者數據不在相同的路徑時,操作會失敗。

    docker managed volume

    docker run -d -p 80:80 -v /usr/local/apache2/htdocs httpd f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340

    我們通過 -v 告訴 docker 需要一個 data volume,并將其 mount 到 /usr/local/apache2/htdocs。那么這個 data volume 具體在哪兒呢?

    這個答案可以在容器的配置信息中找到,執行 docker inspect 命令:

    docker inspect 21accc2ca072"Mounts": [{"Name": "f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340","Source": "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data","Destination": "/usr/local/apache2/htdocs","Driver": "local","Mode": "","RW": true,"Propagation": ""}]

    每當容器申請 mount docker manged volume 時,docker 都會在/var/lib/docker/volumes 下生成一個目錄(例子中是 "/var/lib/docker/volumes/f4a0a1018968f47960efe760829e3c5738c702533d29911b01df9f18babf3340/_data ),這個目錄就是 mount 源。

    root@ubuntu:~/htdocs# cd /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/ root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# ls index.html root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# cat index.html <html><body><h1>It works!</h1></body></html>

    修改host的這個掛載的文件試一試:

    7f33c5acf5edc77c4674/_data# echo "update valumn form host !" > /var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data/index.html root@ubuntu:/var/lib/docker/volumes/49d01a9d7d84ce6462b3c860cee6a971414fadf2fcb27f33c5acf5edc77c4674/_data# curl 127.0.0.1:80 update valumn form host !

    簡單回顧一下 docker managed volume 的創建過程:

  • 容器啟動時,簡單的告訴 docker “我需要一個 volume 存放數據,幫我 mount 到目錄 /abc”。
  • docker 在 /var/lib/docker/volumes 中生成一個隨機目錄作為 mount 源。
  • 如果 /abc 已經存在,則將數據復制到 mount 源,
  • 將 volume mount 到 /abc
  • 總結

    以上是生活随笔為你收集整理的容器学习 之 docker存储(十五)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。