網站首頁 編程語言 正文
容器數據卷介紹
什么是數據卷
將運用與運行的環境打包形成容器運行,運行可以伴隨著容器,但是我們對數據的要求是持久化的。
容器之間希望有可能共享數據。
Docker 容器產生的數據,如果不通過 docker commit 生成新的鏡像,使得數據做為鏡像的一部分保存下載,那么當容器刪除后,數據自然也就沒有了。為了能保存數據在 docker 中我們使用卷。
數據卷能做什么?
容器的持久化
容器間繼承和共享數據
卷就是目錄或文件,存在于一個或多個容器中,由 docker 掛載到容器,但不屬于聯合文件系統,因此能夠繞過 Union File System 提供一些用于持續存儲或共享數據的特性。
卷的設計目的就是數據的持久化,完全獨立于容器的生存周期因此 Docker 不會再容器刪除時刪除其掛載的數據卷。
特點
- 數據卷可在容器之間共享或重用數據
- 卷中的更改可以直接生效
- 數據卷中的更改不會包含在鏡像的更新中
- 數據卷的生命周期一直持續到沒有容器使用它為止
Docker 容器數據卷操作
直接命令添加數據卷
命令格式
docker run -it -v 宿主機絕對路徑:容器內絕對路徑 鏡像名
案例演示
#1、容器與宿主機主機間文件共享
[root@docker ~]# docker run -itd -v /volume:/containervolume centos:latest
c0eb80a4425eac21b933ce1a81132eb08eeaaf30ac5adb077d44c11dd7260268
#2、主機和容器的 / 下均自動創建共享的目錄
[root@docker ~]# ll -d /volume
drwxr-xr-x. 2 root root 6 11月 1 23:25 /volume
[root@docker ~]# docker exec -it $(docker ps -q) ls -ld /containervolume
drwxr-xr-x. 2 root root 6 Nov 1 15:25 /containervolume
#3、驗證,在容器內的 containervolume 目錄下創建 test 文件,發現主機 volume 目錄共享了 test 文件
[root@docker ~]# docker exec -it $(docker ps -q) touch /containervolume/test
[root@docker ~]# ll /volume
-rw-r--r--. 1 root root 0 11月 1 23:29 test
#4、退出容器后,主機對 volume 文件進行修改,再次啟動容器,發現容器內的 dataVolumeContainer 目錄下也同步了 nidaye 文件
?dockerfile 添加數據卷
dockerfile 說明
可在 Dockerfile 中使用 VOLUME 指令來給鏡像添加一個或多個數據卷
VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/data/VolumeContainer3"]
出于可移植和分享的考慮,用-v 主機目錄:容器目錄 這種方法不能夠直接在 Dockerfile 中實現。由于宿主機目錄是依賴于特定宿主機的,并不能夠保證在所有的宿主機上都存在這樣的特定目錄。
案例演示
#1、在 / 目錄下創建 mydocker 文件夾并進入
[root@docker ~]# mkdir /mydocker
#2、dockerfile 構建
[root@docker ~]# vim /mydocker/dockerfile
FROM centos:latest
#創建的鏡像來自于父鏡像 centos
VOLUME ["/volume"]
#在 / 下創建數據卷
CMD echo "create---volume----successl"
#打印數據卷創建成功
CMD /bin/bash
#3、build 生成新的鏡像 volume/centos
[root@docker ~]# docker build -f /mydocker/dockerfile -t volume/centos .
Sending build context to Docker daemon 519.2MB
Step 1/4 : FROM centos:latest
---> 0f3e07c0138f
Step 2/4 : VOLUME ["/volume"]
---> Running in 0059989ef83c
Removing intermediate container 0059989ef83c
---> 9a7f6ae84e23
Step 3/4 : CMD echo "create---volume----successl"
---> Running in 9dd2d3fbd75c
Removing intermediate container 9dd2d3fbd75c
---> 6f8a83b9feca
Step 4/4 : CMD /bin/bash
---> Running in 18edd4a6af38
Removing intermediate container 18edd4a6af38
---> 30b4d769d4e8
Successfully built 30b4d769d4e8
Successfully tagged volume/centos:latest
#鏡像創建成功
#4、使用新鏡像啟動容器
[root@docker ~]# docker run -itd volume/centos
53d070c79a13dd4ecfe3208a3907cd00e4dc3b1a45c2b890d642cb96b7e05217
#5、驗證,容器內成功創建目錄 volume
[root@docker ~]# docker exec -it $(docker ps -q) ls -ld /volume
drwxr-xr-x. 2 root root 6 Nov 1 16:03 /volume
#6、驗證,在宿主機上創建文件 test ,容器 /volume 目錄成功共享數據
[root@docker ~]# touch /var/lib/docker/volumes/53d070c79a13dd4ecfe3208a3907cd00e4dc3b1a45c2b890d642cb96b7e05217/_data/test
#宿主機數據卷默認掛載目錄
[root@docker ~]# docker exec -it $(docker ps -q) ls -l /volume
-rw-r--r--. 1 root root 0 Nov 1 16:12 test
?Docker 數據卷容器
數據卷容器簡介
命名的容器掛載數據卷,其它容器通過掛載這個(父容器)實現數據共享,掛載數據卷的容器,稱之為數據卷容器。
容器之間配置信息的傳遞,數據卷的生命周期一直持續到沒有容器使用它為止。
案例演示
啟動一個 centos_1 容器并掛載數據卷
[root@docker ~]# docker run -itd --name="centos_1" -v /volume:/volumecontainer_1 centos
9f73357be614f7c5098b2ef3a83534002992ee2f281b8b984ed7af5c03a7e29b
#宿主機 /volume 下創建文件 test
[root@docker ~]# touch /volume/test
#驗證,容器 centos_1,/volume/container_1/下共享文件 test
[root@docker ~]# docker exec -it $(docker ps -q) ls -l /volumecontainer_1
total 0
-rw-r--r--. 1 root root 0 Nov 2 14:33 test
啟動一個 centos_2 容器并繼承容器 centos_1 的文件
[root@docker ~]# docker run -itd --name="centos_2" --volumes-from centos_1 centos
baefc86b170c376745761aaea1abc0843521b272213337109510170ff1ccb304
#驗證,容器 centos_2 繼承了容器 centos_1 的文件
[root@docker ~]# docker exec -it $(docker ps -n 1 -q) ls -l /volumecontainer_1
total 0
-rw-r--r--. 1 root root 0 Nov 2 14:33 test
#驗證,在容器 centos_2 中添加文件,宿主機和容器 centos_1 都能共享
[root@docker ~]# docker exec -it $(docker ps -n 1 -q) touch /volumecontainer_1/test_centos_2
#宿主機成功共享文件 test_container_2
[root@docker ~]# ls -l /volume/
總用量 0
-rw-r--r--. 1 root root 0 11月 2 22:33 test
-rw-r--r--. 1 root root 0 11月 2 22:42 test_centos_2
#容器 centos_1成功共享文件 test_container_2
[root@docker ~]# docker exec -it 9f73357be614 ls -l /volumecontainer_1
total 0
-rw-r--r--. 1 root root 0 Nov 2 14:33 test
-rw-r--r--. 1 root root 0 Nov 2 14:42 test_centos_2
原文鏈接:https://blog.csdn.net/Tiamon_/article/details/109432659
相關推薦
- 2022-10-26 一文解析?Golang?sync.Once?用法及原理_Golang
- 2022-09-20 linux?shell字符串截取的詳細總結(實用!)_linux shell
- 2022-12-12 用C語言如何打印一個等腰三角形_C 語言
- 2024-03-14 Liunx安裝Redis
- 2022-06-06 Ubuntu系統-FFmpeg安裝及環境配置
- 2022-03-14 IDEA 上傳文件 getRealpath("/upload)獲取不到文件上傳路徑問題
- 2022-02-12 OWASP列舉的Web應用程序十大安全漏洞 - SQL注入
- 2022-04-12 Taro打包Android?apk過程詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支