五、Docker入門系列--Docker容器資料卷
五、 Docker容器資料卷
一、Docker入門系列--Docker 簡介
二、Docker入門系列--Docker安裝
三、Docker入門系列--Docker常用命令
四、Docker入門系列--Docker映象
五、Docker入門系列--Docker容器資料卷
六、Docker入門系列--DockerFlie解析
七、Docker入門系列--使用DockerFlie自定義Tomcat映象
八、Docker入門系列--Docker常用安裝
九、Docker入門系列--本地映象釋出到阿里雲
十、Docker入門系列--Docker-Compose簡介和安裝
十一、Docker入門系列--Docker-Compose模板命令
十二、Docker入門系列--Docker-Compose常用命令
十三、Docker入門系列--Portainer視覺化Docker
十四、Docker入門系列--Docker搭建部署SpringCloud微服務專案Demo
5.1 容器資料卷簡述
先來看看Docker的理念:
-
將運用與執行的環境打包形成容器執行 ,執行可以伴隨著容器,但是我們對資料的要求希望是持久化的
-
容器之間希望有可能共享資料
Docker容器產生的資料,如果不通過docker commit生成新的映象,使得資料做為映象的一部分儲存下來,那麼當容器刪除後,資料自然也就沒有了。為了能儲存資料在docker中我們使用卷。
一句話:有點類似我們Redis裡面的rdb和aof檔案。
卷就是目錄或檔案,存在於一個或多個容器中,由docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System提供一些用於持續儲存或共享資料的特性:卷的設計目的就是資料的持久化,完全獨立於容器的生存週期,因此Docker不會在容器刪除時刪除其掛載的資料卷。
特點:
-
資料卷可在容器之間共享或重用資料
-
卷中的更改可以直接生效
-
資料卷中的更改不會包含在映象的更新中
-
資料卷的生命週期一直持續到沒有容器使用它為止
-
容器卷也可以完成主機到容器、容器到主機的資料共享(類似於 docker cp)
5.2 容器資料卷案例
5.2.1 命令新增
命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名
新增之前:
執行docker run -it -v /myDataVolume:/dataVolumeContainer centos
可以看到宿主機跟容器中都生成了對應資料夾:
備註:Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied
解決辦法:在掛載目錄後多加一個--privileged=true引數即可
檢查是否掛載成功:docker inspect 容器ID
1.容器和宿主機之間資料共享
可以看到實現了宿主機跟容器之間的雙向同步。
2. 容器停止退出後,主機修改後資料是否同步
容器先停止退出、主機修改host.txt、容器重啟進入、檢視主機修改過的host.log
3. 命令(帶許可權)
帶許可權的命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄:ro 映象名
ro表示read only只讀。
執行:docker run -it -v /myDataVolume:/dataVolumeContainer:ro centos
5.2.2 DockerFile新增
具體描述放到後面講,這裡先使用。
主機根目錄下新建mydocker資料夾並進入:mkdir mydocker
可在Dockerfile中使用VOLUME指令來給映象新增一個或多個數據卷:
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"]
說明:
出於可移植和分享的考慮,用-v 主機目錄:容器目錄這種方法不能夠直接在Dockerfile中實現。
由於宿主機目錄是依賴於特定宿主機的,並不能夠保證在所有的宿主機上都存在這樣的特定目錄。
File構建:
建立一個檔案Dockerfile,然後新增以下內容:
vim Dockerfile
# volume test
FROM centos
VOLUME ["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,--------success1"
CMD /bin/bash
build後生成映象:獲得一個新的映象
docker build -f /mydocker/Dockerfile -t mrlinxi/centos .
run我們設定好的容器:
docker run -it 27ffb21c539d /bin/bash
可以看到容器內已經建立好了卷地址。
通過上述步驟,容器內的卷目錄地址已經知道,對應的主機目錄地址哪??
通過docker inspect 容器ID
檢視
5.3 資料卷容器
5.3.1. 總體介紹
命名的容器掛載資料卷,其它容器通過掛載這個(父容器)實現資料共享,掛載資料卷的容器,稱之為資料卷容器。實際上就是通過父容器傳遞資料卷的配置,通過傳遞資料卷的配置,將不同容器掛載到宿主機的相同目錄下,從而實現各容器之間的資料傳遞。
以上一步新建的映象mrlinxi/centos為模板並執行容器dc01/dc02/dc03,他們已經具有容器卷/dataVolumeContainer1和/dataVolumeContainer2
5.3.2. 容器間傳遞共享(--volumes-from)
先啟動一個父容器dc01,在dataVolumeContainer2中新增內容
docker run -it --name dc01 mrlinxi/centos
cd dataVolumeContainer2
touch doc1.txt
然後ctrl+p+q退出
dc02/dc03繼承自dc01,通過--volumes-from繼承
docker run -it --name dc02 --volumes-from dc01 mrlinxi/centos
然後在dc02和dc03的dataVolumeContainer2中分別新增各自的內容
docker run -it --name dc02 --volumes-from dc01 mrlinxi/centos
cd dataVolumeContainer2
touch doc2.txt
docker run -it --name dc03 --volumes-from dc01 mrlinxi/centos
cd dataVolumeContainer2
touch doc3.txt
回到dc01可以看到02/03各自新增的都能共享了
同理,dc02跟dc03裡面都有其他容器的資料
刪除dc01,dc02修改後dc03可否訪問
刪除dc01後,dc02和dc03之間的資料共享並不受影響。
--volumes-from可以理解為繼承資料卷的配置,即便刪除了dc01,但是配置沒有動依然可以同步資料
可以docker inspect查一下,宿主目錄是同一個
結論:容器之間配置資訊的傳遞,資料卷的生命週期一直持續到沒有容器使用它為止