类比挂载磁盘

我们可以把volume看做挂载磁盘,将宿主机的一个目录挂载到容器内的某个目录,那么实际的文件是存储在宿主机的目录的,容器内只是一个挂载目录,并不存储实际文件。

用处

容器的存储和网络都是和宿主机隔离的,Volume给了从宿主机访问容器内目录的方法。Volume经常用于持久化容器的数据,比如数据库;暴露配置文件,在宿主机方便的修改容器内的文件。

持久化数据

对于一个数据库的容器,我们得保证当容器宕了以后数据不会丢失,我们可以利用volume将容器内的数据目录映射到宿主机的目录。上面提到,由于实际的文件存储在宿主机,容器内是挂载目录,所以容器销毁,在宿主机的数据目录并不会受到影响。

比如postgresql数据库:

docker run -d \
    -p 5432:5432 \
    -v ~/postgresql-data:/var/lib/postgresql/data
    image_address

-v参数便是volume的设置,也可以使用--volume,其值是冒号分割的两个目录,左边是宿主机设置存储数据的目录,右边是docker容器内部的数据目录。这样设置之后,即使容器由于某种原因挂掉,使用相同配置重新启动,容器便会利用宿主机的volume目录恢复挂掉之前的状态。这里需要注意一点,宿主机的目录在两种情况下,容器才会启动成功: 空目录或者与容器内部待映射目录结构完全一致,否则启动不成功,空目录要注意.开头的隐藏文件也不能存在。

暴露配置文件

例如,nginx是以容器的方式启动,我们添加应用后,要修改nginx的配置,那么一般的做法是首先进入容器: docker exec -it nginx sh,修改/etc/nginx/nginx.conf或者其它的配置文件。修改完成后,重启即可生效,docker restart nginx