1.7 Docker 数据管理
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