Skip to content
On this page

docker006 volume 数据卷

数据卷就是在宿主中可以在容器之间进行共享和重用的一系列和文件和文件夹,通过docker run -v命令可以将数据卷挂载到对应的容器目录空间,进行文件读取,容器卷特性如下

  1. 数据卷在容器之间可以共享,容器间传递数据将变得高效方便。
  2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作。
  3. 在于数据持久化,它完全独立于容器的生命周期。
  4. docker不会在容器删除时删除其挂载的数据卷。(docker rm -v 删除)
  5. 数据卷的变化不会影响镜像的更新。
  6. 数据卷是在容器启动时初始化的,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新的初始化数据卷中去

注意权限: --privileged=true

centos7的selinux.....

通过docker volume创建

bash
## 方式1 推荐
docker run --privileged=true -v host_path:container_path:rw image_id 

## 方式2 不推荐
# 创建, 默认放在/var/lib/docker/volume/name/_data目录下
docker volume create <name>
# 查看
docker volume inspect <name>
docker volume ls
# 删除
docker volume rm <name>
# 使用
docker run -v volume_name:container_path image_id
bash
docker run -itd -p 8080:8080 \
-v /usr/develop/index.html:/usr/local/tomcat/webapps/docs/index.html:ro  `# 挂载index.html文件到/docs/index.html并覆盖` \
-v /usr/develop/self:/usr/local/tomcat/webapps/docs/  `# 挂载self文件夹到webapps文件夹下`  \
--name tomcat_1 tomcat

数据卷容器

接数据卷,已经存在一个挂载了数据卷的容器;由于数据卷在容器之前是可以共享的,所以此时如果存在其他容器通过docker run --volumes-from [容器别名]命令挂载到该容器上,则该容器可以被称之为数据卷容器,其主要功能是提供数据卷供其他容器挂载。当数据卷容器宕机后,并不会造成数据卷的回收卸载,数据卷会继续挂载在其他容器中。当全部挂载该数据卷的容器全部宕机后,该数据卷才会卸载

bash
docker run -itd -p 9090:8080 --volumes-from tomcat_1 --name tomcat_2 tomcat
# --volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态.

数据卷的继承

bash
--volumes-from container_id

利用数据卷备份和迁移数据

  1. 备份
bash
docker run --volumes-from dbdata -v $(pwd):/backup:wr --name worker ubuntu tar cvf /backup/dbdata.tar /dbdata
#挂载宿主机当前目录,容器中的目录是/backup,权限是读写权限,运行ubuntu系统,压缩之后的路径是/backup/dbdata.tar,/dbdata是需要压缩备份的目录
#将一个包含数据卷的容器中的数据,通过一个容器执行一个压缩命令,从而将数据备份出来。
  1. 恢复
bash
# 创建一个带有数据卷的容器
docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
#然后创建一个新的容器,挂载dbdata2的容器,冰使用untar解压备份文件到锁挂载的容器卷中:
#docker run --volumes-from [container name] -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar [container data volume]
docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar

更改存储位置

bash
mkdir /etc/systemd/system/docker.service.d/
cat > /etc/systemd/system/docker.service.d/docker.conf <<EOF
[Service] 
ExecStart= 
ExecStart=/usr/bin/dockerd --graph="/data/docker" --storage-driver=devicemapper
EOF

sudo docker info | grep "Docker Root Dir"
#sudo apt-get remove docker docker-engine docker-ce docker.io
mkdir /data/docker
mkdir /etc/systemd/system/docker.service.d/
cat > /etc/systemd/system/docker.service.d/docker.conf <<EOF
[Service] 
ExecStart= 
ExecStart=/usr/bin/dockerd --graph="/data/docker" 
EOF

sudo systemctl daemon-reload 

sudo systemctl start docker
sudo docker info | grep "Docker Root Dir"

Last updated:

Released under the MIT License.