Docker使用數(shù)據(jù)容器的具體示例
基本知識
在 Docker 的使用過程中往往需要對數(shù)據(jù)進行持久化,或者需要在多個容器之間進行數(shù)據(jù)共享,所以這就涉及到 Docker 容器的數(shù)據(jù)操作。
容器中數(shù)據(jù)管理主要有兩種方式:數(shù)據(jù)卷和數(shù)據(jù)卷容器。
- 數(shù)據(jù)卷(Data Volumes) 容器內(nèi)數(shù)據(jù)直接映射到本地宿主機。
- 數(shù)據(jù)卷容器(Data Volume Containers) 使用特定容器維護數(shù)據(jù)卷。
數(shù)據(jù)卷
數(shù)據(jù)卷是一個特殊的目錄,它將主機目錄直接映射進容器??晒┮粋€或多個容器使用。
數(shù)據(jù)卷設計的目的就是為了 數(shù)據(jù)的持久化,它完全獨立與容器的生命周期。因此,容器刪除時,不會刪除其掛載的數(shù)據(jù)卷,也不會存在類似的垃圾機制對容器存在的數(shù)據(jù)卷進行處理。
數(shù)據(jù)卷的特性:
- 數(shù)據(jù)卷在容器啟動時初始化,如果容器使用的鏡像在掛載點包含了數(shù)據(jù),這些數(shù)據(jù)會拷貝到新初始化的數(shù)據(jù)卷中
- 數(shù)據(jù)卷可以在容器之間共享和重用
- 可以對數(shù)據(jù)卷里的內(nèi)容直接修改,修改回馬上生效,無論是容器內(nèi)操作還是本地操作
- 對數(shù)據(jù)卷的更新不會影響鏡像的更新
- 數(shù)據(jù)卷會一直存在,即使掛載數(shù)據(jù)卷的容器已經(jīng)被刪除
創(chuàng)建數(shù)據(jù)卷的方法 :docker run -v /lcoaldir:/volumedir -it /image /bin/bash
Notice: Docker 掛載數(shù)據(jù)卷的默認權限是讀寫(rw), 通過上面的 "RW": true 可以看到,我們也可以在創(chuàng)建的時候進行設置為只讀。
使用 ro 這種是通過-v的形式進行掛在容器的,還可以通過 Dockerfile 的創(chuàng)建鏡像的形式 進行掛載,但是這種掛載通過此鏡像創(chuàng)建的 Container 是完全獨立的。
#Dockerfile FROM hub.c.163.com/library/ubuntu VOLUME ["/datavolume1","/dockervolume2"] CMD /bin/bash
1.執(zhí)行 docker build -t df_vo . 生成鏡像。
2.利用這個鏡像創(chuàng)建 Container. docker run --name votest1 -it df_vo
這樣的形式生成的 Continer 數(shù)據(jù)是相互獨立的。
數(shù)據(jù)卷容器
用戶需要在多個容器之間共享一些數(shù)據(jù),就可以使用數(shù)據(jù)卷容器。
命名的容器掛載數(shù)據(jù)卷,其他容器通過掛載這個容器實現(xiàn)數(shù)據(jù)共享,掛載數(shù)據(jù)卷的容器,就叫數(shù)據(jù)卷容器。
- 先創(chuàng)建一個容器
- 然后掛載。
掛載數(shù)據(jù)卷容器的方法:
用戶需要在多個容器之間共享一些數(shù)據(jù),就可以使用數(shù)據(jù)卷容器。
docker run --volumes-from 容器名
命名的容器掛載數(shù)據(jù)卷,其他容器通過掛載這個容器實現(xiàn)數(shù)據(jù)共享,掛載數(shù)據(jù)卷的容器,就叫數(shù)據(jù)卷容器。
下面我們進行如下的數(shù)據(jù)卷容器的實驗
先創(chuàng)建一個數(shù)據(jù)容器鏡像
#Dockerfile FROM alpine WORKDIR /app COPY ./datavolume1 . VOLUME ["/app"] RUN apk add --no-cache bash
注意 COPY 命令不能使用絕對路徑。必須使用相對路徑。
命令說明:
VOLUME 命令: 在 Dockerfile 中,我們可以事先指定某些目錄掛載為匿名卷,這樣在運行時如果用戶不指定掛載,其應用也可以正常運行,不會向容器存儲層寫入大量數(shù)據(jù)。
RUN apk add --no-cache bash
to keep docker image size small. 最小化安裝 bash。
對鏡像進行編譯。
docker build -t df_vo .
然后對進行進行創(chuàng)建 Container。
docker run --name votest -itd df_vo
掛載數(shù)據(jù)卷容器的方法:
docker run --volumes-from 容器名
#啟動一個數(shù)據(jù)盤容器, 數(shù)據(jù)盤掛載votest容器。 docker run -it --name votest_data1 --volumes-from votest df_vo
--------------數(shù)據(jù)變化測試--------------
這個可以在 votest_data1 中的 app 目錄下看到從 磁盤帶進來的數(shù)據(jù)。
做如下測試:
- 修改 votest 容器中的數(shù)據(jù), votest_data1 中的數(shù)據(jù)發(fā)生變化。
- 修改 votest_data1 中數(shù)據(jù) votest 容器中的數(shù)據(jù)發(fā)生變化。
再次搞個容器 votest_data2 進行測試
docker run -it --name votest_data2 --volumes-from votest df_vo
這個時候在啟動一個 votest_data2 同樣的做文件變動測試,三者完全是聯(lián)動的。
其實這些是否聯(lián)動通過docker inspect命令,找到 Mounts/Name ,表示掛載磁盤的位置。
現(xiàn)在再進行下一步的測試:
啟動兩個也帶有 -v 掛載方式的容器。 啟動命令如下:
docker run -it --name votest_data3 -v /home/homework/Cobra/docker/datavolume/log:/app/log --volumes-from votest df_vo docker run -it --name votest_data4 -v /home/homework/Cobra/docker/datavolume/log:/app/log --volumes-from votest df_vo
做如下測試:【3 應用容器,4 應用容器 ,0 代表數(shù)據(jù)卷容器, L 代表主機本地,log 目錄為從硬盤來源目錄】
其中 log 在 應用容器 和 本地是完全相通的。
其中 0,3,4 數(shù)據(jù)之間的數(shù)據(jù)是完全相通的。
通過-v 掛進去的數(shù)據(jù)磁盤,不會影響到數(shù)據(jù)卷。 他們各自在各自的區(qū)域內(nèi)形成的數(shù)據(jù)相互影響。
下面我們做下停機的相關測試
將 3 數(shù)據(jù)容器給停止掉。docker stop votest_data3
在 4 中修改各自范圍內(nèi)文件,0 變,本地也變,他們不會收到 3 的影響。
將 3 數(shù)據(jù)容器啟動,docker start votest_data3
首先看到 3 中的文件已經(jīng)改變了。已經(jīng)和 4,5 同步。
現(xiàn)在將 0 停掉 docker stop votest
在 3 中修改 數(shù)據(jù)卷掛載進來的數(shù)據(jù)。這個時候也會影響到 4。 也就是 3 和 4 是相互通的。
(盡管現(xiàn)在已經(jīng)將數(shù)據(jù)盤給停掉了!!!!!!)
這個特性太牛逼了,這樣可以將數(shù)據(jù)盤進行 Hot--Update,不會影響業(yè)務使用。
現(xiàn)在將數(shù)據(jù)盤重新進行啟動,查看 3 和 4 中的數(shù)據(jù)是否會更新?
docker run votest
這個時候啟動發(fā)現(xiàn)數(shù)據(jù)盤容器的數(shù)據(jù)也恢復到了 和 3、4 號容器同步了。 這個。。。。
現(xiàn)在我們重新對 votest container 刪除掉,然后重新創(chuàng)建,我看看下 3、4 號 container 的反應。
docker stop votest docker rm votest docker run --name votest -itd df_vo
這個時候發(fā)現(xiàn) 數(shù)據(jù) votest container 已經(jīng)完全和 3、4 號容器隔離了。修改 votest 不會引起其他的變化。
Now?。?!我們繼續(xù)測試。docker restart votest_data3 對 3 號容器進行重啟,看看其數(shù)據(jù)變化情況。
- 重啟發(fā)現(xiàn) 3 號和 4 號依然是舊的數(shù)據(jù)容器并且是相通的。
- 同時關閉 3 和 4 然后同時重啟,不管怎么操作 3 和 4 都是相通的。。
說明 docker start/stop 不能打斷他們想通性。
Now!!! 那我們怎么讓應用程序 更新 最新到最新的 votest 的數(shù)據(jù)容器呢?
docker stop dvtest_data3 docker rm dvtest_data3 #再次重建生成容器 docker run -it --name votest_data3 -v /home/homework/Cobra/docker/datavolume/log:/app/log --volumes-from votest df_vo
這個時候發(fā)現(xiàn) votest_data3 和 votest 的數(shù)據(jù)進行了同步。 這樣就是實現(xiàn)了數(shù)據(jù)的同步。
結論:如果要實現(xiàn)數(shù)據(jù)的熱更新,應該對 votest 然后對 votest_data 依次進行重新生成 Container。
數(shù)據(jù)卷的備份和還原
數(shù)據(jù)卷備份使用的命令:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 鏡像名 tar cvf /backup/backup.tar 數(shù)據(jù)卷
$(pwd)當前路徑
docker run --volumes-from votest-data5 -v /root/backup:/backup hub.c.163.com/library/ubuntu tar cvf /backup/vof1.tar /app
這個時候會出來一個包。在/root/backup 的目錄下,有個 vof1.tar 的包。
這個原理很簡單,新建一個 Container,然后掛盤本地的磁盤,然后執(zhí)行 tar 命令備份指定的文件夾。
數(shù)據(jù)卷的還原
使用命令類似:
docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 鏡像名 tar xvf /backup/backup.tar
示例:
創(chuàng)建一個容器 votest8 還原數(shù)據(jù)卷,這樣數(shù)據(jù)就又重新回來了。
docker run --volumes-from votest_data6 -v /root/backup:/backup --name votest8 hub.c.163.com/library/ubuntu tar xvf /backup/vof.tar
通過 docker ps -a 可以看到創(chuàng)建的數(shù)據(jù)容器。
最后創(chuàng)建一個容器掛在 votest_data6,就可以看到恢復的數(shù)據(jù)了。
docker run -it --volumes-from votest_data6 hub.c.163.com/library/ubuntu /bin/bash
注意這個容器里面會多出來一個 backup 的文件夾,正式備份的文件,其他的文件也已經(jīng)加載進來。 這種查看的方法是通過創(chuàng)建一個 container 進去進入查看。
Docker 啟動容器后位置越來越大處理方法
默認情況下 Docker 的存放位置為:/var/lib/docker
我們可以通過下面的命令查看
sudo docker info | grep "Docker Root Dir"
解決這個問題,最直接的方法當然是掛載分區(qū)到這個目錄,但是我的數(shù)據(jù)盤還有其他東西,這肯定不好管理,所以采用修改鏡像和容器的存放路徑的方式達到目的。
這個方法里將通過軟連接來實現(xiàn)。
首先停掉 Docker 服務:
sudo systemctl stop docker
然后移動整個/var/lib/docker 目錄到目的路徑:
mv `/var/lib/docker` /data/docker ln -s /data/docker `/var/lib/docker`
這時候啟動 Docker 時發(fā)現(xiàn)存儲目錄依舊是/var/lib/docker,但是實際上是存儲在數(shù)據(jù)盤的,你可以在數(shù)據(jù)盤上看到容量變化。
Docker 將普通用戶加入到 docker 組中
可以使用普通用戶對 docker 進行管理
sudo usermod -aG docker cobra
到此這篇關于Docker使用數(shù)據(jù)容器的具體示例的文章就介紹到這了,更多相關Docker 數(shù)據(jù)容器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
如何使用docker創(chuàng)建minio鏡像并上傳文件并提供demo
這篇文章主要介紹了使用docker創(chuàng)建minio鏡像并上傳文件,提供demo,minio還是很方便的,從部署到使用,都可以非??焖俚拇罱?而且比較穩(wěn)定,需要的朋友可以參考下2023-09-09Docker的文件系統(tǒng)映射:主機與容器間目錄的雙向映射詳解
通過Docker的目錄映射功能,實現(xiàn)主機與容器間的數(shù)據(jù)共享與持久化存儲,使用-v或--mount參數(shù)在運行時設置主機與容器目錄映射,或通過DockerCompose配置文件實現(xiàn)自動化,此功能提升數(shù)據(jù)管理靈活性和效率2024-11-11Docker容器之間數(shù)據(jù)傳輸?shù)膶崿F(xiàn)
本文主要介紹了Docker容器之間數(shù)據(jù)傳輸?shù)膶崿F(xiàn),文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03詳解Django+Vue+Docker搭建接口測試平臺實戰(zhàn)
這篇文章主要介紹了詳解Django+Vue+Docker搭建接口測試平臺實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-04-04docker報錯x509:certificate has expired or
這篇文章主要介紹了docker報錯x509:certificate has expired or is not yet valid問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-03-03