Docker数据卷的创建与应用
Docker数据卷的创建与应用
在容器里增加、删除或修改文件,其实都是对可写层里的文件副本进行了操作。在容器关闭后,该可写层也会被删除,对容器的所有修改都会失效,因此需要解决容器内文件持久化的问题。Docker提供了两种方案来实现:
一、Docker挂载时创建卷:把宿主机文件系统里的目录映射到容器内的目录。如此一来,容器内在该目录里创建的所有文件,都存储到宿主机的对应目录中,在关闭容器后,宿主机的目录依然存在,再次启动容器时还能读取到之前创建的文件,因此实现了容器的文件持久化。当然同时要明白,如果是对镜像自带文件进行了修改,由于镜像是只读的,该修改操作无法在关闭容器时保存下来,除非在修改了文件后构建一个新的镜像。
1、Docker 挂载卷
从nginx镜像中拉取一个名为nginx-test01的容器,指定映射到宿主机80端口,将宿主机的/data挂载到容器/usr/share/nginx/html下,从而使宿主机的/data成为挂载卷
[root@docker ~] # docker run -d -p 80:80 -v /data:/usr/share/nginx/html --name nginx-test01 nginx 4fdbb1bdfcb36348643f0c2e64a72e9750ee0b2e1b6dbae3d41fcec179209ce6 |
访问测试:
[root@docker ~] # curl 192.168.22.135:80 |
403 Forbidden
由于/data中并没有主页资源,所以访问结果显示403(在下一步中写入)
2、宿主机写入数据再次访问验证:
[root@docker ~] # cd /data [root@docker data] # ls [root@docker data] # echo 123asd > index.html [root@docker data] # curl 192.168.22.135:80 123asd |
3、设置共享卷
使用同一个卷启动一个新容器并访问测试:
从nginx镜像中拉取一个名为nginx-test02的容器,指定映射到宿主机8080端口,仍将宿主机的/data挂载到容器/usr/share/nginx/html下,由于/data已作为了容器nginx-test01的挂在卷,在这里又成为了nginx-test02挂载卷,因此宿主机/data成为共享卷。
[root@docker ~] # docker run -d -p 8080:80 -v /data:/usr/share/nginx/html --name nginx-test02 nginx 0c609176a6f77df1d467d679f18221de900943ddbc9aba9c589c00b6ed9e6405 [root@docker ~] # curl 192.168.22.135:8080 123asd |
二、Docker创建卷后挂载:
[root@docker ~] # docker volume create --name nginx-j01 nginx-j01 [root@docker ~] # docker volume ls DRIVER VOLUME NAME local nginx-j01 |
2、查看卷路径
[root@docker ~] # docker volume inspect nginx-j01 [ { "CreatedAt" : "2020-07-29T17:50:21+08:00" , "Driver" : "local" , "Labels" : {}, "Mountpoint" : "/var/lib/docker/volumes/nginx-j01/_data" , "Name" : "nginx-j01" , "Options" : {}, "Scope" : "local" } ] |
可查看出卷所在路径为/var/lib/docker/volumes/nginx-j01/_data
3、创建docker共享卷挂载
从镜像nginx中拉取一个名为nginx-test03的容器,映射宿主机端口9000,将之前创建的共享卷nginx-j01挂载到名为nginx-test03的容器中;将数据写入主页文件,并做访问测试。
[root@docker ~] # docker run -d -p 9000:80 -v nginx-j01:/usr/share/nginx/html --name nginx-test03 nginx c40c65a2060d34319ac33a2263fb11cffdf50075b8efd4209cbd97ee163fb2e7 [root@docker ~] # echo 888 > /var/lib/docker/volumes/nginx-j01/_data/index.html [root@docker ~] # curl 192.168.22.135:9000 888 |
4、实现docker共享卷挂载
从镜像nginx中拉取一个名为nginx-test04的容器,自动映射一个宿主机端口,将之前创建的共享卷挂载到该容器中,因为该共享卷之前挂载到了nginx-test03又挂载到了nginx-test04中,所以正在成为了共享卷。
[root@docker ~] # docker run -d -P --volumes-from nginx-test03 --name nginx-test04 nginx 862e2f3867cb33a91dcc3b3809bde7a0de951a11fea8fea77163db7c39a227b2 |
--volumes-from # 指定共享卷所在的容器
5、查看使用的端口并做访问测试
[root@docker ~] # netstat -lntup Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID /Program name tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1104 /master tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1015 /sshd tcp6 0 0 ::1:25 :::* LISTEN 1104 /master tcp6 0 0 :::32768 :::* LISTEN 88573 /docker-proxy tcp6 0 0 :::9000 :::* LISTEN 55370 /docker-proxy tcp6 0 0 :::8080 :::* LISTEN 53960 /docker-proxy tcp6 0 0 :::80 :::* LISTEN 52152 /docker-proxy tcp6 0 0 :::22 :::* LISTEN 1015 /sshd [root@docker ~] # curl 192.168.22.135:32768 888 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统