一、挂载方式
Docker提供三种方式将数据从宿主机挂载到容器中:
- volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
- bind mounts:将宿主机上的任意位置的文件或者目录挂载到容器中。
- tmpfs:挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同时避免写入容器可写层提高性能。
二、Volume
#管理卷:
docker volume ls
docker volume create nginx-vol
docker volume inspect nginx-vol
#用卷创建一个容器:
docker run -d --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
【说明】
1、--mount 和 -Vd都是挂载,只是版本不同用法不同
2、nginx-vol是创建的数据卷
3、/usr/share/nginx/html是容器的数据目录文件挂在到数据卷的路径。
#清理:
docker stop nginx-test #停止容器nginx-test
docker rm nginx-test #删除容器nginx-test
docker volume rm nginx-vol #删除数据卷nginx-vol
1、挂载
docker run -d --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
验是否挂在成功:
#查看数据nginx-vol
[root@master ~]# docker volume inspect nginx-vol
[
{
"CreatedAt": "2021-08-16T14:41:40+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/data/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
#查看数据卷挂载目录下文件
[root@master ~]# ls /data/docker/volumes/nginx-vol/_data
50x.html index.html
#登陆容器查看nginx容器文件是否对应
[root@master ~]# docker exec -it nginx-test /bin/bash
root@cdb030d9759e:/# ls /usr/share/nginx/html/
50x.html index.html
2、没有指定卷,自动创建卷
操作:
#查看数据卷
[root@master ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
#将/usr/share/nginx/html挂载到nginx-vol-2卷上
[root@master ~]# docker run -d --name=nginx-test2 -v nginx-vol-2:/usr/share/nginx/html nginx
e21b66dcc719eca2ed09b15266e39c9a6835d5ae061788936159a218119425d2
#发现自动生成卷nginx-vol-2
[root@master ~]# docker volume ls
DRIVER VOLUME NAME
local nginx-vol
local nginx-vol-2
3、删除容器、卷是否存在
验证
#登陆nginx-test
[root@master ~]# docker exec -it nginx-test /bin/bash
#修改发布目录
root@cdb030d9759e:/# echo "jiawenchao" >/usr/share/nginx/html/index.html
root@cdb030d9759e:/# exit
exit
#查看ngixn-test的IP
[root@master ~]# docker inspect nginx-test |grep -i ipaddr
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.6",
"IPAddress": "172.17.0.6",
#访问IP地址,确认修改。
[root@master ~]# curl 172.17.0.6
jiawenchao
#查看数据卷是否变动
[root@master ~]# cat /data/docker/volumes/nginx-vol/_data/index.html
jiawenchao
#删除容器nginx-test
[root@master ~]# docker rm -f nginx-test
nginx-test
#重新启动新容器
docker run -d --name=jiawenchao -v nginx-vol:/usr/share/nginx/html nginx
#查看容器jiawenchao的IP地址
[root@master ~]# docker inspect jiawenchao |grep -i ipaddr
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.6",
"IPAddress": "172.17.0.6",
#访问发现还是之前的数据
[root@master ~]# curl 172.17.0.6
jiawenchao
二、Bind Mounts
1、宿主机目录映射
#用卷创建一个容器:
docker run -d --name=wenchao --mount type=bind,src=$PWD/wwwroot,dst=/usr/share/nginx/html nginx
docker run -d --name=wenchao -v $PWD/wwwroot:/usr/share/nginx/html nginx
【说明】
1、$PWD/wwwroot #宿主机上的目录路径,有则直接使用、无则自动创建。
2、/usr/share/nginx/html #容器本身需要被映射数据路径
验证:
#启动一个容器wenchao
[root@master ~]# docker run -d --name=wenchao -v $PWD/wwwroot:/usr/share/nginx/html nginx
#查看IP
[root@master ~]# docker inspect wenchao |grep -i ipaddr
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.8",
"IPAddress": "172.17.0.8",
#访问报错403,原因是没有数据也没有网页
[root@master ~]# curl 172.17.0.8
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.21.1</center>
</body>
</html>
#导入“hello wrod"html发布目录,并放到/wwwroot/下
[root@master ~]# echo "hello wrod" > wwwroot/index.html
#再次访问发现hello word
[root@master ~]# curl 172.17.0.8
hello wrod
注意:
- 如果源文件/目录没有存在,不会自动创建,会抛出一个错误。
- 如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏。
三、总结知识点
【挂载官网】https://docs.docker.com/storage/bind-mounts/
Volume特点:
- 多个运行容器之间共享数据,多个容器可以同时挂载相同的卷。
- 当容器停止或被移除时,该卷依然存在。
- 当明确删除卷时,卷才会被删除。
- 将容器的数据存储在远程主机或其他存储上(间接)
- 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts特点:
- 从主机共享配置文件到容器。默认情况下,挂载主机/etc/resolv.conf到每个容器,提供DNS解析。
- 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上构建Maven项目时,容器都可以访问构建的项目包。
- 当Docker主机的文件或目录结构保证与容器所需的绑定挂载一致时