Docker 入門到實戰教程(六)Docker數據卷

2022-02-07 小東IT技術分享
一. 前言

上一篇介紹到如何構建鏡像以及鏡像管理,不知道大家學到現在有沒有疑問?比如我運行web服務產生的日誌,我如何在宿主機上看到?我想安裝mysql或者redis等,配置文件如何配置,可以進到容器去設置,但是容器出現問題或者採重啟怎麼辦呢?種種疑問都說明一個問題--數據共享和持久化

接下來我們就看看Docker和宿主機如何數據共享和持久化?

二. 數據卷

在Docker的使用過程中往往需要對數據進行持久化,或者需要在多個容器之間進行數據共享,所以這就涉及到Docker容器的數據操作。容器中數據管理主要有兩種方式:數據卷和數據卷容器。

2.1 數據卷

數據卷是一個特殊的目錄,它將主機目錄直接映射進容器。可供一個或多個容器使用。

數據卷設計的目的就是為了 數據的持久化,它完全獨立與容器的生命周期。因此,容器刪除時,不會刪除其掛載的數據卷,也不會存在類似的垃圾機制對容器存在的數據卷進行處理。

數據卷的特性:

數據卷在容器啟動時初始化,如果容器使用的鏡像在掛載點包含了數據,這些數據會拷貝到新初始化的數據卷中可以對數據卷裡的內容直接修改,修改回馬上生效,無論是容器內操作還是本地操作2.1.1 創建一個數據卷

使用命令創建一個test-vol

docker volume create test-vol

file2.1.2 查看所有的數據卷file2.1.3 查看具體數據卷的信息
docker volume inspect test-vol

file2.2 掛載數據卷

兩種掛載方式:

docker run --name 容器名 -it --mount source=卷名,target=容器內絕對路徑(掛載點) 鏡像名docker run --name 容器名 -it -v 卷名:容器內絕對路徑(掛載點) 鏡像名

掛載就是用–mount參數 source是數據卷,target是容器內文件系統掛載點 , 還可以使用-v參數-v 卷名:容器內絕對路徑`

下面創建一個名為 test-web 的容器,並加載一個 數據卷 到容器的 /webapp 目錄。

2.2.1 -mount
docker run -d -P  --name test-web -mount source=my-vol,target=/webapp training/webapp python app.py

2.2.2 -v掛載
docker run -d -P  --name test-web -v test-vol:/wepapp training/webapp python app.py

2.3 查看數據卷的具體信息

數據卷信息在 "Mounts" Key 下面

file2.4 刪除數據卷

docker volume rm卷名來刪除指定數據卷

docker volume prune來刪除無主的數據卷

例如: 刪除剛剛創建的test-vol

docker volume rm test-vol

file

執行命令後報錯,意思是說數據卷正在使用無法刪除,需要將容器停止再刪除

file

注: 數據卷是被設計用來持久化數據的,它的生命周期獨立於容器,Docker 不會在容器被刪除後自動刪除 數據卷,並且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的 數據卷。如果需要在刪除容器的同時移除數據卷。可以在刪除容器的時候使用  docker rm -v 這個命令。

2.5 掛載本地數據到容器數據卷

在前面示例中,我們運行容器時並沒有指定要掛載到容器中數據卷的本地目錄,所在Docker使用一個默認數據目錄。-v參數除了可以在容器中創建數據卷外,還可以將宿主機中的目錄掛載到容器中的數據卷。

docker run -it -v 宿主機目錄:容器目錄 鏡像

啟動我們之前的centos

docker run -it /usr/dataVolume:/usr/dataVolumeContainer centos

file

執行命令後,分別在宿主機和docker容器,可以看到各自在/usr目錄下創建了一個文件夾

file

驗證數據共享,在進入容器後,在dataVol中建立一個test.txt的文件,並寫入"hello"

file

退出容器,我們在本機的dataVol中可以看到有一個test.txt的文件,內容是"hello",如果我們此時再test.txt中繼續追加 內容 「hello docker」

file2.6 掛載本地文件到容器數據卷
docker run --rm -it -v ~/.bash_history:/.bash_history centos /bin/bash

以上命令把本地的~/.bash_history文件掛載到新容器中,這樣就可以記錄在容器輸入過的命令了。

三. 數據卷容器

如果你有一些要在容器之間共享的持久性數據,或者希望在非持久容器中使用,那麼最好創建一個命名的數據卷容器,然後從其掛載數據。
說通俗點就是一個正常的容器,專門用來提供數據卷供其它容器掛載的

接下來,我們創建一個新的命名的共享容器。這個容器不運行一個應用程式,它利用training/postgres鏡像在所有的容器之間創建了一個共享層,以節省磁碟空間。

training/postgres是Docker 之前我下載的一個鏡像,拿來直接使用

file3.1 使用數據卷容器

創建數據卷容器後,我們可以通過--volumes-from選項,將一個數據容器掛載到其它容器:

docker run -d --volumes-from dbstore --name db1 training/postgres

也可以在多個容器間共享。如,掛載到另一個容器:

docker run -d --volumes-from dbstore --name db2 training/postgres

file

這時,如果training/postgres鏡像內有名/dbdata的目錄,則會從dbstore容器掛載卷,並會隱藏training/postgres鏡像中/dbdata下的文件。最終只有dbstore容器中的文件可見。還可以擴展掛載鏈,從已經存在的dbstore容器(如:db1、db2)來掛載卷:

docker run -d --name db3 --volumes-from db1 training/postgres

file

這種情況下,如果移除己掛載卷的容器,無論是最初的dbstore容器,還是後面的db1或db2容器,卷都不會被移除。要將卷從硬碟上移除,必須使用docker rm -v命令刪除最後一個引用了該卷的容器。

四. 備份、恢復與遷移數據卷

數據卷的常用操作還有數據卷備份、恢復、合併操作。以下是一些常用操作:

4.1 備份數據卷

在前面介紹數據卷容器時,我們創建了一個名為dbdata容器,並在容器中創建了一個/dbdata的數據卷。接下來,可以在創建容器使用--volumes-from參數來掛載這個數據卷,並對數據進行備份:

docker run -it -v /data --name test-data docker/whalesay

注: docker/whalesay是一個有趣的鏡像

創建data數據卷容器掛載了/data目錄.為了驗證數據卷容器的備份功能,在掛載的/data目錄下創建一個test.text文件,並寫入內容"test"

file

然後數據卷容器進行備份,使用 –volumes-from 標記來創建一個加載data容器卷的容器,並從主機掛載當前目錄到容器的/backup目錄。

 docker run -it --volumes-from test-data -v $(pwd):/backup docker/whalesay tar cvf /backup/backup.tar /data

file

$(pwd)是docker支持的指定當前目錄的方法,了解linux基本命令的會發現,linux查看當前目錄就是pwd命令。容器啟動後,在當前目錄下生成的backup.tar文件就是data容器卷的備份文件。這樣,數據卷容器中的數據就備份完成。

4.2 恢復數據卷

數據備份最終也是為了可以恢復,否則備份就沒有意義了,Docker恢復備份也很簡單,只需要2步即可。,可以在創建容器恢復備份數據到容器內的數據卷中,從而實現數據的遷移。

首先,創建並運行容器並添加一個數據卷data1:

docker run -itd -v /data --name data1 centos /bin/bash

然後創建另一個容器,掛載data1容器卷中的數據卷,並使用untar解壓備份文件到掛載的容器卷中。

docker run --volumes-from data1 -v $(pwd):/backup centos tar xvf /backup/backup.tar

這個時候,之前備份的數據卷容器的數據已經恢復到了容器data1中了。為了查看和驗證恢復的數據,我們可以再啟動一個容器掛載data1容器捲來查看。

file

參考連結:
http://suo.im/6okWe9
http://suo.im/5xHqrr


相關焦點

  • Docker 入門到實戰教程(五)構建Docker鏡像
    3.1.11 VOLUME說明:創建一個數據卷掛載點。格式:可以從本地主機或其他容器掛載數據卷,一般用來存放資料庫和需要保存的數據等3.1.12 USER說明:指定運行容器時的用戶名或UID,後續的RUN等指令也會使用指定的用戶身份。
  • Docker系列教程05-Docker數據卷(Data Volume)學習
    引言在Docker中,容器的數據讀寫默認發生在容器的存儲層,當容器被刪除時其上的數據將會丟失。要想實現數據的持久化,需要將數據從宿主機掛載到容器中。目前Docker提供了三種方式將數據從宿主機掛載到容器中。普通數據卷,映射到/var/lib/docekr/volumes目錄下。
  • Docker小白到實戰之Dockerfile解析及實戰演示,果然順手
    "<目標地址>"] COPY requirements.txt /tmp/2.8 VOLUME 關鍵字掛載數據卷,之前在常用命令那說到通過命令的方式進行數據卷掛載,在Dockerfile中使用VOLUME指定掛載路徑即可,根據構建出來的鏡像運行容器時,默認就有構建時掛載的信息。
  • 上手 Docker 容器數據管理
    在這一篇文章中,我們將帶你通過理論和實戰的方式掌握 Docker 的兩種常用的數據管理方式:數據卷(Volume)和綁定掛載(Bind Mount),從而能夠遊刃有餘地處理好數據,為你的應用提供強有力的支撐和保障。
  • ASP.NET Core容器化技術Docker零基礎從入門到實戰演練
    3)、Dockfile構建自定義鏡像的構建三步驟      五、Dockerfilef文件、Docker鏡像和Docker容器的關係 六、Dockerfile文件指令含義七、使用Dockerfile文件構建自定義ASP.NET
  • Docker數據卷管理和資源限制
    數據卷管理數據卷是Docker容器保存數據的方式,跟bind mounts方式相比,有以下優勢:數據卷更容易備份遷移使用Docker CLI或者Docker API對數據卷進行管理數據卷可以在多個容器間共享和復用Volumes driver可以將卷內容存儲在遠端主機上可以使用Docker
  • Docker 最初的2小時(Docker從入門到入門)
    Docker鏡像是一個特殊的文件系統,提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。一個典型的運行流程如下:1. client用pull命令從倉庫把image拉到Docker hostdocker pull的格式是:docker pull[選項] [Docker Registry地址]  <倉庫名>:<標籤名>默認地址是 DockerHub。
  • ​Docker 數據卷的管理及自動構建docker鏡像
    掛載時創建卷[root@docker01 ~]# docker run -d -p 80:80
  • Docker - 數據管理
    如:把 lxfubuntu1 容器中 /data 目錄下的 lxf.sh 文件,拷貝到宿主機 ~/lxf/ 目錄下docker cp lxfubuntu1:/data/lxf.sh ~/lxf/數據卷管理數據卷管理就是將容器的某個目錄,映射到宿主機,作為數據存儲同步的目錄命令
  • docker技術篇-數據卷管理
    用戶在使用Docker的過程中,往往會涉及到數據的備份,容器間數據共享,在此我們介紹一下容器的數據管理操作。
  • 【擁抱容器】:Docker 與 K8s 的入門課實戰系列課程總結
    不管你是想要複習,還是因故未能參加,還是中途缺席課程的,都可以戳以往的文章回顧學習哦~:👇👇👇【活動回顧】容器實戰:Docker 基礎入門講座實錄 | 擁抱容器:Docker 集群入門與實戰(上)講座實錄 | 擁抱容器:Docker 集群入門與實戰(下)【活動回顧】擁抱容器:Python web開發及其與
  • Docker入門為什麼可以這麼簡單?
    這篇我來講講Docker入門的相關概念和常用的命令,跟大家一起入門Docker!Docker一、Docker相關術語一般從零學習一門技術(語言),都是從HelloWorld開始的,但這次我偏不。所以,如果你想跟著我一起安裝Docker,先明確自己的版本是否是CentOS 7,如果不是只能找其他的教程來進行安裝。
  • Docker最全教程——MongoDB容器化(十三)
    旨在為WEB應用提供可擴展的高性能數據存儲解決方案。MongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。它支持的數據結構非常鬆散,是類似json的bson格式,因此可以存儲比較複雜的數據類型。
  • 宋寶華:Docker 最初的2小時(Docker從入門到入門)
    一般的流程中,client發pull命令從倉庫把image拉到docker host,然後通過run命令指揮image到host上面弄一個container來跑這個image。當然也可以是相反的流程,client 通過build命令在host上面創建一個自己的image,然後通過push命令把image推到倉庫。之後這個image可以被別的人或者自己pull。Docker鏡像是一個特殊的文件系統,提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。
  • Dockerfile使用入門
  • 寫給 FE 同學的 Docker 入門指南
    3.因為默認 Container 與外部是網絡隔離的,需要映射埠,外部才能訪問到 Container 中的服務Bind Mounts : Container 中的讀寫層無法實現持久化,有點類似前端裡面的 SessionStorage, 想要持久化,要麼映射到宿主的文件系統,要麼需要映射到 卷(這是另外一個重要概念)3.1.2. 埠映射
  • Docker 數據持久化Volume
    數據卷可以帶來以下好處:Docker volume 有如下幾種形態:不使用 Docker volume默認情況下,容器不使用任何 volume,此時,容器的數據被保存在容器之內,它只在容器的生命周期內存在,會隨著容器的被刪除而被刪除。當然,也可以使用 docker commit 命令將它持久化為一個新的鏡像。
  • Docker 基礎 : 數據管理
    首先要創建一個數據卷容器 mydata,並在其中創建一個數據卷掛載到 /data 目錄。$ sudo docker run -it -v /data –name mydata ubuntu然後在其他容器中使用 --volumes-from 來掛載 mydata 容器中的數據卷。
  • 雲計算核心技術Docker教程:rm/rmi命令詳解
    在docker客戶端命令行中我們可以使用rm刪除一個或多個容器,使用rmi刪除本地一個或多少鏡像。示例:docker rm :刪除一個或多個容器。語法:docker rm [OPTIONS] CONTAINER [CONTAINER...]OPTIONS說明:-f :通過 SIGKILL 信號強制刪除一個運行中的容器。-l :移除容器間的網絡連接,而非容器本身。-v :刪除與容器關聯的卷。
  • Docker基礎與實戰,看這一篇就夠了
    使用uname -r指令查看伺服器版本卸載老版本的docker(若有)yum remove docker docker-common docker-selinux docker-engine執行該命令只會卸載Docker本身,而不會刪除Docker存儲的文件,例如鏡像、容器、卷以及網絡文件等。這些文件保存在/var/lib/docker 目錄中,需要手動刪除。