Docker容器數據持久化 --volumes
docker
容器內的數據是獨立於鏡像之外的,利用「數據卷」將其持久化到宿主機。
數據卷
數據卷其實就是一個目錄或者一個文件,該目錄(或文件)可以存在於宿主機上。將此目錄(或文件)映射到容器中,便可以持久化容器內的數據到宿主機。
如果目錄不存在於宿主機上,而是存在於一個容器內部,那麼此容器便可以被稱爲「數據卷容器」下面講解一下具體的操作方式。
持久化到目錄/ 文件
數據卷如果是宿主機的一個目錄,可以進行如下操作將容器內的數據持久化:命令用法如下:
1docker run -itd --name [容器名字] -v [宿主機目錄]:[容器目錄] [鏡像名稱] [命令(可選)]
2docker run -itd --name [容器名字] -v [宿主機文件]:[容器文件] [鏡像名稱] [命令(可選)]
該命令是通過一個鏡像啓動一個容器。
用--name
指定容器的名稱;
用-v
指定宿主機的某目錄作爲數據卷掛載到容器中,使該容器與宿主機共享此目錄 。
注意:
1.如果本地路徑不存在,docker 會自動創建。
2.宿主機的目錄請使用絕對路徑。
操作實例:
1、執行如下命令,將宿主機的 /Users/peter/dockerdata/
目錄映射到新創建的nginx
容器中的 /data
目錄:
1docker run -itd --name nginx -v /Users/peter/dockerdata:/data nginx
2
3docker run -itd --name nginx -v /Users/ethanyan/dockerdata/testdata.txt:/data/testdata.txt nginx
2、接下來驗證是否生效,先在本地共享目錄下創建一個新目錄 NG
:
1cd /Users/ethanyan/dockerdata
2mkdir NG
3、進入容器 nginx
中看是否存在 NG
目錄:
1docker exec -it nginx /bin/bash #進入nginx容器
2ls /data #列出data文件下的內容
3NG
可發現在本地創建目錄後,容器內的確實也出現了新建的目錄。
4、以上操作反之亦然
在容器的 /data/NG
目錄中創建一個文件testdata.txt
,退出容器後發現本地也出現了該文件。
使用此方法可以讓容器和宿主機共享目錄/文件,並將容器內的數據持久化到本地。
持久化到容器
如果不想這些數據直接暴露在宿主機,可以使用數據卷容器的方式。將數據卷容器掛載到其他容器,就可以多個容器之間共享數據了,而且還可以持久化的保存數據(後面會講解如何備份和恢復數據卷容器)
注意:數據卷容器不啓動
1、創建數據卷容器
1docker create -v [容器數據卷目錄] --name [容器名字] [鏡像名稱] [命令(可選)]
2
3docker create -v /data/ --name data nginx
既然需要創建一個數據卷容器,那麼就需要使用鏡像,一般大家都習慣使用 centos 或者 Ubuntu 作爲基礎鏡像
2、將數據卷容器掛載到其他容器
1# 創建容器並掛載數據卷命令
2docker run --volumes-from [數據卷容器 id/name] -itd --name [容器名字] [鏡像名稱] [命令(可選)]
3# 示例
4docker run --volumes-from VolumesID -itd --name nginx_test1 nginx /bin/bash
5docker run --volumes-from VolumesID -itd --name nginx_test2 nginx /bin/bash
注意:使用數據卷容器是容器之間共享數據,不涉及宿主機,因此數據沒有在宿主機上。
備份與恢復
數據卷容器的備份與恢復並不是容器的備份與恢復,實質上是數據的備份與恢復。
備份
1docker run -it --volumes-from [數據卷容器id或者name] -v [宿主機存放備份文件的目錄]:[容器內存放備份文件目錄] [鏡像] tar cvf [備份文件路徑] [要備份的目錄]
我們執行示例命令:
1docker run -it --volumes-from data -v /Users/peter/dockerdata/:/backup nginx tar cvf /backup/backup.tar /data
2tar: Removing leading `/' from member names
3/data/
4/data/file.txt
5
該命令是加載數據卷容器並將容器內的/data
目錄打包,然後把壓縮包保存到 映射到容器內 的新數據卷,本地目錄爲 /Users/peter/dockerdata/
。執行完後,會在本地該目錄出現壓縮包 backup.tar
。
注意:
1、備份的命令執行完後會創建出一個臨時容器,刪除即可。重要的是壓縮包。
之所以會出現一個臨時容器,是因爲備份的原理是:
創建一個新的容器掛載數據卷容器,而且此容器還與宿主機共享了一個目錄(新數據卷),執行打包命令將數據卷容器內的數據打包保存到共享目錄中,所以本地會出現一個壓縮包。
恢復
1、創建一個新的數據卷容器 data_new
1docker create -v /data/ --name data_new nginx
2、恢復之前的備份文件
1docker run --volumes-from [新創建的數據卷容器id或者name] -v [宿主機存放備份文件的目錄]:[容器內存放備份文件目錄] [鏡像] tar xvf [備份文件]
2
3# 執行示例命令
4docker run --volumes-from data_new -v /Users/peter/dockerdata/:/backup nginx tar xvf /backup/backup.tar
5data/
6data/file.txt
3、爲了驗證是否恢復,我們可以新創建一個容器並掛載新的數據卷容器:
1docker run --volumes-from data_new -itd --name nginx_test6 nginx /bin/bash
2
3docker exec -it nginx_test6 /bin/bash
4
5root@2b54f0bfefbe:/# ls /data
6file.txt
7root@2b54f0bfefbe:/# cat /data/file.txt
8hello world
可看到數據卷容器已經恢復。
備份與恢復的原理
不管是備份還是恢復,我們都使用了一箇中間介質,此介質便是一個容器。因爲數據卷容器是不啓動的,爲了備份數據,我們就需要使用一個掛載了此數據卷容器的中間介質(容器)。此介質不光要能連接數據卷容器,還需要連接本地,因此我們又將本地的一個目錄映射到了中間介質中。
備份就是中間介質將數據卷容器的目錄打包後,再通過映射的目錄共享給本地,所以本地會出現一個壓縮包。容器列表多了一個新的容器,此容器便是中間介質。
恢復就是中間介質通過映射到容器的共享目錄,讀取到本地的備份文件(壓縮包),然後在容器內部解壓縮,數據就恢復到了掛載的數據卷容器中。
當然,此中間介質也可以使用
--name
參數命名,便於刪除。
docker容器網橋連接
容器之間如何互相通訊?具體的命令有哪些?
橋接(網橋)
網橋可以簡單的理解爲「局域網」,使加入網橋的容器之間可以互相通訊、暴露全部鏈接,同時與外界又保證了相對隔離的運行環境。
新建網絡
下面先創建一個新的 Docker 網絡。
1$ docker network create -d bridge [網橋名稱]
2$ docker network create -d bridge test-net
參數-d bridge
是默認配置,可寫可不寫
參數指定 Docker 網絡類型,有 bridge、overlay。
其中 overlay 網絡類型用於 Swarm mode(集羣模式),在本小節中你可以忽略它。
通過網橋連接容器
連接網橋分爲3種方式,一種是在創建容器時連接網橋,一種是在容器已經運行時連接網橋,最後一種是運行容器時連接網橋:
1、創建容器並連接:
1docker create --name [容器名稱] --network [網橋名稱] [鏡像名稱]
2docker create --name test1 --network test-net ubuntu
2、容器已經運行時連接:
1docker network connect [網橋名稱] [容器名稱]
2docker network connect test-net ubuntu
3、運行一個容器並連接到網橋:
1$ docker run -itd --name [容器名] --network [網橋名稱] [鏡像名稱] /bin/bash
2$ docker run -itd --name test1 --network test-net ubuntu /bin/bash
查看所有網橋
1docker network ls
查看某網橋的配置信息
1docker network inspect [網橋id或者名稱]
刪除網橋
1docker network rm [網橋id或者名稱]
ping 查看容器是否連接
ping命令,大家都很熟悉吧。
如果未安裝,首先需要安裝Ping
1$ apt-get update
2$ apt install iputils-ping
3
4#進入容器test1內部
5$ docker exec -it test1 /bin/bash
6
7$ ping test1 #進入容器test2裏面ping test1
8$ ping test2 #進入在容器test1裏面ping test2
文章合集
Selenium | Appium | Jenkins | Jmeter
軟件測試方法彙總 | Postman接口參數化 | 測試用例設計
免費福利 視頻教程
Selenium | Appium | Jenkins | Jmeter
往期性能推文:
03|性能綜述: 怎麼理解TPS、QPS、RT、吞吐量這些性能指標?
04|JMeter和LoadRunner:要知道工具僅僅只是工具
05|指標關係:你知道併發用戶數應該怎麼算嗎?
性能測試工具--Locust官方文檔(API)解讀(全)
AWS
如何使用AWS EC2+Docker+JMeter構建分佈式負載測試基礎架構
萬水千山總是情,點個“在看” 行不行!!?