Docker | 容器資料卷詳解

2022-10-10 12:01:30

什麼是容器資料卷

從docker的理念說起,docker將應用和環境打包成一個映象,執行映象(生成容器)就可以存取服務了。

  • 如果資料都存在容器中,那麼刪除容器,資料就會丟失!需求:資料可以持久化
  • MySQL容器刪了,就相當於刪庫了。需求:MySQL資料可以本地儲存

容器之間可以有一個資料共用的技術,docker容器產生的資料同步到本地或者別的地方。

這就是資料卷技術,就是目錄掛載,將容器內的目錄,掛載到虛擬機器器上或者Linux上

目的:實現容器資料的持久化和同步操作。容器間也可以資料共用

資料的覆蓋問題

  1. 如果掛載一個空的資料卷到容器中的一個非空目錄中,那麼這個目錄下的檔案會被複制到資料卷中。

  2. 如果掛載一個非空的資料卷到容器中的一個目錄中,那麼容器中的目錄中會顯示資料卷中的資料。如果原來容器中的目錄中有資料,那麼這些原始資料會被隱藏掉。

這兩個規則都非常重要,靈活利用第一個規則可以幫助我們初始化資料卷中的內容。掌握第二個規則可以保證掛載資料卷後的資料總是你期望的結果。

使用資料卷

方式一:直接使用命令掛載 -v

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

docker run -it -v /home/test:/home centos /bin/bash

docker inspect 命令檢視容器資訊

測試掛載卷

1、在容器內部修改檔案同步到Linux主機上

進入容器,在/home目錄下建立123.sh檔案

主機內可以檢視在容器內部建立的檔案

2、同樣地,在Linux上修改掛在卷檔案可以同步到容器內部

3、停止容器,修改Linux主機上的檔案,同步到容器內

# 1、停止容器
exit

# 2、檢視容器是否還在執行
docker ps

# 3、在Linux主機上修改對應目錄的檔案

# 4、啟動容器並檢視
  
  # 4.1、 檢視歷史執行的容器
  docker ps -a
  
  # 4.2、 啟動容器
  docker start CONTAINER ID
  
  # 4.3、 進去容器
  docker attach CONTAINER ID
  
  # 4.4、 檢視資料卷檔案

方式二:Dockerfile檔案

請檢視下一章節

資料卷命令

docker volume

docker volume --help
Usage:  docker volume COMMAND
Manage volumes
Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.

具名掛載/匿名掛載

匿名掛載

-v 容器內路徑
-P 自動分配埠號

docker run -d -P --name nginx02 -v /etc/nginx nginx

具名掛載

-v 卷名:容器內路徑
docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx

檢視資料卷

方式一:docker inspect 容器ID

方式二:docker volume inspect juming-nginx

檢視Linux主機docker工作目錄 /var/lib/docker

所有docker容器內的卷,沒有指定目錄的情況下都是存放在 /var/lib/docker/volumes/xxx/_data 目錄下

掛載三種方式

# 1
-v 容器內路徑            # 匿名掛載

# 2
-v 卷名:容器內路徑       # 具名掛載

# 3
-v 宿主機路徑:容器內路徑 # 指定路徑掛載

擴充套件

給掛載的資料卷增加讀寫許可權控制

通過 -v 容器內路徑, ro rw 改變讀寫許可權

  • ro readonly 唯讀

  • rw readwrite 可讀寫


# 一旦設定了容器許可權,容器對我們掛載出來的內容就有限定了

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

ro : 說明這個路徑只能通過宿主機來操作,容器內無法操作


我是 甜點cc

熱愛前端,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚,等待著一個創業機會。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。

希望能和大家一起努力營造一個良好的學習氛圍,為了個人和家庭、為了我國的網際網路物聯網技術、數位化轉型、數位經濟發展做一點點貢獻。數風流人物還看中國、看今朝、看你我。