目的:
前言
Docker宿主機和容器之間文件拷貝
數據卷
數據卷容器
前言
Docker 數據管理
在生產環境中使用 Docker ,往往需要對數據進行持久化,或者需要在多個容器之間進行
數據共享,這必然涉及容器的數據管理操作
容器中的管理數據主要有兩種方式:
數據卷 Data Volumes 容器內數據直接映射到本地主機環境 數據卷容器(Data Volume Containers 使用特定容器維護數據卷
也有最原始的方法,說白了就是復制,宿主機和容器內容不交互的
Docker宿主機和容器之間文件拷貝
我們先來講講最原始copy方法怎么用吧:
把宿主機文件 copy 到Docker容器內
docker cp 需要拷貝的文件或者目錄
我們在宿主機中ht文件夾下創建一個文件hdn.txt
在里面添加一句話,並且復制到docker容器中:
語法:docker cp 需要拷貝的文件或者目錄 容器名稱:容器目錄
docker cp /ht/docker/ mycentos001:/javaxh/software
我們可以看內容復制過來了,因為是中文之所以亂碼了。
我們在里面加一段代碼:
我們在去本機上看依舊是當時輸入的那句代碼:
因為這兩個文件是單獨的個體數據不會交互,所以不推薦這個。
一般官方不推薦這種做法,雖然他也可以管理但是數據不交融,基本用不到。
數據卷
數據卷(data volume,注:位置在/var/lib/docker/volumes)是容器可以訪問,但是位置不在root文件系統中的一個目錄。為了能讓容器之間可以共享數據,Docker讓“卷”(volume)可以繞過Docker鏡像的層疊機制。容器中所有對鏡像的改變全部都直接存儲。每個容器都有固定的運行目錄在/var/lib/docker目錄下;而每個容器卷的數據則默認單獨存儲在/var/lib/docker/volumes/目錄底下。 docker run命令的-v選項能夠實現容器間數據卷中數據的互相拷貝。
·數據卷相關操作:
1.創建數據卷
docker volume create my-vol
此時,數據卷默認會放到/var/lib/docker/volumes路徑下,會發現所新建的數據卷位置,查看命令如下:
## 參數可以為數字“1”,字母L:大小寫均可,但效果不一樣
ls -1 /var/lib/docker/volumes
2.查看所有的數據卷
docker volume ls
3.查看指定數據卷的詳細信息(顯示一個JSON格式的數據)
docker volume inspect my-vol
4.刪除一個volume
docker volume rm my-vol
注1:數據卷 是被設計用來持久化數據的,它的生命周期獨立於容器,Docker不會在容器被刪除后自動刪除數據卷,
並且也不存在垃圾回收這樣的機制來處理沒有任何容器引用的數據卷,無主的數據卷可能會占據很多空間,
所以要及時刪除
## 掛載數據卷,最好是通過run而非create/start創建啟動容器
## create/start命令創建啟動容器后,再掛載數據卷相當麻煩,要修改很多配置文件,但並非不可以
5.啟動一個掛載數據卷的容器
demo1:
docker run -d \ -it \ --name tomcat01 \ --mount source=my-vol,target=/webapp \centos:7
效果:
注意:此行命令執行后的效果是,宿主機路徑/var/lib/docker/volumes/my-vol/_data與tomcat01容器路徑/webapp完成映射
demo2
docker run -d \ -it \ --name tomcat02 \ --mount type=bind,source=/javaxh/data,target=/root/webapp02 \ centos:7
效果:
注1:linux命令結尾加斜杠有什么用
加了“\”意為將最后的回車換行給注釋了,系統理解為命令還沒有結束,因而是繼續等待用戶進行輸入,直到讀到結束符,如回車
注2:source=my-vol,target=/webapp
my-vol為要掛載的數據卷,如果數據卷不存在,docker會自動創建
/webapp為容器上目錄,如果目錄不存在, Docke會自動創建
注3:mount選項高級用法
--mount選項的type參數支持三種類型的數據卷
--mount標志:由多個名值對組成,逗號分隔,每個鍵值由 <key> = <value> 元組組成
1.type=volume普通數據卷(默認即這種類型),映射到主機/var/lib/docker/volumes路徑下;
--mount type=volume,source=my-vol,target=/webapp
注:這是type的默認值
2.bind:綁定數據卷,映射到主機指定路徑下:
--mount type=bind,source=/webapp,destination=/webapp2
3.tmpfs :臨時數據卷,只存在於內存中
docker run -d \ -it \ --name tmptest \ --mount type=tmpfs,destination=/app \ nginx:latest
數據卷容器
如果用戶需要在多個容器之間共享一些持續更新的數據,最簡單的方式是使用數據卷容器。
數據卷容器也是一個容器,但是它的目的是專門提供數據卷給其他容器掛載
數據卷容器相關操作
1.新建數據卷容器
docker run -di --name db_data -v /db_data centos:7
注:-v 后面接的共享數據真實存放路徑
2.用容器db1、db2測試數據卷容器是否可用
docker run -di --name db1 --volumes-from db_data centos:7 docker exec -it db1 bash cd db_data docker run -di --name db2 --volumes-from db_data centos:7 docker exec -it db2 bash cd db_data
隨便在一個容器中創建一個文件kkk.txt