我们为什么要做数据持久化呢?
因为Docker容器化部署后,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。比如,使用docker部署的数据库服务,容器一删除,数据全丢了,这样显然不符合实际应用场景。所以,我们需要将数据持久化。
Docker为我们提供了两种数据持久化的方式:
一:volume(普通数据卷)
volume : Docker管理宿主机文件系统的一部分(数据持久化存储位置:/var/lib/docker/volumes)
1 :创建普通卷
# 创建volume数据卷
docker volume create for_nginx
# 查看创建的volume
docker volume ls
注意,再docker中创建普通卷之后,会在/var/lib/docker/volumes目录下创建对应的目录
2:运行容器,并挂载普通卷
# 运行容器并挂载(nginx为例)
docker run --name mynginx -d -p 8081:80 --mount type=volume,source=for_nginx,target=/usr/share/nginx/html nginx
执行完成上方的命令之后,就会在主机的/var/lib/docker/volumes目录下创建对应的目录
进入容器:
docker exec -it 727128ed4350 /bin/bash
进入/usr/share/nginx/html目录:
我们再来查看一下主机对应目录下的文件:
3:测试文件互通
(1):在容器中创建test.html
进入容器,执行下方命令:
echo "container hello guanchao.site" > test.html
查看目录下文件,创建成功,如下图所示:
查看主机目录下文件:
(2):在主机目录下创建文件zhuji.html
在容器中查看文件目录:
发现文件联动成功。
二:bind mounts(绑定数据卷)
bind mounts : 可以存储在宿主机系统的任意位置
这个相对来说就比较方便了,更适合在windows系统中使用。我这里还是使用linux系统做测试。
1 :在主机中创建目录:
/usr/local/docker/nginx
2:运行容器并挂载
# 运行容器并设置挂载(正常方式)
docker run --name mynginxmount -d -p 8088:80 --mount type=bind,source=/usr/local/docker/nginx,target=/usr/share/nginx/html nginx
# 运行容器并设置挂载(-v方式)简写
docker run --name mynginx1 -d -p 8088:80 -v /usr/local/docker/nginx:/usr/share/nginx/html nginx
3 :进入容器并查看文件
docker exec -it 5f192265d38a /bin/bash
cd /usr/share/nginx/html/ && ls
然后,就很奇怪了,这个目录下啥也没有……
原来:使用bind mounts挂载宿主机目录到一个容器中的非空目录,那么此容器中非空目录中的文件会被清空,容器中访问的这个目录直接就是宿主机上的相应挂载目录。
4:测试文件互通
(1):在docker中创建文件
echo "mount hello gunahcoa.site docker" > test.html
在宿主机目录/usr/local/docker/nginx中查看
(2):在宿主机中创建文件index.html,在docker容器中也可以查看到。这里就不做演示了。
到这里,docker数据持久化volume和bind mounts命令基本使用大概就是这样。
有好的建议,请在下方输入你得评论。