docker有三种挂载方式: 1、卷:docker自动在外部创建文件夹,来挂载容器内部指定的内容。【Dockerfile中VOLUME指令会实现这种挂载】。 2、绑定挂载:自己在外边创建文件夹,并且手动将容器中的内容挂载到创建的文件夹。 3、临时挂载:把容器中的数据挂载到内存中。(很少用到)
volume(卷)
-
volume(卷)
:存储在主机文件系统的一部分中,该文件系统由Docker管理(在linux上的目录是:/var/lib/docker/volume)。非DOcker进程不应该修改文件系统中的这一部分。卷是在docker中持久存储数据的最佳方法
#绑定
#创建一个将界面html挂载到宿主机的容器,宿主机的地址前面不加斜杠,不加斜杠时,前面会默认加卷的地址
#docker将创建出名为nginx的卷,并保存容器/etc/nginx下面的内容
docker run -d -P --name=mynginxtest3 -v html:/usr/share/nginx/html nginx
#访问后得到如下结果
docker inspect 容器ID #在容器的详细信息里查询挂载目录 如图:Source是宿主机的路径,/var/lib/docker/volumes是卷的路径 Destination是容器的路径 我们看/var/lib/docker/volumes/html/_data路径下,也有对应的html文件 宿主机的路径前不加“/”时,docker没有把它当作一个路径,而是当成一个卷目录,卷目录由docker自己管理
#创建一个将界面html挂载到宿主机的容器,不写宿主机路径
#创建一个匿名卷,并保存容器/usr/share/nginx/html下面的内容
docker run -d -P --name=mynginxtest4 -v /usr/share/nginx/html nginx
#-v 宿主机目录:容器目录
#访问后得到如下结果,可以正常访问
没有写宿主机的挂载目录,我们来看一下把文件挂载到了哪里 docker inspect 容器ID
如果将空卷装入存在文件或目录的容器中的目录中,则容器中的内容(复制)到该卷中。 如果启动一个容器并指定一个尚不存在的卷,则会创建一个空卷。
bind mount(绑定挂载)
-
bind mount(绑定挂载)
:可以在任何地方存储在主机系统上。他们甚至可能是重要的系统文件或目录。主机或docker容器上的非docker进程可以随时对其进行修改。
#挂载
#创建一个将界面html挂载到宿主机的容器,宿主机的目录为绝对路径
docker run -d -P --name=mynginxtestv -v /root/html:/usr/share/nginx/html nginx
#-v 宿主机目录:容器目录
#访问后得到如下结果,因为宿主机一开始没有这个目录,创建了这个目录以后,是个空的文件夹,所以访问结果是forbidden
docker inspect 容器ID #在容器的详细信息里查询挂载目录 我们来看一下宿主机的挂载目录并切换到该目录下,发现是一个空文件夹,空挂载。
#我们再用同一个镜像启动一个不挂载的nginx容器
docker run -d -P --name=mynginxtest2 nginx
#访问发现界面正常返回
1、在宿主机创建两个文件夹
2、将nginx容器内的两个文件夹挂载到创建的文件夹
3、启动容器发现容器并没有启动起来
4、看日志发现打不开文件
解决上面的问题方法:
提前准备好要挂载的文件夹及文件夹里面的内容,再执行命令
- 外部目录覆盖内部容器目录内容,但不是修改。所以谨慎,外部空文件夹挂载方式也会导 致容器内部是空文件夹
- 警惕bind mount 方式,文件挂载没有在外部准备好内容而导致的容器启动失败问题
tmpfs mount(临时挂载)
-
tmpfs mount(临时挂载)
:仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统
管理卷
docker volume create xxx:创建卷名
docker volume inspect xxx:查询卷详情
docker volume ls: 列出所有卷
docker volume prune: 移除无用卷