Docker 容器中管理数据主要有两种方式:
- 数据卷(Data volumes)
- 数据卷容器(Data volumes containers
数据卷是一个可供一个或者多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 对数据卷的修改会立马生效
- 对数据卷的更新,不会影响镜像
- 数据卷默认会一直存在,即时容器被删除
[root@server ~]# docker volume create myvolume #创建一个数据卷 myvolume [root@server ~]# docker volume inspect myvolume #查看数据卷的信息 [root@server ~]# docker run -d -it --name myCentos --mount src=myvolume,dst=/data centos #创建一个myCentos容器,并将myvolume数据卷挂载到myCentos容器的/data目录 [root@server ~]# docker exec -it myCentos /bin/bash #进入容器 [root@8f3094a730af /]# echo “hello” > /data/test.txt #查看文件 [root@server ~]# cd /var/lib/docker/volumes/myvolume/_data #在另外一个终端进入到数据目录里面 [root@server ~]# more test.txt
此时开启另外一个终端再次创建一个容器,并且挂载同样的数据卷,可以发现这种方式可以在容器之间共享和重用 [root@server ~]# docker run -d -it --name myCentos01 --mount src=myvolume,dst=/data centos #新开一个终端创建新的一个容器,挂载同样的数据卷 [root@server ~]# docker exec -it myCentos01 /bin/bash [root@45c3ca27ddad /]# ls /data/
使用 -v 参数也可以指定挂载一个本地主机的目录到容器中
[root@server ~]# docker run -d -ti --name web -v /webapp:/opt/webapp centos #创建一个名字叫web的容器,并且将宿主机的/webapp目录 挂载到容器的/opt/webapp目录 [root@server ~]# ls /webapp/ #查看宿主机的目录,如果没有该目录,会自动创建 [root@server ~]# echo "hello" >> /webapp/index.html #追加一个文件进去 [root@server ~]# docker exec -ti web /bin/bash #进入容器 [root@16c66fe42017 /]# cat /opt/webapp/index.html #查看容器/opt/webapp目录下的数据
数据卷容器
如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。
[root@server ~]# docker run -d -v /dbdata --name dbdata centos #创建一个数据卷容器 [root@server ~]# docker run -d -it --volumes-from dbdata --name db1 centos #创建一个db1容器, 使用 --volumes-from 来挂载 dbdata 容器中的数据卷 [root@server ~]# docker exec -it db1 /bin/bash #进入db1容器中 [root@1863842f0c16 /]# ls #查看已成功挂载dbdata数据卷 anaconda-post.log dbdata etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@1863842f0c16 /]# touch dbdata/file1 #在dbdata目录中创建一个文件 [root@server ~]# docker run -d -it --volumes-from dbdata --name db2 centos #再创建一个db2容器,使用 --volumes-from 来挂载 dbdata 容器中的数据卷 [root@server ~]# docker exec -it db2 /bin/bash #进入db2容器中 [root@0fca0699a7c7 /]# ls #查看也成功挂载dbdata数据卷 anaconda-post.log dbdata etc lib media opt root sbin sys usr bin dev home lib64 mnt proc run srv tmp var [root@0fca0699a7c7 /]# ls dbdata/ #并且还查看到了db1容器创建的file1文件,说明容器之间的数据共享了 file1 另外还可以级联创建 [root@server ~]# docker run -d -ti --name db3 --volumes-from db1 centos #创建一个db3容器,通过 --volumes-from 级联挂载上面的db1容器 级联删除:
注意:如果删除了挂载的容器(包括dbdata、db1和db2),数据卷也不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。