DockerFile的volume
FROM centos:latest
RUN ***
VOLUME /data #声明容器中/data为匿名卷
docker run -v
docker run -v /host/data:/container/data centos
总结
dockfile如果不是数据库类的这种需要持久化数据到磁盘上的应用,都是无需指定volume的。指定volume只是为了避免用户忘记指定-v时导致的数据全部在容器中,这样的话容器一旦被删除所有的数据都丢失了。
这并不会在宿主机上创建一个实际的卷或目录。它只是在构建镜像时告诉Docker,当容器从这个镜像运行时,/data 目录应该被视为一个卷,可以被挂载或覆盖。
然后,在运行容器时,你可以使用-v或--mount选项来挂载宿主机上的目录或Docker管理的卷到这个位置。如果你没有指定挂载点,Docker将自动创建一个匿名卷来存储/data 目录的内容。
总之,Dockerfile中的VOLUME指令是可选的,并且主要用于指定容器运行时应该被视为卷的目录。而实际的卷挂载是在docker run命令中指定的。
docker的持久化
挂载卷 (volumes)
当你使用 -v 或 --volume 挂载 Docker 卷时,你可以指定一个卷的名称,或者让 Docker 自动为你创建一个匿名卷。
-
指定卷名称:如果你已经通过 docker volume create 创建了一个卷,并希望将其挂载到容器中,你可以这样做:docker run -v my-volume:/path/in/container my-image。这里 my-volume 是你预先创建的卷的名称。
-
自动创建匿名卷(用的多) :如果你没有预先创建卷,但希望在 docker run 时自动创建一个,你可以省略卷名称前的部分,只指定容器内的挂载路径:docker run -v /path/in/container my-image。Docker 会自动为你创建一个匿名卷,并将其挂载到指定的容器路径。
优势
- 独立于容器生命周期:Docker卷的存在与容器的生命周期无关,即使容器被删除,卷中的数据仍然保留。这为用户提供了持久化存储的能力。
- 易于备份和迁移:Docker卷可以轻松备份、迁移或共享,方便数据管理。
- 性能优势:Docker卷通常使用宿主机的文件系统来存储数据,因此其读写性能通常优于容器内的文件系统。
- 安全性较高:Docker卷由Docker管理,与宿主机的文件系统相对隔离,这有助于减少潜在的安全风险。
绑定挂载(Bind Mounts)
绑定挂载允许你将主机上的文件或目录直接挂载到容器中。使用 -v 或 --volume 时,你可以通过指定主机路径和容器路径来实现这一点,格式为 host-path:container-path。例如:
docker run -v /host/path:/path/in/container my-image
docker run -d -v /data/testdata:/data -p 8088:8080 docker-demo:latest
优势
- 灵活性高:绑定挂载允许用户选择宿主机上的任意路径进行挂载,这为用户提供了极大的灵活性,特别是在需要直接访问宿主机文件系统的场景中。
- 实时同步:绑定挂载的更改会实时反映在宿主机和容器之间,这对于需要实时同步数据的场景非常有用。
- 易于理解:绑定挂载的语法简单直观,易于理解和使用。
docker 持久化数据的迁移
直接迁移宿主机的文件到目标宿主机
迁移文件到宿主机后,使用绑定挂载的方式挂载到新容器里面,这种方式不会覆盖原文件,但最好还是先对迁移过来的文件做一个备份