docker(十)dockerfile(六)数据持久化

81 阅读3分钟

我们为什么要做数据持久化呢?

因为Docker容器化部署后,容器的数据读写默认发生在容器的存储层,当容器被删除时其上的数据将会丢失。比如,使用docker部署的数据库服务,容器一删除,数据全丢了,这样显然不符合实际应用场景。所以,我们需要将数据持久化。

 

Docker为我们提供了两种数据持久化的方式:

一:volume(普通数据卷)

volume Docker管理宿主机文件系统的一部分(数据持久化存储位置:/var/lib/docker/volumes)

 

1 :创建普通卷

# 创建volume数据卷
docker volume create for_nginx
# 查看创建的volume
docker volume ls

1.jpg

注意,再docker中创建普通卷之后,会在/var/lib/docker/volumes目录下创建对应的目录

2.jpg

 

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.jpg

我们再来查看一下主机对应目录下的文件:

4.jpg

 

3:测试文件互通

(1):在容器中创建test.html

进入容器,执行下方命令:

echo "container hello guanchao.site" > test.html

查看目录下文件,创建成功,如下图所示:

5.jpg

查看主机目录下文件:

6.jpg

 

(2):在主机目录下创建文件zhuji.html

7.jpg

在容器中查看文件目录:

8.jpg

发现文件联动成功。

 

二: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

9.jpg

在宿主机目录/usr/local/docker/nginx中查看

10.jpg

 

(2):在宿主机中创建文件index.html,在docker容器中也可以查看到。这里就不做演示了。

 

到这里,docker数据持久化volume和bind mounts命令基本使用大概就是这样。

 

有好的建议,请在下方输入你得评论。