Docker從入門到精通(七)——容器數據共享

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

1、為什麼需要數據共享?

①、數據持久化

比如我們有一個MySQL集群,通過容器啟動,那麼項目運行過程中的數據是保存在容器中的,假設容器被刪除了,數據就丟失了,如果沒有數據共享,那你就只能刪庫跑路了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-6uywFyTL-1638886338448)(//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 目錄內容都會改變。