Docker基本命令与使用 —— Docker Volume 容器卷(六)
官方文档地址: https://docs.docker.com/storage/volumes/
1. Docker提供三种方式将数据从宿主机挂载到容器中
- volumes: Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)。保存数据的最佳方式。
- bind mounts: 将宿主机上的任意位置的文件或目录挂载到容器中。
- tmpfs: 挂载存储在主机系统的内存中,而不会写入主机的文件系统。如果不希望将数据持久存储在任何位置,可以使用tmpfs,同事避免写入容器可写层提高性能。(此种方式不常用,这里暂不讨论)
2. Volume
管理卷:
docker volume create wwwroot
docker volume ls
docker volume inspect wwwroot
实际文件目录为 /var/lib/docker/volumes下,但一般不建议更改。(如需指定目录,用bind方式)
用卷创建一个容器:
#/usr/share/nginx/html为nginx默认网站的跟目录 docker run -d --name=nginx-text --mount src=wwwroot,dst=/usr/share/nginx/html nginx docker run -d --name=nginx-test -v wwwroot:/usr/share/nginx/html nginx
以上两个命令效果一样,mount命令是新出来,用于替换 -v ,看上去更加清晰
清理:
docker stop nginx-test docker rm nginx-test docker volume rm wwwroot
注意:
- 如果指定卷没有创建,则会自动创建
- 建议使用 --mount,更通用
3. Bind Mounts
宿主机上的文件或目录挂载到容器中。此命令类似于linux ln -s,软连接
用卷创建一个容器:
docker run -d --name=nginx-text --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
docker run -d --name=nginx-test -v /app/wwwroot:/usr/share/nginx/html nginx
注意:
- 如果源文件/目录没有不存在,不会自动创建,会抛出一个错误
- 如果挂载目标在容器中非空目录,则该目录现有内容(容器中原有内容)将被隐藏
4. 小结:
Volume特点
- 多个运行容器之间共享数据,多个容器可以同事挂载相同的卷
- 当容器停止或被移除时,该卷依然存在
- 当明确删除卷时,卷才会被删除
- 将容器的数据存储在远程主机或其他存储上(间接)
- 将数据从一台Docker主机迁移到另一台时,先停止容器,然后备份卷的目录(/var/lib/docker/volumes/)
Bind Mounts特点:
- 从主机共享配置文件到容器。默认情况下,挂载主机 /etc/resolv.conf到每个容器,提供DNS解析
用法如下图,挂载nginx.conf配置文件到nginx容器中,替代默认的文件
- 在Docker主机上的开发环境和容器之间共享源代码。例如,可以将Maven target目录挂载到容器中,每次在Docker主机上购机Maven项目时,容器都可以访问构建的项目包。
- 当Docker主机的文件或者目录结构保证与容器所需的绑定挂载一致时