Docker之数据管理

Linux上一切皆为文件,程序代码、网络套接字、数据库的底层存储等等。在容器上也会面临数据管理的问题,主要是通过数据卷和数据卷容器来管理。

1、数据卷

何为数据卷?
是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于 Linux 中的 mount的 行为。

1.1 创建数据卷

docker colume COMMAND

命令说明
create创建数据卷
inspect查看数据卷的详细信息
ls列出数据卷
prune删除所有未使用的数据卷
rm删除一个或多个数据卷

docker colume create [OPTIONS] [VOLUME]
OPTIONS为:

选项说明
-dstring,指定数据卷的驱动名称,默认为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技术入门与实战》,感兴趣的可以阅读之。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值