简介
docker 提供数据卷来实现数据共享与持久化,而数据卷的挂载有两种方式:
- 挂载主机目录(Bind mounts)
- 挂载主机目录(Bind mounts)
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
- 数据卷可以在容器之间共享和重用
- 数据卷是目录或者文件,而非没有格式化的磁盘(块设备)
- 对数据卷的修改会立马生效
- 对数据卷的更新不会影响镜像
- 卷会一直存在,只到没有容器使用
挂载主机目录
删除所有容器
docker ps -aq|xargs docker rm -f
创建一个数据卷
docker run -it --name web -v /webapp centos:7.4 /bin/bash
选项说明:
-d : 将容器放入后台运行
-p : 将容器中的端口暴露到宿主机的一个随机端口
-v : 创建一个数据卷,这个数据卷会自动映射到宿主机的某个目录,一般在/var/lib/docker/volumes下
在上面命令中-v,选项后边的目录是容器中的目录,此目录无需提前创建,这个-v的意思就是将本地的/var/lib/docker/volumes下的每个目录挂载到容器的/webapp。即便容器删除,/var/lib/docker/volimes下的数据也不会丢失。
挂载一个宿主机目录作为数据卷
docker run -it --name web1 -v /data:/webapp centos:7.4
#j将宿主机的/data目录挂载至容器的/webdata目录
数据卷容器
创建一个数据卷容器
docker run -it -v /dbdata --name dbdata centos:7.4
#创建一个数据卷容器dbdata。并创建一个数据卷挂载至/dbdata
其他容器可以通过--volumes-from 来挂载dbdata容器中的数据卷:
docker run -it --volumes-from dbdata --name db1 centos:7.4
docker run -it --volumes-from dbdata --name db2 centos:7.4
容器db1和db2的挂载同一个数据卷到/dbdata目录,三个容器任何一方在该目录的写入其他容器都能看到
--volumes-from参数可以多次使用,从多个容器挂载多个数据卷
如果删除了挂载的容器,数据卷并不会被自动删除,如果要删除一个数据卷,必须在删最后一个还挂载着它的容器时显示的使用docker rm -v 命令来指定同时删除关联的容器。
利用数据卷容器迁移数据
备份数据
#先创建一个容器worker,并使用--volumes-from将dbdata挂载到worker容器,然后使用-v参数将容器的/backup目录映射到宿主机的backup目录。然后在容器中执行备份操作,这样就把数据备份到宿主机的/backup目录中了
docker run -it --volumes-from dbdata -v /backup:/backup --name worker centos:7.4
exit
ll /backup/backup.tar.gz
还原数据
#创建一个新容器,并用-v 参数挂载到本地的备份目录,然后执行解压操作,将备份文件解压到/dbdata目录
docker run -it -v /dbdata --name dbdata2 centos:7.4 /bin/bash
exit
#c创建一个容器dbdata2
docker run -it --volumes-from dbdata2 -v /backup:/backup centos:6 tar xf /backup/backup.tar.gz
删除数据盘
查看主机上现有的数据盘
docker volume ls
默认情况下,在删除容器时,docker并不会删除其数据盘,查看没有容器在使用的数据盘方法如下:
docker volumes ls 0f dangling=true
#如果想要删除没有使用的数据盘,使用如下指令:
docker volume rm VOLUME_NAME
#删除容器时,同时删掉数据盘,则使用
docker rm -v container_name
挂载主机目录
把本地的一个目录挂载到容器,修改本地的目录就可以达到修改容器的目的
创建一个挂载的容器
docker run -d -p 80:80 -v /data:/usr/local/apache2/htdocs httpd:2.4
#查看容器
docker ps -a
访问http
在物理机写入数据
echo "Hello Dokcer" >> /data/index.html
#在物理机目录中修改网页后再次查看容器的网页
查看
进入容器
docker exec -it <容器名称或容器ID>
cd /usr/local/apache2/htdocs/
ls -l
cat index.html
exit
删除容器测试
docker rm -rf <容器名称或容器ID>‘
docker run -d -p 80:80 -v /data:/usr/local/apache2/htdocs httpd:2.4
#进入容器查看
docker exec -it <容器名称或容器ID>
cd /usr/local/apache2/htdocs/
ls -l
cat index.html
exit
访问网页测试
测试再次创建的容器数据还在
docker挂载数据卷的默认为读写(rw),用户也可以通过ro指定为只读