什麼是容器資料共享?簡單來說就是容器與容器之間資料共享,容器與宿主機資料共享。
1、為什麼需要資料共享?
①、資料持久化
比如我們有一個MySQL叢集,通過容器啟動,那麼專案執行過程中的資料是儲存在容器中的,假設容器被刪除了,資料就丟失了,如果沒有資料共享,那你就只能刪庫跑路了。
而有了資料共享,你就可以打通容器和宿主機的資料聯通,將容器中的資料同步到宿主機,即使容器刪除了,資料還是在本地的。
②、同步內容
前面的教程,我們每次要修改容器裡面的內容,都得進入到容器中,而實際生產環境容器都是有很多個的,一個個修改,大家不用幹活了。
那麼你想不想在本地修改了,直接同步到容器?想就接著往下看。
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 目錄內容都會改變。