一、Docker容器数据持久化存储介绍

物理机或虚拟机数据持久化存储

  • 由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接把数据存储在物理机或虚拟机本地文件系统中,亦或者也可以通过使用额外的存储系统(NFS、GlusterFS、Ceph等)来完成数据持久化存储。

Docker容器数据持久化存储

  • 由于Docker容器是由容器镜像生成的,所以一般容器镜像中包含什么文件或目录,在容器启动后,我们依旧可以看到相同的文件或目录。

  • 由于Docker容器属于"用后即焚”型计算资源,因此Docker容器不适合做数据持久化存储

二、Docker容器数据持久化存储方式

Docker提供三种方式将数据从宿主机挂载到容器中:

  • docker run -v

    • 运行容器时,直接挂载本地目录至容器中
  • volumes

    • Docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)
    • 是Docker默认存储数据方式
  • bind mounts

    • 将宿主机上的任意位置文件或目录挂载到容器中

三、Docker容器数据持久化存储方式应用案例演示

3.1 docker run -v

3.1.1 创建了本地目录

nginx下新建index.html文件,并且定义内容

root@hecs-213321:~/Docker/nginx# ls
index.html
root@hecs-213321:~/Docker/nginx# cat index.html 
<h1>今天是9月9日</h1>

启动容器
-v ./nginx/:/usr/share/nginx/html/:将宿主机中的nginx目录下的文件挂载到容器中的/usr/share/nginx/html/目录下

root@hecs-213321:~/Docker# docker run -d --name web -v ./nginx/:/usr/share/nginx/html/ nginx:latest

查看容器

root@hecs-213321:~/Docker# sudo docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
e3e2107bf3fc   nginx:latest   "/docker-entrypoint.…"   58 seconds ago   Up 56 seconds   80/tcp    web

查看容器的IPAddress

root@hecs-213321:~/Docker/nginx# docker inspect web

访问

root@hecs-213321:~/Docker/nginx# curl http://172.17.0.2
<h1>今天是9月9日</h1>

把容器删掉

root@hecs-213321:~/Docker/nginx# docker stop web
web
root@hecs-213321:~/Docker/nginx# docker rm web
web

发现宿主机中的文件还在

root@hecs-213321:~/Docker# cd nginx/
root@hecs-213321:~/Docker/nginx# ls
index.html

当重新运行容器时,容器中的/usr/share/nginx/html/目录下还会存在index.html文件

root@hecs-213321:~/Docker/nginx# docker run -d --name web -v ./nginx/:/usr/share/nginx/html/ nginx:latest
7559987e00f184fb96ce136149e864197bbbe5366930f93d85fad6222ba363ab

当在容器中的挂载的文件发生变化,宿主机中挂载的文件也将发生变化。

root@hecs-213321:~/Docker/nginx# sudo docker exec -it web /bin/sh

修改容器中的文件内容

# cd /usr/share/nginx/html

# echo '66666'>index.html
# cat index.html
66666

宿主机中的文件内容也将发生变化

root@hecs-213321:~/Docker/nginx/nginx# cat index.html
66666

同样的,当在宿主机中的挂载的文件发生变化,容器中挂载的文件也将发生变化。

3.1.2 未创建本地目录

运行容器

root@hecs-213321:~# docker run -d --name web1 -v ./web1root/:/usr/share/nginx/html/ nginx:latest

查看运行中的容器

root@hecs-213321:~# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
6f631e440db1   nginx:latest   "/docker-entrypoint.…"   31 seconds ago   Up 30 seconds   80/tcp    web1
7559987e00f1   nginx:latest   "/docker-entrypoint.…"   34 minutes ago   Up 34 minutes   80/tcp    web

查看web1容器的IPAddress

docker inspect web1

访问,报403

curl http://172.17.0.3

原因是该目录下没有文件

root@hecs-213321:~# ls
Docker  snap  web1root
root@hecs-213321:~# cd web1root/
root@hecs-213321:~/web1root# ls

创建index.html文件,并且新加内容,再次访问即可访问成功

root@hecs-213321:~/web1root# echo 'web1' > index.html
root@hecs-213321:~/web1root# curl http://172.17.0.3
web1

3.2 volumes

3.2.1 创建数据卷

docker volume create nginx-volume

查看数据卷

root@hecs-213321:~# docker volume ls
DRIVER    VOLUME NAME
local     9b4315d9adb4ce6677921ea040e3f9180c325230aa8cd8cdfa8fac754318473f
local     nginx-volume

查看数据卷详情

root@hecs-213321:~# docker inspect nginx-volume
[
     {
        "CreatedAt": "2023-09-09T11:45:17+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx-volume/_data",
        "Name": "nginx-volume",
        "Options": null,
        "Scope": "local"
    }
]

3.2.2 使用数据卷

-- mount:指定使用自己创建的volume
src=nginx-volume:指定使用那个数据卷
dst:指定挂载到容器中的具体位置

root@hecs-213321:~# docker run -d --name web3 --mount src=nginx-volume,dst=/usr/share/nginx/html/ nginx:latest
231aa656b24d2e189e0f340df7447fcc0db96cbdc530e060fa7bdd52799e1b50
root@hecs-213321:~# ls

查看容器详细信息,并且访问

root@hecs-213321:~# docker inspect web3

并没有报403
上面的操作中创建容器的时候使用 -v 会报403

创建的数据卷,默认存储在/var/lib/docker/volumes/nginx-volume/_data目录下

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐