EchoDemo's Blogs

Docker数据管理

在Docker中,要想实现数据的持久化(所谓docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中。目前Docker提供了数据卷(Volumes)和挂载主机目录 (Bind mounts)的方式将数据从宿主机挂载到容器中。

数据卷(Volumes)

数据卷是Docker管理宿主机文件系统的一部分,它是最常用的docker数据持久化的方式。默认位于 /var/lib/docker/volumes 目录中,所有Container的数据在没有指定卷时都保存在了这个目录下边,所以Docker帮我们默认创建许多匿名(很长ID的名字)卷。数据卷具有如下特性:

(1)对数据卷的修改会立马生效。

(2)对数据卷的更新,不会影响镜像。

(3)数据卷默认会一直存在,即使容器被删除。

1、创建数据卷

这里是创建一个名为mynginx的容器,并加载一个数据卷到容器的/mynginx目录下,这个命令中可以使用“-v”或者“–mount”标记来将数据卷挂载到容器里。在一次 docker run中可以挂载多个数据卷。

// 创建一个自定义容器卷
docker volume create myvol

// 查看所有容器卷
docker volume ls

// 查看指定容器卷详情信息
docker volume inspect myvol

// 启动挂载数据卷的容器
docker run -d -it --name=mynginx -p 8800:80 -v myvol:/mynginx nginx /bin/bash

或者

docker run -d -it --name=mynginx -p 8800:80 --mount source=myvol,target=/mynginx nginx /bin/bash

(1)-v或者–volume:由3部分参数组成,使用“:”间隔。顺序不能颠倒。

(1)volumes的名字在宿主机上具有唯一性。匿名卷名字系统给出。

(2)挂载到容器里的文件或文件夹路径。

(3)可选项列表分隔符,例如“or”。

(2)–mount选项:由多个键值对组成,=。–mount要比-v或者–volume命令更长,但是更容易理解。常用的键值对有如下几个:

(1)type:可以是bind,volume或者tmpfs。type默认为volume。

(2)source:volumes的名字,匿名volume可以省略。source可缩写为src。

(3)destination:挂载到容器中的文件或目录路径。可也缩写为dst或者使用target。

(4)readonly:指定挂载在容器中为只读。

在主机里使用以下命令可以查看刚刚启动的 mynginx 容器的信息

docker inspect web

2、 清理数据卷

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用如下命令

docker rm -v mynginx

无主的数据卷可能会占据很多空间,要清理请使用以下命令

docker volume prune

挂载主机目录 (Bind mounts)

挂载主机目录可以存储在宿主机系统的任意位置,它是比较常用的docker数据持久化的方式。但是,当使用bind mounts时,宿主机的目录或文件被挂载到容器中。容器将按照挂载目录或文件的绝对路径来使用或修改宿主机的中的数据。因此bind mounts在不同的宿主机系统时不可移植的,这也是为什么bind mounts不能出现在Dockerfile中的原因。

另外,使用bind mounts的容器可以在容器内部的进程中对主机文件系统进行修改,包括创建,修改和删除重要的系统文件和目录,这个功能虽然很强大,但显然也会造成安全方面的影响。所以还是推荐数据卷(Volumes)管理方式。

1、挂载宿主机目录

下面的命令加载宿主机的/src/myvol目录到容器的/opt/mynginx目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 –mount 参数时如果本地目录不存在,Docker 会报错。

docker run -d -it --name=mynginx -p 8800:80 -v /src/mynginx:/opt/mynginx nginx /bin/bash

或者

docker run -d -it --name=mynginx -p 8800:80 --mount type=bind,source=/src/mynginx,target=/opt/mynginx nginx /bin/bash

Docker挂载宿主机目录的默认权限是读写,用户也可以通过增加readonly指定为只读。这样加了readonly之后,/src/mynginx就挂载为只读了。如果你在容器内/opt/mynginx目录新建文件,会显示“Read-only file system“错误。

docker run -d -it --name=mynginx -p 8800:80 --mount type=bind,source=/src/mynginx,target=/opt/mynginx,readonly nginx /bin/bash

除了可以挂载一个宿主机目录,还是可以挂载宿主机的某个文件,例如:

docker run --rm -it -v $HOME/.bash_history:/root/.bash_history nginx /bin/bash

或者

docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history nginx /bin/bash

这样就可以在容器中记录输入过的命令了。

🐶 您的支持将鼓励我继续创作 🐶
-------------本文结束感谢您的阅读-------------