docker存储管理

使用的docker环境的存储管理

Posted by yan on March 18, 2019

Docker volume形态

  1. volume介绍
      Docker 采用 AFUS 分层文件系统时,文件系统的改动都是发生在最上面的容器层,在容器的生命周期内,它是持续的,包括容器在被停止后。但是,当容器被删除后,该数据层也随之被删除了。因此,Docker 采用 volume (卷)的形式来向容器提供持久化存储.Docker volume 有如下几种形态:
    1.1 默认,即无Docker volume
      默认情况下,容器不使用任何 volume,此时,容器的数据被保存在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除。当然,也可以使用 docker commit 命令将它持久化为一个新的镜像。
    1.2 Data volume (数据卷)
      一个 data volume 是容器中绕过 Union 文件系统的一个特定的目录。它被设计用来保存数据,而不管容器的生命周期。因此,当你删除一个容器时,Docker 肯定不会自动地删除一个volume。
    (1)使用 “-v 容器内目录” 形式
      docker run -d -P --name web -v /webapp training/webapp python app.py
    使用 docker inspect 命令可以看出,Docker 将本地一个 _data 目录 mount 为容器内的 webapp 目录了:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    "Mounts": [
             {
                 "Name": "f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b",
                 "Source": "/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data",
                 "Destination": "/webapp",
                 "Driver": "local",
                 "Mode": "",
                 "RW": true,
                 "Propagation": ""
             }
         ],  
    

    其实,在 web 容器被删除后,/var/lib/docker/volumes/f143b7f379fb6d012a08656fc950bf6df4bf5a5b90c72f310644aa997620122b/_data目录及其中的内容都还会保留下来,但是,新启动的容器无法再使用这个目录,也就是说,已有的数据不能自动地被重复使用了。
    (2)使用 -v 来挂载一个主机上的目录到容器的目录
      docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py
    主机上的目录可以是一个本地目录,也可以在一个 NFS share 内,或者在一个已经格式化好了的块设备上。其实这种形式和第一种没有本质的区别,容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标。
    (3)使用 -v 来挂载主机上的一个文件到容器内的一个文件
      docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
    1.3 data container(数据卷容器)
      如果要在容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。
    创建一个 data container:
      docker create -v /dbdata --name dbstore training/webapp /bin/true
    启动一个 app container:
      docker run -d -P --name web3 --volumes-from dbstore training/webapp python app.py
    其实,对 web3 这个容器来说,volume 的本质没变,它只是将 dbstore 容器的 /dbdata 目录映射的主机上的目录映射到自身的 /dbdata 目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    "Mounts": [
             {
                 "Name": "5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330",
                 "Source": "/var/lib/docker/volumes/5341c03f3b94f13f4c86d88ccb0f3b63487adf30dea7ae6b2d06e947235e7330/_data",
                 "Destination": "/dbdata",
                 "Driver": "local",
                 "Mode": "",
                 "RW": true,
                 "Propagation": ""
             }
         ],