1. 程式人生 > 其它 >Docker學習重點(6)~容器資料卷

Docker學習重點(6)~容器資料卷


一、容器資料卷

1、什麼是容器卷

docker是要將應用和環境打包成一個映象

這樣,資料就不應該在容器中,否則容器刪除,資料就會丟失,這就是刪庫跑路

故容器之間要有一個數據共享技術


在Docker容器中產生的資料,同步到本地,這就是卷技術


2、容器卷的本質:

本質上是一個目錄掛載,將容器內的目錄掛載到虛擬機器上


3、容器卷掛載目錄的目的:

容器的持久化和同步操作, 實現容器間可以資料共享



二、使用資料卷

1、方式一:直接使用命令來掛載 —v volume卷技術

  • 命令:docker run -it -v 主機目錄:容器內目錄
[root@kuangshen home]# docker run-it -v/home/ceshi:/home centos/bin/bash 
  • 啟動起來時候我們可以通過 docker inspect 容器id

  • 新開一個視窗

docker inspect 容器id
  • 找到掛載資訊Mounts
  • 測試:資料同步
  • 再來測試(容器停止後,修改主機檔案,再啟動容器的時候,資料同樣改變):

    1、停止容器

    2、宿主機上修改檔案

    3、啟動容器

    4、容器內的資料依舊是同步的!

雙向同步


4、使用容器資料卷的好處:

我們以後修改,只需在本地修改即可,容器內會自動同步!



三、實戰安裝mysql

  • MySQL的資料持久化命令
# 拉取
docker pull mysql:5.7

# 掛載
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=admin --name mysql01 mysql:5.7

-d 後臺執行
-p 埠對映
-v 卷掛載
-e 環境配置 安裝啟動mysql需要配置密碼
--name 容器名字
  • 連線測試:開啟mysql的客戶端工具:

● 如果,我們將容器mysql01刪除,發現:

  • 我們掛載到本地的資料卷依然沒有丟失,這就實現了容器資料持久化的功能!



四、具名和匿名掛載

1、匿名掛載和具名掛載的區別:

  • 匿名掛載:不寫宿主機目錄

  • 具名掛載:會給宿主機起一個名字

    #匿名掛載  -v 容器內路徑!
    docker run -d -P --name nginx01 -v /ect/nginx nginx  
    
    #檢視所有的 volume 的情況
    [root@kuangshen home]# docker volume 1s
    local 9f38292179faa178afcce54d80be99d4ddd68c91d2a68870bcece72d2b7ed061 
    #這裡發現,這種就是匿名掛載,我們在—v 只寫了容器內的路徑,沒有寫容器外的路徑!
    
    #具名掛載
    [root@kuangshen home]#docker run-d-P--name nginx02 -v juming-nginx:/etc/nginx nginx 
    95b809564484c8ac87d65c69643e7e67447f1c77ff9a91b93edec7003692e3a9
    
    [root@kuangshen home]# docker volume 1s 
    DRIVER VOLUME NAME 
    local  juming-nginx # 通過—v 卷名:容器內路徑
    
    #檢視一下這個卷 
    
    • 所有的docker容器內的卷,沒有指定的目錄的情況下都是在/var/lib/docker/volumes/xxx/_data

如何確定是具名掛載還是匿名掛載,還是指定路徑掛載!

  • -v 容器內路徑 # 匿名掛載
  • -v 卷名:容器內路徑 # 具名掛載
  • -v 宿主機路徑:容器內路徑 # 指定路徑掛載!

2、拓展:ro、rw

# 通過 —v 容器內路徑:ro(readonly) rw(readwrite) 改變讀寫許可權 
#一旦這個了設定了容器許可權,容器對我們掛載出來的內容就有限定了!

docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx 
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx 

#ro 只要看到ro就說明這個路徑只能通過宿主機來操作,容器內部是無法操作!



五、初始Dockerfile

1、(目錄掛載、資料同步)方式二:DockerFile使用來構建docker映象的檔案!命令指令碼!

  • 通過這個指令碼可以生成映象,映象時一層一層的,指令碼是一個一個的命令,每個命令都是一層!

映象是一層一層的,指令碼是一行一行的

  • Dockerfile 內容:
# 指令都是大寫的、
# 建立一個dockerfile檔案,命名為Dockerfile
#檔案內容:·
FROM centos   # 一層
VOLUME ["volume01","volume02"]  # 一層 再建立映象的時候就掛載出來
CMD echo "---end---"    # 一層
CMD /bin/bash    # 一層
  • 構建Dockerfile:
docker build -f /home/docker-test-volume/dockerfile1 -t shan/centos

■ 測試:在容器內部建立一個檔案

所有的docker容器內的卷,沒有指定的目錄的情況下都是在/var/lib/docker/volumes/xxx/_data
  • 檢查容器
  • 檢視Mounts,Source對應容器外目錄,匿名掛載卷
  • 測試一下,在container volume01下生成檔案:
  • 在主機掛載路徑下,也同樣生成(資料同步)

● 這種方式我們未來使用的十分多,因為我們通常會構建自己的映象!假設構建映象時候沒有掛載卷,

手動映象掛載 —v卷名:容器內路徑!



六、資料卷容器---多個容器資料共享

  • 多個mysql 同步資料

1、多個容器資料共享

資料卷的繼承關係 --volumes-from

  • 建立兩個容器:
  • 資料卷的繼承關係:

    --volumes-from

  • 啟動docker01,用之前建的shan/centos 1.0 映象
docker run -it --name docker01 shan/centos:1.0 # 1.0必須寫
docker run -it --name docker02 --volumes-from docker01 shan/centos:1.0

2、資料卷共享資料是拷貝


3、結論:

容器之間配置資訊的傳遞,資料卷容器的生命週期一直持續到沒有容器使用為止。

但是如果持久化到了本地,即使所有容器刪除了,本地資料是不會刪除的!



☺ 參考來源:
狂神的B站視訊《【狂神說Java】Docker最新超詳細版教程通俗易懂》 https://www.bilibili.com/video/BV1og4y1q7M4



如果本文對你有幫助的話記得給一樂點個贊哦,感謝!