1.数据卷挂载
Docker启动后,容器内的文件和宿主机是隔离的,如果不使用docker commit 操作提交容器为镜像把数据保存下来,数据就会因为容器的删除而丢失。而且尽量不使用 docker commit 提交镜像,因为会导致镜像无法通过Dockerfile 复现,不利于迁移、重新构建等情况。
为了可以保存数据,又不至于破坏镜像的可复现特性,Docker 提出了数据卷的概念。数据卷又分为两种,即数据卷和数据卷容器。
什么是数据卷?
数据卷是一个虚拟的目录,是容器内目录和宿主机目录之间映射的桥梁。
数据卷的挂载
我们假设nginx部署了一个静态网站。nginx有静态文件目录和配置文件,我们是无法直接修改容器内的文件的。一个好的方式就是通过数据卷进行挂载。
每一个数据卷都跟宿主机上的一个文件夹进行一一对应。双向绑定,也就是你在宿主机内新增一个文件,那么容器内相应的地方也会新增一个文件。同理,如果你修改了容器内的文件,那么宿主机对应的文件也会被同步修改。
宿主机默认数据卷位置在 /var/lib/docker/volumes 这个目录下, 而容器需要对应的的文件夹或文件是作者自定义好的,去官方查看即可。
关于数据卷的一些命令:
docker volume create 创建数据卷
docker volume ls 查看所有数据卷
docker volume rm 删除指定数据卷
docker volume inspect 查看某个数据卷的详情
docker volume prune 清除数据卷
如何挂载?
在执行docker run命令时,使用 -v 数据卷名:容器内目录 可以完成数据卷挂载。
注意,如果容器已经创建完毕,不允许第二次挂载数据卷。
docker run -d --name nginx-test -p 80:80 -v html:/usr/share/nginx/html nginx
上面的这个指令就是创建容器并同步创建数据卷操作。用宿主机的html文件夹对应nginx容器的/usr/share/nginx/html这个文件夹。
从上面的图片可以看到,执行完数据卷挂载以后,宿主机对应文件底下生成了_data文件,而且里面的文件和容器内是一一对应的。
我们访问网站,发现正常展示nginx默认欢迎页面。
我们在宿主机 打开刚才的index.html文件,并进行修改,将上面的内容换成hello world。保存后再次访问网站。
2.本地目录挂载
除了上面的数据卷挂载方式外,实际应用中还可以使用本地目录进行挂载。
以mysql为例,mysql主要用来存储数据,如果把数据都存在容器内,那么容器的体积会越来越大,所以默认情况下,使用mysql创建容器后,会自动在宿主机创建对应的数据卷,把数据都存储在宿主机上。这个目录的名称是随机的一串码,并不好记。
考虑到mysql升级或者备份等,需要进行本地目录的挂载。
使用下面目录可以完成本地目录挂载
-v 本地目录:容器内目录
其实这个和数据卷的主要区别是一个是用名字对应容器目录,一个是用本地目录对应容器目录。
我们进行简单挂载:
docker run -d --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /root/mysql/data:/var/lib/mysql mysql
从下面这张图片,就可以看到,本地目录挂载成功,成功在宿主机创建并对应。