Docker從入門到精通(七)——容器資料共享

YSOcean發表於2021-12-21

什麼是容器資料共享?簡單來說就是容器與容器之間資料共享,容器與宿主機資料共享。

1、為什麼需要資料共享?

①、資料持久化

比如我們有一個MySQL叢集,通過容器啟動,那麼專案執行過程中的資料是儲存在容器中的,假設容器被刪除了,資料就丟失了,如果沒有資料共享,那你就只能刪庫跑路了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-6uywFyTL-1638886338448)(https://gitee.com/YSOcean/typoraimg/raw/master/image%5Cdocker/image-07-00.gif)]

而有了資料共享,你就可以打通容器和宿主機的資料聯通,將容器中的資料同步到宿主機,即使容器刪除了,資料還是在本地的。

②、同步內容

前面的教程,我們每次要修改容器裡面的內容,都得進入到容器中,而實際生產環境容器都是有很多個的,一個個修改,大家不用幹活了。

那麼你想不想在本地修改了,直接同步到容器?想就接著往下看。

2、命令掛載

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

比如我們將宿主機下面的 /home/webapps 目錄掛載到Tomcat容器的 /usr/local/tomcat/webapps

docker run -it -v /home/webapps:/usr/local/tomcat/webapps -p 8083:8080 --name tomcat03 tomcat:latest /bin/bash

我們在容器的 /usr/local/tomcat/webapps 目錄下新建 a.txt 檔案,會在宿主機 /home/webapps 目錄下找到這個檔案;

同理在宿主機的 /home/webapps 目錄下新建 b.txt 檔案,你會在容器的 /usr/local/tomcat/webapps 目錄下也能找到。

這樣就完成了宿主機和容器檔案目錄的同步操作。

①、即使容器停止(不是刪掉),宿主機掛載目錄變動了,再次啟動容器,宿主機改動還是能夠同步到容器的。

②、容器刪掉,宿主機掛載目錄不會被刪掉。

3、檢查掛載是否成功

docker inspect 容器id

4、匿名掛載和具名掛載

4.1 匿名掛載

docker run -v 容器內路徑

比如給一個Tomcat容器匿名掛載:

docker run -d -P -v /usr/local/tomcat/webapps tomcat:8.0

然後通過 docker inspect 容器id,檢視掛載情況:

Name 屬性為一長串數字的一般都是匿名掛載,可以到下面的Source屬性指定的目錄找到宿主機掛載目錄。

4.2 具名掛載

docker run -v 卷名:容器內路徑

指定Tomcat掛載名稱為 tomcatVolumeUrl

docker run -d -P -v tomcatVolumeUrl:/usr/local/tomcat/webapps tomcat:8.0

同樣通過 docker inspect 容器id檢視:

5、共享容器進行掛載

大家有沒有發現一個問題,通過上面的命令進行資料共享,如果我們有多個容器,都需要掛載一個目錄,但是掛載過程中,有一個容器命令目錄寫錯了,那就會造成容器資料不同步,如何解決這個問題呢?

答案就是建立一個共享容器,建立共享容器的同時進行目錄掛載,然後別的容器和這個共享容器關聯即可。

例項演示:

①、宿主機建立目錄

我們在 /home 下建立 /share_volume 目錄,然後在這個目錄下新建 index.html 檔案,裡面就一句 hello docker!!!。

②、建立共享容器

docker create --name tomcat_share -v /home/share_volume:/usr/local/tomcat/webapps tomcat:latest /bin/true

③、建立實際容器

建立的同時指定和共享容器關聯。

docker run -d -p 8081:8080 --volumes-from tomcat_share --name tomcat01 -d tomcat

docker run -d -p 8082:8080 --volumes-from tomcat_share --name tomcat02 -d tomcat

上面啟動了兩個容器,會發現更改宿主機的/home/share_volume 目錄內容,兩個容器的/usr/local/tomcat/webapps 目錄內容都會改變。

相關文章