Docker存储(二)卷的使用

创建和管理volumes

  • 创建卷
    docker volume create my-vol
    
  • 列出卷
    docker volume ls
    
  • 查看卷详情
    docker volume inspect my-vol
    
  • 删除卷
    docker volume rm my-vol
    

启动容器时使用卷

启动容器时,使用的卷没有创建,docker会自动创建卷

  • 启动容器时,–mount或-v
     docker run -d \
     --name devtest \
     --mount source=myvol2,target=/app \
     nginx:latest
    
  • 使用-v的方式(需要先删除刚才的devtest容器和myvol2卷)
    docker run -d \
    --name devtest \
    -v myvol2:/app \
    nginx:latest
    
  • 只读的方式挂载卷
    docker run -d \
    --name=nginxtest \
    --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
    nginx:latest
    
  • 使用-v,只读的方式挂载卷(需要先删除刚才的nginxtest容器和nginx-vol卷)
    docker run -d \
    --name=nginxtest \
    -v nginx-vol:/usr/share/nginx/html:ro \
    nginx:latest
    
  • 清除刚才创建的卷和容器
    docker container stop devtest
    docker container rm devtest
    docker volume rm myvol2
    

启动Service的时候使用卷

  • 创建service

    docker service create -d \
    --replicas=4 \
    --name devtest-service \
    --mount source=myvol2,target=/app \
    nginx:latest
    

    该命令创建4个container,使用默认的local driver时,都会使用本地的myvol2,无法共享卷数据。

  • 删除刚才的service

    docker service rm devtest-service
    

在不同机器间共享卷(通过其它的卷驱动器)

  • 安装驱动插件
    docker plugin install --grant-all-permissions vieux/sshfs
    
  • 创建卷
    docker volume create --driver vieux/sshfs \
    -o sshcmd=test@node2:/home/test \
    -o password=testpassword \
    sshvolume
    
  • 启动容器时挂载(没有的话,会自动创建)卷
    docker run -d \
    --name sshfs-container \
    --volume-driver vieux/sshfs \
    --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
    nginx:latest
    

备份卷

  • 创建容器dbstore,创建匿名卷,挂载到/dbdata
    docker run -v /dbdata --name dbstore ubuntu /bin/bash
    
  • 用一个临时容器,备份dbstore容器的目录/dbdata的内容到本地目录$(pwd):/backup下
    docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
    

恢复备份的卷

  • 创建容器dbstore2
    docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
    
  • 将备份目录下的文件($(pwd):/backup),恢复到dbstore2容器中
    docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
    

清除卷

  • 容器终止时自动删除匿名卷(容器终止时,会删除/foo 但不会删除awesome:/bar)
    docker run --rm -v /foo -v awesome:/bar busybox top
    
  • 删除所有没有被使用的卷
    docker volume prune