Docker数据持久化
默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
- 当该容器不再存在时,数据将不会持久保存,并且如果另一个进程需要它,则可能很难从容器中取出数据。
- 容器的可写层与运行容器的宿主主机紧密耦合。不能轻易地将数据移动到其他地方。
- 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能 。
Docker为容器提供了两个选项来将文件存储在主机中,以便即使容器停止后文件也可以持久存储:volumes和bind mounts。如果在Linux上运行Docker,则还可以使用tmpfs mount。如果在Windows上运行Docker,则可用使用named pipe。
选择正确的mount类型
无论选择哪种mount类型,容器内的数据看起来都是相同的,在容器的文件系统中都是文件或目录。
volumes、bind mount和tmpfs mount仅仅是数据存放在宿主主机的位置不同。
-
Volumes 存储在宿主主机文件系统上,该文件系统由Docker管理,保存在Linux的/var/lib/docker/volumes/路径下。非Docker进程不应该修改这部分文件系统。Volumes是持久化存储数据的最佳方式。
-
Bind mounts 存储在宿主主机的任何位置。他们甚至可能是重要的文件或文件夹。Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
-
tmpfs mounts 仅存储在宿主主机系统的内存中,并且永远不会写入宿主主机系统的文件系统中。
volume实操
创建MySQL容器
[root@localhost ~]# docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=root mysql
查看volume
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local e91d972f5be6402a063963e6d803243dc9f42469a43a2045389d13c183a6da9d
查看volume详情
[root@localhost ~]# docker volume inspect e91d972f5be6402a063963e6d803243dc9f42469a43a2045389d13c183a6da9d
[
{
"CreatedAt": "2021-03-07T12:06:18Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/e91d972f5be6402a063963e6d803243dc9f42469a43a2045389d13c183a6da9d/_data",
"Name": "e91d972f5be6402a063963e6d803243dc9f42469a43a2045389d13c183a6da9d",
"Options": null,
"Scope": "local"
}
]
映射volume名字
通过-v 命令进行映射-v mysql_volume:/var/lib/mysql
docker run -d --name mysql01 -v mysql_volume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql
查看volume
[root@localhost ~]# docker volume ls
DRIVER VOLUME NAME
local e91d972f5be6402a063963e6d803243dc9f42469a43a2045389d13c183a6da9d
local mysql_volume
查看volume详情
[root@localhost ~]# docker volume inspect mysql_volume
[
{
"CreatedAt": "2021-03-07T12:11:00Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql_volume/_data",
"Name": "mysql_volume",
"Options": null,
"Scope": "local"
}
]
bind mounts实操
创建tomcat容器
[root@localhost ~]# docker run -d --name my-tomcat -v /tmp/tomcat/test:/usr/local/tomcat/webapps/test -p 8080:8080 tomcat:8.5.32
查看目录
- Linux: /tmp/tomcat/test
- tomcat容器:/usr/local/tomcat/webapps/test
分别在两个目录中修改文件,查看是否同时变动
Linux
[root@localhost test]# ls
index.html
tomcat容器
root@e81c97397dac:/usr/local/tomcat/webapps/test# ls
index.html