1.7 Docker 数据管理

2018-05-17

1.7 Docker 数据管理

 一个容器启动之后,其所有的磁盘空间其实是很小的,可以进入容器 df -h 看一下,实际上用的肯定是宿主机的空间。按照之前的方式在容器中写入的数据,只有在把容器导出为镜像时才会保留下来,否则容器一关闭,这些数据就没了。在这里,我们可以把宿主机的目录挂载到容器中去,这样在容器中写数据就保持在宿主机里了。

 挂载本地的目录到容器里

docker run -itd -v /data/:/data1 images bash

 -v 用来指定挂载目录, :前面的/data/为本地目录,后面的/data1/为容器里的目录

root@ubuntu:~# docker run -itd -v /data/:/data1 ubuntu:v1 bash

5d82921e2b143f77c16a6b8b49856b90e0784c3a38f568a3d1828f9e5f17efa9

root@ubuntu:~# touch /data/1.txt

root@ubuntu:~# echo "lsdfsjflks" > /data/1.txt

root@ubuntu:~# docker exec -it 5d8 bash

root@5d82921e2b14:/# df -h

Filesystem      Size  Used Avail Use% Mounted on

none             40G  4.0G   34G  11% /

tmpfs           497M     0  497M   0% /dev

shm              64M     0   64M   0% /dev/shm

/dev/vda1        40G  4.0G   34G  11% /data1

root@5d82921e2b14:/# ls /data1

1.txt

root@5d82921e2b14:/# cat /data1/1.txt

lsdfsjflks

root@5d82921e2b14:/# touch /data1/2.txt

root@5d82921e2b14:/# exit

exit

root@ubuntu:~# ls /data

1.txt  2.txt

 挂载数据卷

 我们在挂载目录的时候,可以指定容器 name,如果不指定就随机定义了。比如上面我们没有指定,它就生成了一个名字为 silly_heisenberg,这个名字可以使用命令 docker ps 查看最右侧一列。

docker run -itd - -volumes-from silly_heisenberg ubuntu:v2 bash

 这样,我们使用 ubuntu:v2 镜像创建了新的容器,并且使用了 silly_heisenberg 容器的数据卷。

root@ubuntu:~# docker run -itd --volumes-from silly_heisenberg ubuntu:v2 bash

c9e39105e6089275aed55ce267bbfe7ca997649fe7eefb5417ff03baafa6458d

root@ubuntu:~# docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES

c9e39105e608        ubuntu:v2           "bash"              6 seconds ago       Up 5 seconds                                 boring_brattain

0a5de5704b76        registry:latest     "docker-registry"   3 hours ago         Up 2 hours          0.0.0.0:5000->5000/tcp   dreamy_hodgkin

root@ubuntu:~# docker exec -it c9e bash

root@c9e39105e608:/# ls /data1

1.txt  2.txt

 定义数据卷容器

 有时候,我们需要多个容器之间相互共享数据,类似于 Linux 里的 NFS,所以就可以搭建一个专门的数据卷容器,然后其他容器直接挂载该数据卷。

 首先建立数据卷容器

root@ubuntu:~# docker run -itd -v /data/ --name ubuntu_testvol ubuntu:v1 bash

c75c06d5ec06f18525804290c356dec5320dff4f25943f3c1f66b23e6aaee300

root@ubuntu:~# docker exec -it c75 bash

root@c75c06d5ec06:/# df -h

Filesystem      Size  Used Avail Use% Mounted on

none             40G  4.0G   34G  11% /

tmpfs           497M     0  497M   0% /dev

shm              64M     0   64M   0% /dev/shm

/dev/vda1        40G  4.0G   34G  11% /data

root@c75c06d5ec06:/# ls /data/

root@c75c06d5ec06:/#

 这里的/data/目录就是容器里的目录,和宿主机的/data 没有关系。

 再创建一个容器,使之挂载

root@ubuntu:~# docker run -itd --volumes-from ubuntu_testvol ubuntu:v1 bash

19d85fe21840aee49cc4433f59c0c6771b6f293712eacfb3de8167ea098466f5

root@ubuntu:~# docker exec -it 19d bash

root@19d85fe21840:/# df -h

Filesystem      Size  Used Avail Use% Mounted on

none             40G  4.0G   34G  11% /

tmpfs           497M     0  497M   0% /dev

shm              64M     0   64M   0% /dev/shm

/dev/vda1        40G  4.0G   34G  11% /data

root@19d85fe21840:/# ls /data

root@19d85fe21840:/#

root@19d85fe21840:/# mkdir /data/test

root@19d85fe21840:/# touch /data/test/1.txt

root@19d85fe21840:/# exit

exit

root@ubuntu:~# docker exec -it ubuntu_testvol bash

root@c75c06d5ec06:/# tree /data

/data

`-- test

    `-- 1.txt



1 directory, 1 file


 数据卷的备份与恢复

 备份

 本地新建目录

root@ubuntu:~# mkdir /vol_data_backup

 首先我们需要使用 testvol 数据卷新开一个容器,同时还需要把本地的 /vol_data_backup/目录挂载到该容器的/backup/下,这样在容器中/backup/目录里面新建的文件可以在/vol_data_backup/目录中看到了。然后再把/data/目录下面的文件打包成 data.tar 文件放到/backup/目录下面。

# docker run -it —volumes-from ubuntu_testvol -v /vol_data_backup/:/backup ubuntu:v1 bash

# tar cvf /backup/data.tar  /data/

 恢复

 先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把 tar 包解压。

# docker run -itd -v /data/ —name ubuntu_testvol2 ubuntu:v1 bash

# docker run -it —volumes-from ubuntu_testvol2 -v /vol_data_backup/:/backup ubuntu:v1 bash

# mv /backup/data.tar  /

# tar xvf data.tar

标题:1.7 Docker 数据管理
作者:散宜生
地址:https://17kblog.com/articles/2018/05/17/1526556193832.html