Linux上一切皆为文件,程序代码、网络套接字、数据库的底层存储等等。在容器上也会面临数据管理的问题,主要是通过数据卷和数据卷容器来管理。
1、数据卷
何为数据卷?
是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount的 行为。
1.1 创建数据卷
docker colume COMMAND
命令 | 说明 |
---|---|
create | 创建数据卷 |
inspect | 查看数据卷的详细信息 |
ls | 列出数据卷 |
prune | 删除所有未使用的数据卷 |
rm | 删除一个或多个数据卷 |
docker colume create [OPTIONS] [VOLUME]
OPTIONS为:
选项 | 说明 |
---|---|
-d | string,指定数据卷的驱动名称,默认为local |
–label [] | 设置一个数据卷的元数据 |
-o map[] | 设置驱动的具体选项 |
[root@aliyun dockerStudy]# ll /var/lib/docker/volumes/
drwxr-xr-x 3 root root 4096 Aug 28 14:27 help
-rw------- 1 root root 32768 Aug 28 14:27 metadata.db
[root@aliyun dockerStudy]# docker volume create -d local lfcVolume
lfcVolume
[root@aliyun dockerStudy]# ll /var/lib/docker/volumes/
drwxr-xr-x 3 root root 4096 Aug 28 14:27 help
drwxr-xr-x 3 root root 4096 Aug 28 14:32 lfcVolume
-rw------- 1 root root 32768 Aug 28 14:32 metadata.db
[root@aliyun dockerStudy]# docker volume inspect lfcVolume
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/lfcVolume/_data",
"Name": "lfcVolume",
"Options": {},
"Scope": "local"
}
]
[root@aliyun dockerStudy]# docker volume ls
DRIVER VOLUME NAME
local help
local lfcVolume
[root@aliyun dockerStudy]# docker volume rm lfcVolume
lfcVolume
1.2 绑定数据卷
在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。
docker run ... -v VOLUME_NAME:/CONTAINER_DIR IMAGE_ID
–mount的支持类型(type):
类型 | 说明 |
---|---|
volume | 普通数据卷,映射到主机/var/lib/docker/volumes/路径下; |
bind | 绑定数据卷,映射到主机指定路径下;必须是绝对路径 |
tmpfs | 临时数据卷,只存在于内存中 |
[root@aliyun dockerStudy]# docker volume create -d local lfcCentosVolume
lfcCentosVolume
[root@aliyun dockerStudy]# docker images cen*
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 300e315adb2f 8 months ago 209 MB
[root@aliyun dockerStudy]# docker run -d -P --name lfcCentos -v lfcCentosVolume:/tmp 300e315adb2f4db5df36e955ee2e251c015e87ab2d313393805dfc85e42f66f520a82d84fc30
[root@aliyun dockerStudy]# docker inspect 4db5df36e955ee2e251c015e87ab2d313393805dfc85e42f66f520a82d84fc30
[
{
"Id": "4db5df36e955ee2e251c015e87ab2d313393805dfc85e42f66f520a82d84fc30",
"Created": "2021-08-28T06:54:35.26927141Z",
"Path": "/bin/bash",
"Mounts": [
{
"Type": "volume",
"Name": "lfcCentosVolume",
"Source": "/var/lib/docker/volumes/lfcCentosVolume/_data",
"Destination": "/tmp",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
"Config": {
},
"NetworkSettings": {
}
}
]
可以看到Mounts字段下挂载类型是volume。这样自定义的数据卷就能和容器目录关联了。
2、数据卷容器
数据交互:宿主机 <–> 数据卷容器 <–> 其他容器
2.1 创建宿主机容器
[root@aliyun dockerStudy]# pwd
/data/dockerStudy
[root@aliyun dockerStudy]# mkdir dbdata
[root@aliyun dockerStudy]# ll
total 211480
drwxr-xr-x 2 root root 4096 Aug 28 15:01 dbdata
-rw------- 1 root root 216547328 Aug 22 18:12 lfcCentos.tar
[root@aliyun dockerStudy]# docker run -it --name dbdata -v /data/dockerStudy/dbdata 300e315adb2f
# 宿主机的文件
[root@aliyun dbdata]# docker run -it --name dbdata -v /data/dockerStudy/dbdata:/data/dockerStudy/dbdata 300e315adb2f
# 容器内部
[root@5b25aec64e3f /]# ls /data/dockerStudy/dbdata/
[root@5b25aec64e3f /]# cd /data/dockerStudy/dbdata/
[root@5b25aec64e3f dbdata]# echo "hello world" >hw.txt
[root@5b25aec64e3f dbdata]# ls
# 回到宿主机
[root@aliyun dbdata]# pwd
/data/dockerStudy/dbdata
[root@aliyun dbdata]# ll
total 4
-rw-r--r-- 1 root root 12 Aug 28 15:17 hw.txt
2.2 使用宿主机容器
docker run ... --volumes-from DB_CONTAINER IMAGE_ID
# 宿主机
[root@aliyun dbdata]# docker run -it --volumes-from dbdata --name biz_container centos
# 容器内部,可以看到最数据卷容器对象的宿主机目录是数据互通的
[root@e379f3fa6a12 /]# ls /data/dockerStudy/dbdata/hw.txt
/data/dockerStudy/dbdata/hw.txt
[root@e379f3fa6a12 /]# cat /data/dockerStudy/dbdata/hw.txt
hello world
**注意:**如果删除了挂载的容器(包括 dbdata 和 biz_container ),数据卷并不会被自动删除。如果要
删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v 命令来指定同时删除关联的容器。
2.3 数据卷容器的作用(迁移数据)
2.3.1 备份
备份 dbdata 数据卷容器内的数据卷:
docker run -volumes-from dbdata -v $(pwd):/backup --name worker centos tar cvf /backup/backup.tar /dbdata
2.3.2 恢复
先创建一个带有数据卷的容器 bdata2:
docker run -v /dbdata --name dbdata2 centos /bin/bash
创建另一个新的容器,挂载 dbdata2 容器,并使用 untar 解压备份文件到所挂载的容器卷中:
docker run --volumes-from dbdata2 -v $(pwd):/backup biz_worker tar xvf /backup/backup.tar
3、小结
本篇主要说明了宿主机和容器的数据是通过挂载来实现互通的,可以挂载宿主机目录、Docker数据卷、基于内存的临时文件。通过 docker run -v xxx:xxx
即可实现。
PS:理论部分参考杨保华的《Docker技术入门与实战》,感兴趣的可以阅读之。