Docker提供了三种不同的方式将数据从宿主机挂载到容器中:volume,bind, mounts和temps。
volumes:Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
bind mounts:可以存储在宿主机系统的内存中,而不会写入宿主机的文件系统。(相当去做了一个软连接)
b[root@docker ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
1.管理卷
docker volume create nginx-vol
docker volume ls
docker volume inspect nginx-vol
[root@docker ~]# docker volume create nginx-vol #创建一个数据卷
nginx-vol
[root@docker ~]# docker volume ls #查看
DRIVER VOLUME NAME
local nginx-vol
[root@docker ~]# docker volume inspect nginx-vol #查看数据卷的详细信息
[
{
"CreatedAt": "2020-07-14T08:58:13+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/nginx-vol/_data",
"Name": "nginx-vol",
"Options": {},
"Scope": "local"
}
]
2.用卷创建一个容器
docker run -d -it --name=nginx-test --mount src=nginx-vol ,dst=/usr/share/nginx/html nginx
docker run -d -it --name=nginx-test -v nginx-vol:/usr/share/nginx/html nginx
[root@docker ~]# docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
d0a1ab042f4af3b861d5aa7bbb20c1a83710f63a53f82b042764c9415a1fa839
--mount: 指定了用哪个数据卷
src是数据卷地址
dst是目标路径
[root@docker ~]# docker exec -it nginx-test bash #进入容器
root@d0a1ab042f4a:/# cd /usr/share/nginx/html/ #进入挂载的目录下面
root@d0a1ab042f4a:/usr/share/nginx/html# ls #查看文件
50x.html index.html
root@d0a1ab042f4a:/usr/share/nginx/html#
#进入宿主机的目录进行验证
[root@docker _data]# pwd
/var/lib/docker/volumes/nginx-vol/_data
[root@docker _data]# ls
50x.html index.
#新创一个1.html
root@d0a1ab042f4a:/usr/share/nginx/html# ls
1.html 50x.html index.html
root@d0a1ab042f4a:/usr/share/nginx/html# exit
exit
[root@docker _data]# ls
1.html 50x.html index.html
#删除所有的容器
[root@docker _data]# docker rm -f $(docker ps -q -a)
d0a1ab042f4a
ead5aab459f1
fb9dacd72137
c740a992c572
90a8aef6356b
7c77ab4e80fb
88a770ae905d
8e6de4d9c136
6ded32348de2
0f646d20ccb6
9dc1611db1ed
[root@docker _data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker _data]# ls #数据卷还在
1.html 50x.html index.html
#这样的话 下次使用也可以直接用命令去引用
docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
[root@docker _data]# cat a.html #新建一个文件
<h1>1212</h1>
web界面访问ip:88/a.html
#新建一个容器可以共享数据卷
[root@docker _data]# docker run -d -it --name=nginx-test2 -p 89:80 --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
9d420f1c3a3d79ce3e4034b63ce75ce3afb4485fcc487ff174500ffbd9b2c0a6
3.清理
docker container stop nginx-test
docker container rm nginx-test
docker volume rm nginx-vol
ps:
1.如果没有指定数据卷,自动创建一个匿名卷
2.建议使用 --mount ,更通用
官方文档 https://docs.docker.com/storage/volumes/
4.type
[root@docker _data]# docker run -d -it --name=nginx-test3 --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist: /app/wwwroot. #提示不存在
See 'docker run --help'.
#新建一个目录/app/wwwroot
[root@docker _data]# mkdir -p /app/wwwroot
[root@docker _data]# docker run -d -it --name=nginx-test3 --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
854f152a20767678b13b36cbc9c4fed026ce3bbb29aa01929b2e1a85ddc5bb93
[root@docker _data]# docker exec -it nginx-test3 bash
root@854f152a2076:/# mount
#查看挂载
#bind mount这个类型的挂载 会将宿主机上的隐藏
root@854f152a2076:/# ls /usr/share/nginx/html/
root@854f152a2076:/# #是空目录
# 宿主机的目录下新建一个文件
[root@docker _data]# cd /app/wwwroot/
[root@docker wwwroot]# ls
[root@docker wwwroot]# touch 1.html
[root@docker wwwroot]# docker exec -it nginx-test3 bash
root@854f152a2076:/# ls /usr/share/nginx/html/
1.html
ps:
1.如果源文件/目录文件没有存在,不会自动创建,会被抛出一个错误
2.如果挂载目标在容器中非空目录,则该目录现有内容将被隐藏