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

从下面这张图片,就可以看到,本地目录挂载成功,成功在宿主机创建并对应。

分类: 开发与创造