你必须知道的Docker数据卷

02

Volume的基本使用

2.1 管理卷


# docker volume create edc-nginx-vol // 创建一个自定义容器卷
# docker volume ls // 查看所有容器卷
# docker volume inspect edc-nginx-vol // 查看指定容器卷详情信息

例如,这里我们创建一个自定义的容器卷,名为”edc-nginx-vol”:

2.2 创建使用指定卷的容器

有了自定义容器卷,我们可以创建一个使用这个数据卷的容器,这里我们以nginx为例:


# docker run -d -it –name=edc-nginx -p 8800:80 \
# -v edc-nginx-vol:/usr/share/nginx/html nginx

其中,-v代表挂载数据卷,这里使用自定数据卷edc-nginx-vol,并且将数据卷挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

如果没有通过-v指定,那么Docker会默认帮我们创建匿名数据卷进行映射和挂载。

创建好容器之后,我们可以进入容器里面看看:

可以看到有两个默认页,这时我们新启动一个SSH连接到宿主机去到刚刚创建的数据卷里边看看:

可以看到,我们可以访问到容器里面的两个默认页面,由此可知,volume帮我们做的类似于一个软链接的功能。在容器里边的改动,我们可以在宿主机里感知,而在宿主机里面的改动,在容器里边可以感知到。

这时,如果我们手动stop并且remove当前nginx容器,我们会发现容器卷里面的文件还在,并没有被删除掉。

由此可以验证,在数据卷里边的东西是可以持久化的。如果下次还需要创建一个nginx容器,那么还是 复用 当前数据卷里面的文件。

此外,我们还可以启动多个nginx容器实例,并且共享同一个数据卷,复用性和扩展性较强。

2.3 清理卷

如果不再使用自定义数据卷了,那么可以手动清理掉:


# docker stop edc-nginx // 暂停容器实例
# docker rm edc-nginx // 移除容器实例
# docker volume rm edc-nginx-vol // 删除自定义数据卷

03

Bind Mounts的基本使用

3.1 使用卷创建一个容器


# docker run -d -it –name=edc-nginx \
# -v /app/wwwroot:/usr/share/nginx/html nginx

这里指定了将宿主机上的 /app/wwwroot 目录(如果没有会自动创建)挂载到 /usr/share/nginx/html (这个目录是yum安装nginx的默认网页目录)。

这时我们再次进入容器内部看看:

可以看到,与volumes不同,bind mounts的方式会隐藏掉被挂载目录里面的内容(如果非空的话),这里是/usr/share/nginx/html 目录下的内容被隐藏掉了,因此我们看不到。

但是,我们可以将宿主机上的文件随时挂载到容器中:

Step1 .新建一个index.html

Step2 .在容器中查看

3.2 验证绑定

# docker inspect edc-nginx

通过上述命令可以看到一大波配置,我们要关注的是:

3.3 清理


# docker stop edc-nginx
# docker rm edc-nginx

同volumes一样,当我们清理掉容器之后,挂载目录里面的文件仍然还在,不会随着容器的结束而消失,从而实现数据持久化。

3.4 应用案例

在服务治理组件中,服务发现组件是一个最常用的组件之一,Consul是一个流行的服务发现开源项目,Consul推荐我们使用配置文件的方式注册服务信息。 因此,我们常常会将填写好服务注册配置文件放在宿主机的一个文件目录下将其挂载到Consul的容器指定目录下,如下所示:


docker run -d -p 8500:8500 –restart=always \
-v /XiLife/consul/data/server1:/consul/data -v /XiLife/consul/conf/server1:/consul/config \
-e CONSUL_BIND_INTERFACE=‘eth0’ –privileged=true \
–name=consul_server_1 consul:1.4.4 agent -server -bootstrap-expect=3 -ui -node=consul_server_1 -client=‘0.0.0.0’ \

data-dir /consul/data -config-dir /consul/config -datacenter=xdp_dc;

可以看到,我们通过Bind Mounts的方式将宿主机上的/XiLife/consul/data/server1目录挂载到了容器的/consul/data目录下,还将/XiLife/consul/conf/server1目录挂载到了容器的/consul/config目录下,而容器下的两个目录/consul/data和/consul/config则是我们指定的存放agent数据和配置文件的地方。 因此,宿主机上的配置文件的变化会及时反映到容器中,比如我们在宿主机上的目录下更新了配置文件,那么只需要reload一下Consul的容器实例即可:

# docker exec consul-server consul reload

*. 这里的consul-server是容器的名字,consul reload是重新加载的命令(非restart)。

04

小结

本文探索了Docker的数据卷及挂载数据到容器的两种主要方式Volumes和Bind Mounts,并介绍基本的使用方式和步骤,通过数据卷我们可以实现Docker的数据持久化,在实际应用中比较广泛。

参考资料:

(1)李振良,《Docker Volume详解》

(2)CloudMan,《每天5分钟玩转Docker容器技术》

(3)阿龙,《Docker存储卷详解》

传送门:

我在2019年最主要的博文《.NET Core on K8S学习实践系列文章索引》=>https://www.cnblogs.com/edisonchou/p/aspnet_core_k8s_artcles_index.html