浅谈Docker之Docker数据持久化Bind Mount和Volume(转)
转自 https://www.jianshu.com/p/ef0f24fd0674
Docker的数据持久化主要有两种方式:
- bind mount
- volume
Docker的数据持久化即是数据不随着container的结束而结束,数据存在于host机器上——要么存在于host的某个指定目录中(使用bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes下)。
#
bind mount#
bind mount自docker早期便开始为人们使用了,用于将host机器的目录mount到container中。但是bind mount在不同的宿主机系统时不可移植的,比如Windows和Linux的目录结构是不一样的,bind mount所指向的host目录也不能一样。这也是为什么bind mount不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
将host机器上当前目录下的host-data目录mount到container中的/container-data目录:
docker run -it -v $(pwd)/host-dava:/container-data alpine sh
有几点需要注意:
- host机器的目录路径必须为全路径(准确的说需要以
/
或~/
开始的路径),不然docker会将其当做volume而不是volume处理 - 如果host机器上的目录不存在,docker会自动创建该目录
- 如果container中的目录不存在,docker会自动创建该目录
- host机器目录无论有没文件,都会覆盖container挂载目录
volume#
将my-volume挂载到container中的/mydata目录:
docker run -it -v my-volume:/mydata alpine sh
然后可以查看到给my-volume的volume:
docker volume inspect my-volume [ { "CreatedAt": "2018-03-28T14:52:49Z", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/my-volume/_data", "Name": "my-volume", "Options": {}, "Scope": "local" } ]
可以看到,volume在host机器的目录为 /var/lib/docker/volumes/my-volume/_data 。此时,如果my-volume不存在,那么docker会自动创建my-volume,然后再挂载。
也可以不指定host上的volume:
docker run -it -v /mydata alpine sh
此时docker将自动创建一个随机名称的volume,并将其挂载到container中的/mydata目录。匿名volume在host机器上的目录路径类似于var/lib/docker/volumes/300c2264cd0acfe862507eedf156eb61c197720f69e7e9a053c87c2182b2e7d8/_data。
除了让docker帮我们自动创建volume,我们也可以自行创建:
docker volume create my-volume-2
然后将这个已有的my-volume-2挂载到container中:
docker run -it -v my-volume-2:/mydata alpine sh
Dockerfile中的VOLUME#
在Dockerfile中,我们也可以使用VOLUME指令来申明contaienr中的某个目录需要映射到某个volume:
#Dockerfile VOLUME /foo
Dockerfile中的VOLUME使每次运行一个新的container时,都会为其自动创建一个匿名的volume,如果需要在不同container之间共享数据,那么我们依然需要通过 docker run -it -v my-volume:/foo 的方式将/foo中数据存放于指定的my-volume中。
因此,VOLUME /foo在某些时候会产生歧义,如果不了解的话将导致问题。
mysql docker run -p 3306:3306 --name mysql-service --restart=always -e MYSQL_ROOT_PASSWORD="HelloWorld@123" -v /app/mysql/conf:/etc/mysql -v /app/mysql/logs:/var/log/mysql -v /app/mysql/data:/var/lib/mysql -v/app/mysql/mysql-files:/var/lib/mysql-files/ -d mysql nginx docker run -p 80:80 --name nginx-service --restart=always -v /app/nginx/conf/:/etc/nginx/ -v /app/nginx/www:/usr/share/html -v /app/nginx/logs/:/var/log/nginx nginx redis docker run -d -p 6379:6379 -v /app/redis/conf/:/etc/redis/ -v /app/redis/data/:/data --name redis-service --restart=always redis --appendonly yes wordpress docker run -d --name blog-service -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=blog-service -e WORDPRESS_DB_PASSWORD=WordPress@123 -e WORDPRESS_DB_NAME=blog -p 8080:80 --link mysql-service:mysql wordpress
作者: Felix-Zhang
出处:https://www.cnblogs.com/zhangxiaoxia/p/13130409.html
版权:本站使用「CC BY 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探