Data volumes可以视为容器中的一种特殊的文件路径,用以保存与容器实例生命周期无关的共享数据。

1. Data volumes的特性

  • 在容器创建的时候初始化
  • 作为文件系统的一部分,但是不受Union File System的管理;
  • 便于持久化存储数据和共享数据
  • Data volumes的数据是持久化的,删除容器不影响Data volumes的数据
  • 对Data volumes的操作立刻直接生效
  • 可以在多个容器之间共享

 

2. 根据Data volumes定义的方式不同,可以分为如下3种:

 

  • Dockerfile中定义的固定Data volumes
  • docker run -v定义的临时Data volumes
  • docker run --volumes-from定义的公共共享Data volumes

 

3. Data volumes的用法
 

1) 在Dockerfile中,使用VOLUME语句直接将Data volumes添加到镜像中

 

VOLUME /path/in/container
VOLUME ["/etc/gitlab", "/var/opt/gitlab", "/var/log/gitlab"]

可以在一个VOLUME语句中声明多个Data volumes。

 

 

2) 在容器启动时,通过-v /path/to/volume参数为容器指定一个或多个Data volumes

  • 为已有的容器添加一个Data volume

docker run -d --name web -v /webapp training/webapp python app.py
docker run -d --name web -v /src/webapp:/webapp training/webapp python app.py
docker run -d --name web -v ~/src/webapp:/webapp training/webapp python app.py
docker run -v c:\<path>:c:\<container path>

  • 为已有的容器添加多个Data volumes

docker run -d --name web -v /webapp1 -v /webapp2 training/webapp python app.py

  • 为已有的容器添加一个只读的volume

docker run -d --name web -v /src/webapp:/webapp:ro training/webapp python app.py

  • 为已有的容器添加一个高效读取的volume

docker run -d --name web -v /src/webapp:/webapp:cached training/webapp python app.py

  • 将一个文件作为data volume,可以在容器和宿主之间共享数据,特别适合日志文件

docker run --rm -it -v ~/.bash_history:/root/.bash_history ubuntu /bin/bash
 

3) 在容器启动时,通过--volumes-from=a_data_volume_container参数为容器指定一个或多个Data volumes

创建数据容器(供其他应用容器引用):

docker create -v /dbdata --name dbstorecontainer 

在启动应用容器时,直接引用数据容器:

docker run -d --volumes-from dbstorecontainer --name app1container ubuntu

在启动应用容器时,间接引用数据容器:

docker run -d --name app3container --volumes-from app1container ubuntu

4. 查看当前系统中定义的Data volumes

  • docker volume ls
  • docker volume inspect

查看一个容器中的Data volume

执行命令docker inspect mycontainer

        ...
        "Mounts": [
            {
                "Source": "/mnt/ba",
                "Destination": "/opt/server/tem1",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
        ...

5. 删除一个容器中的Data volumes

 

如果在启动容器的时候使用--rm选项,则在容器退出时自动删除容器中的匿名Data volumes。

docker run --rm -v /myvolume --volumes-from mydatacontainer myappcontainer

此外,还可以通过如下方式删除Data volumes:

  • docker rm -v mycontainer
  • docker volume rm -f myvolume1 myvolume2

删除所有未用的Data volumes

  • docker volume prune
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐