容器和层

容器和镜像之间的主要区别是顶部的可写层。所有对容器添加新的或修改现有数据的内容都存储在该可写层中。当容器被删除时,可写层也被删除。底层镜像保持不变。

同一个镜像可以被创建多个同时运行的容器,相当于最上层的可写层不同而已,Docker版“披上羊皮的狼”。

容器数据储存

默认情况下,在容器内创建的所有文件都存储在可写层中。这意味着:

  • 当该容器不再运行时,数据不会持久存在,如果另一个进程需要,则可能很难从容器中获取数据。

  • 容器的可写层紧密耦合到运行容器的主机。无法轻松地将数据移动到其他位置。

Docker有两个容器选项可以在主机中存储文件,因此即使在容器停止之后文件仍然存在:数据卷挂载目录。如果你在Linux上运行Docker,你也可以使用tmpfs mount

下面是用法:

-v或者--volume标志在单独容器中使用,--mount标志用于群集服务容器

-v或–volume:由三个字段组成,用冒号字符(:)分隔。字段必须按正确的顺序排列,并且每个字段的含义不是很明显。

  • 对于命名卷,第一个字段是卷的名称,并且在给定主机上是唯一的。对于匿名卷,省略第一个字段。

  • 第二个字段是文件或目录在容器中安装的路径。

  • 第三个字段是可选的,是逗号分隔的选项列表,例如ro。这些选项将在下面讨论。

–mount:由多个键值对组成,以逗号分隔,每个键=组由一个元组组成。该–mount语法比更详细的-v或–volume,但按键的顺序并不显著,并且标志的价值更容易理解。

  • 该type安装件,其可以是bind,volume,或tmpfs。本主题讨论卷,因此类型始终是volume。

  • 该source安装的。对于命名卷,这是卷的名称。对于匿名卷,省略此字段。可以指定为source或src。

  • 将destination文件或目录安装在容器中的路径作为其值。可以指定为destination,dst或target。

  • 该readonly选项(如果存在)导致绑定装入以只读方式装入容器中。

  • 该volume-opt选项可以多次指定,它采用由选项名称及其值组成的键值对。

使用数据卷

数据卷是保存Docker容器生成和使用的数据的首选机制。数据卷完全由Docker管理。有几个优点:

与挂载目录相比,卷更易于备份或迁移。

可以使用Docker CLI命令或Docker API管理数据卷

卷适用于Linux和Windows容器。可以在多个容器之间更安全地共享卷。

卷驱动程序允许在远程主机或云提供程序上存储卷,加密卷的内容或添加其他功能。

新卷可以通过容器预先填充其内容。

卷不会增加使用它的容器的大小,并且卷的内容存在于给定容器的生命周期之外

docker run-d-P–name nginx-v【重点my-vol重点】:/webapp nginx

docker run-d-P–name nginx–mount source=my-vol,target=/webapp nginx

①如果本地数据卷或者本地目录尚未创建,-v命令则会自动创建(此时创建的是匿名数据卷),–mount则会报错

匿名数据卷:没有指定名称标识的数据卷,docker随机生成不重复的标识,依赖于一个容器,如果该容器消亡,则因为数据卷标识无法知道,所以无法复用。

②如果是容器里的目录不存在,两者都会自动创建

创建数据卷

docker volume create my-vol

数据卷列表

docker volume ls

查看数据卷具体信息

docker volume inspect my-vol

删除数据卷

docker volume rm my-vol

清除无主的数据卷

docker volume prune

备份数据卷

当您需要备份,还原或将数据从一个Docker主机迁移到另一个Docker主机时,卷是更好的选择。您可以使用卷停止容器,然后备份卷的目录(例如/var/lib/docker/volumes/)。

使用挂载目录

将主机上的目录或者文件(绝对路径)挂载到容器指定的路径中(绝对路径),也是比较快捷高效的做法,但是数据卷拥有更好的优点,如果你在开发新的应用,请尝试使用数据卷。

docker run-d-p 8082:8080–name tomcat-mount-v/usr/local/kun/aa:/usr/local/tomcat/webapps/aa tomcat

docker run-d-p 8082:8080–name tomcat-mount–mount type=bind,src=/usr/local/kun/aa,target=/usr/local/tomcat/webapps/aa tomcat