使用docker数据卷持久化容器数据

时间:2022-07-22
本文章向大家介绍使用docker数据卷持久化容器数据,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

volume是用于对Docker容器生成和使用的数据持久化的首选机制。如果您的容器生成非持久状态数据,请考虑使用 tmpfs挂载以避免将数据永久存储在任何地方,并通过避免写入容器的可写层来提高容器的性能。

默认容器的数据存储

在这里我们在容器中创建一些模拟的数据,然后模式容器停止或删除后数据是否丢失。

## 创建数据

[root@myserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
a0316d74ef5d        bulletinboard:1.0   "docker-entrypoint.s…"   55 minutes ago      Up 16 minutes       0.0.0.0:8000->8080/tcp   bb
[root@myserver ~]# docker exec -it bb bash
root@a0316d74ef5d:/usr/src/app# ls
Dockerfile  app.js   fonts  node_modules     package.json  server.js
LICENSE     backend  index.html  package-lock.json  readme.md   site.css
root@a0316d74ef5d:/usr/src/app# cd
root@a0316d74ef5d:~# ls
root@a0316d74ef5d:~# mkdir data
root@a0316d74ef5d:~# ls
data
root@a0316d74ef5d:~# cd data/
root@a0316d74ef5d:~/data# ls
root@a0316d74ef5d:~/data# echo 12323 > tst.txt
root@a0316d74ef5d:~/data# cat tst.txt
12323
root@a0316d74ef5d:~/data# pwd
/root/data
root@a0316d74ef5d:~/data#


## 停止并重新启动容器数据还是存在的
## 删除容器(加入对镜像做了修改)数据丢失 

[root@myserver ~]# docker run -itd --name bb bulletinboard:1.0
98e14379e2109c9230d1d265ac586ce3bba433efb7d2ef544ef93cb58c859f0a
[root@myserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
98e14379e210        bulletinboard:1.0   "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        8080/tcp            bb
[root@myserver ~]# docker exec -it bb bash
root@98e14379e210:/usr/src/app# cd
root@98e14379e210:~# ls
root@98e14379e210:~#

Volume使用方法

我们来通过docker volume命令管理volume。创建volume到将volume挂载到容器中。

## 创建一个volume
[root@myserver ~]# docker volume create --name myvolume
myvolume
[root@myserver ~]# docker volume ls
DRIVER              VOLUME NAME
local               myvolume
[root@myserver ~]# docker volume inspect myvolume
[
    {
        "CreatedAt": "2020-07-11T21:52:26-04:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]

## 在挂载点创建数据
[root@myserver ~]# cd /var/lib/docker/volumes/myvolume/_data
[root@myserver _data]# ls
[root@myserver _data]# echo 11111 > a.txt
[root@myserver _data]# ls
a.txt
[root@myserver _data]# cd -
/root



## 将卷挂载给容器
[root@myserver ~]# docker run -itd --name bb  -v myvolume:/data:rw bulletinboard:1.0
1ed40ff338280def96b4c395d33977219b3e3a47e10444cf23d16f4bb83e0e27
[root@myserver ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
1ed40ff33828        bulletinboard:1.0   "docker-entrypoint.s…"   4 seconds ago       Up 3 seconds        8080/tcp            bb
[root@myserver ~]# docker exec -it bb bash
root@1ed40ff33828:/usr/src/app# cd
root@1ed40ff33828:~# ls
root@1ed40ff33828:~# cd /
root@1ed40ff33828:/# ls
bin   data  etc   lib  media opt   root  sbin  sys  usr
boot  dev   home  lib64  mnt proc  run   srv   tmp  var
root@1ed40ff33828:/# cd data/
root@1ed40ff33828:/data# ls
a.txt
root@1ed40ff33828:/data# cat a.txt
11111
root@1ed40ff33828:/data# echo 12323423 >> a.txt
root@1ed40ff33828:/data# cat a.txt
11111
12323423
root@1ed40ff33828:/data# cd
root@1ed40ff33828:~# mkdir /data/test
root@1ed40ff33828:~# echo 12312312 > /data/test/a.txt
root@1ed40ff33828:~# exit
exit


### 删除容器后重新启动容器发现数据还在。
[root@myserver ~]# docker rm --force bb
bb
[root@myserver ~]# docker run -itd --name bb  -v myvolume:/data:rw bulletinboard:1.0
17f0178d062e8fe041aae55229e1f522237ca5753e01515a451c68d9c2aaf51b
[root@myserver ~]# docker exec -it bb bash
root@17f0178d062e:/usr/src/app# cd /data/
root@17f0178d062e:/data# ls
a.txt  test
root@17f0178d062e:/data# ls test/
a.txt

容器挂载volume的另外一种方式

我们也可以在启动容器的时候通过-v参数指定volume,如果volume不存在则会自动创建。

[root@myserver ~]# docker run -itd --name cc  -v /tmp/test:/data:rw bulletinboard:1.0
c0fd785c403040c0f3fa0840a738359da5f54aa28f4201cdada0e8de19f8f88a
[root@myserver ~]# docker volume ls
DRIVER              VOLUME NAME
local               myvolume
[root@myserver ~]# cd /tmp/test/
[root@myserver test]# ls
[root@myserver test]# echo 111 >a.txt
[root@myserver test]#
[root@myserver test]#
[root@myserver test]# ls
a.txt
[root@myserver test]#
[root@myserver test]#
[root@myserver test]# cd
[root@myserver ~]# docker exec -it cc bash
root@c0fd785c4030:/usr/src/app# cd /data/
root@c0fd785c4030:/data# ls
a.txt
root@c0fd785c4030:/data#

Docker 存储卷

volume 创建后默认挂载数据目录:/var/lib/docker/volumes/volumeID/_data

[root@myserver ~]# docker volume inspect myvolume
[
    {
        "CreatedAt": "2020-07-11T21:59:36-04:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/myvolume/_data",
        "Name": "myvolume",
        "Options": {},
        "Scope": "local"
    }
]

共享volume

--volumes-from 容器名称,共享容器的volume

方式一:挂载相同的volume

[root@myserver volumes]# docker run -itd --name server01 -v vtest:/data webserver:v1
007d2a504410e435c260d6271d970056fc629880a6654b6777bec206008c4006


docker run -itd --name server02  -v vtest:/data webserver:v1


##创建数据
[root@myserver volumes]# docker volume inspect vtest
[
    {
        "CreatedAt": "2020-07-13T07:59:36-04:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/vtest/_data",
        "Name": "vtest",
        "Options": null,
        "Scope": "local"
    }
]
[root@myserver volumes]# echo 123>/var/lib/docker/volumes/vtest/_data/a.txt

方式二:使用--volumes-from

docker run -itd --name server02  --volumes-from server01 webserver:v1

# 将server01容器所挂载的卷同步给server02