了解和管理Docker容器卷

2020年12月31日19:41:45 发表评论 68 次浏览

了解Docker如何处理容器存储卷, 如何从命令行和Dockerfile通过卷启动容器, 以及如何在容器之间共享卷。

要求

  • Docker已安装并正在运行。
  • 对Docker功能和命令有基本的了解

Docker文件系统

为了了解Docker卷, 首先了解Docker文件系统如何工作很重要。

Docker映像是只读层的集合。当你从映像启动容器时, Docker在该只读层堆栈的顶部添加一个读写层。 Docker将此称为联合文件系统。

每次更改文件时, Docker都会将文件从只读层复制到顶层读写层。这将使原始(只读)文件保持不变。

删除容器后, 该顶层读写层将丢失。这意味着容器启动后所做的任何更改现在都消失了。

卷如何提供帮助

卷允许数据持久化, 即使删除容器也是如此。卷也是在主机和容器之间共享数据的便捷方式。

如果要执行以下操作, 挂载卷是一个很好的解决方案:

  • 将数据推送到容器。
  • 从容器中提取数据。
  • 在容器之间共享数据。

Docker卷存在于只读和读写层的联合文件系统之外。该卷是在容器和主机之间共享的文件夹。卷也可以在容器之间共享。

Docker卷的基础

Docker卷"驻留"在主机外部的容器外部。

从容器中, 该卷就像一个文件夹, 可用于存储和检索数据。它只是主机上目录的安装点。

有多种创建和管理Docker卷的方法。每种方法都有其自身的优点和缺点。

使用Docker的"批量创建"命令

  • 优点快速简便。

  • 坏处主机上的卷是由Docker自动创建的, 可能很难找到和使用。

从2015年1月1日发行的1.9.0版开始, 现在可以使用码头工人卷命令。

创建和命名卷

的码头工人卷创建命令将创建一个命名卷。该名称使你可以轻松地找到Docker卷并将其分配给容器。

要创建卷, 请使用以下命令:

sudo docker volume create --name [volume name]

例如, 创建一个名为数据量命令是:

sudo docker volume create --name data-volume

启动具有卷的容器

要启动将使用你创建的卷的容器码头工人卷创建, 将以下参数添加到泊坞窗运行命令:

-v [volume name]:[container directory]

例如, 要从中心图片命名我的容量测试并绘制音量数据量到容器的/数据目录, 命令为:

sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash

列出卷

要列出系统上的所有Docker卷, 请使用以下命令:

sudo docker volume ls

这将返回在主机上创建的所有Docker卷的列表。

检查体积

要检查命名卷, 请使用以下命令:

sudo docker volume inspect [volume name]

这将返回有关卷的信息, 包括其在主机系统上的安装点("驻留"的目录)。

例如, 要获取有关的更多信息数据量我们在上面创建的命令是:

sudo docker volume inspect data-volume

删除卷

要删除命名卷, 请使用以下命令:

sudo docker volume rm [volume name]

注意:如果现有容器正在使用该卷, 则将无法删除该卷。在删除卷之前, 你需要使用以下命令停止并删除容器:

sudo docker stop [container name or ID]
sudo docker rm [container name or ID]

例如, 删除数据量卷, 首先我们需要停止并删除我的容量测试使用它的容器:

sudo docker stop my-volume-test
sudo docker rm my-volume-test

的数据量然后可以使用以下方式删除该卷:

sudo docker volume rm data-volume

创建Docker卷并指定主机目录

  • 优点:允许你将特定的主机文件夹映射到容器。

  • 缺点:不能像码头工人卷创建。无法使用Dockerfile自动化。

如果要将主机上的特定目录作为Docker卷挂载在主机上, 请在你的主机上添加以下参数泊坞窗运行命令:

-v [host directory]:[container directory]

例如, 要启动新容器并映射/ webfiles从主机文件夹进入/ var / www / html容器中的文件夹, 命令为:

sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash

你可以通过以下命令首先创建一个目录以用作Docker卷来进行测试:

sudo mkdir /hostvolume

使用以下命令将一个小的测试文件添加到该目录:

sudo echo "Hello World" >> /hostvolume/host-hello.txt

接下来, 启动一个名为我的目录测试和地图/主机卷在主机上/容器体积使用以下命令在容器上:

sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash

在新容器的命令提示符下, 使用以下命令列出共享卷中的文件:

ls /containervolume

你会看到host-hello.txt我们在主机上创建的文件。

这也适用于相反的方向。你放入此目录的文件将显示在主机上。你可以通过以下命令从容器中进行测试:将另一个文件添加到共享卷中:

echo "Hello from the container." >> /containervolume/container-hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。到达那里后, 使用以下命令列出共享卷中的文件:

sudo ls /hostvolume

你将看到我们从主机和容器创建的两个测试文件。

使用Dockerfile创建Docker卷

  • 优点:允许你自动执行该过程。
  • 坏处:不能像码头工人卷创建。无法在主机上指定目录。

在Dockerfile中使用以下命令在容器中创建共享存储卷:

VOLUME [volume path]

例如, 创建一个卷/ myvolume在要从Dockerfile启动的容器中, 命令为:

VOLUME /myvolume

要对此进行测试, 请先创建一个名为Docker文件使用命令:

sudo nano Dockerfile

将以下内容放入此文件:

# The source image to start with
FROM centos

# Create a volume
VOLUME /dockerfilevolume

保存并退出文件。

接下来, 建立一个名为dockerfile-volumetest使用以下命令从此Dockerfile中获取:

sudo docker build -t dockerfile-volumetest .

然后启动一个容器命名为my-dockerfile-test从该图像使用命令:

sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash

在新容器的命令提示符下, 使用以下命令在共享卷中创建一个小的测试文件:

echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。

接下来, 让我们找到挂载点。为此, 请使用以下命令:

sudo docker inspect my-dockerfile-test

滚动浏览输出, 直到找到标题为"山"看起来像这样:

找到docker挂载点
  • 资源是主机上的目录。
  • 目的地是容器上的文件夹。

检查主机上的源目录。在此示例中, 命令是:

sudo ls  /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test

在这里你将找到dockerfile-container-hello.txt你在容器上创建的文件。

在容器之间共享卷

在许多情况下, 在容器之间共享Docker卷很有用, 并且有几种方法可以实现这一目标。

在主机上共享卷

如果在主机上创建卷, 则可以一次由多个不同的容器使用该卷。这使你可以在容器和主机之间共享数据。

对于此示例, 我们将在主机上创建一个目录, 并将该目录用作两个容器之间的共享卷。

首先使用以下命令创建一个目录以用作Docker卷:

sudo mkdir /webdata

使用以下命令在此目录中创建一个小的测试文件:

sudo echo "Hello from the host." >> /webdata/host-hello.txt

接下来, 启动一个名为sql数据库来自官方的PostgreSQL映像和地图/ webdata在主机上/数据使用以下命令在容器上:

sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash

在新容器的命令提示符下, 使用以下命令验证是否正确设置了共享卷:

ls /data

你会看到host-hello.txt我们在主机上创建的文件。让我们使用以下命令将文件添加到此共享卷:

echo "Hello from the sql-database container." >> /data/sql-hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。

现在启动一个名为网络应用来自官方的PHP + Apache映像和地图/ webdata在主机上/ var / www / html在容器上。

sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash

在新容器的命令提示符下, 使用以下命令验证是否正确设置了共享卷:

ls /var/www/html

你会看到host-hello.txt我们在主机上创建的文件, 以及sql-hello.txt我们在上创建的文件sql数据库容器。

让我们从该容器中添加一个文件:

echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。进入主机后, 你将看到命令列出的所有三个文件:

sudo ls /webdata

现在, 两个容器共享一个在主机上"存在"的目录, 只需将数据移动到该目录, 即可在所有三个位置之间立即传输数据。

使用容器作为共享数据卷

你还可以将单独的容器设置为共享数据卷。

为此, 首先创建数据容器。然后, 当你创建将使用该数据容器的容器时, 将以下参数添加到泊坞窗运行命令:

--volumes-from [name or ID of data container]

注意:无论目标容器是否正在运行, 这都将起作用。 Docker卷永远不会被删除, 即使容器已停止, 该卷也将持续存在。

在此示例中, 我们将创建一个名为数据存储它将用作数据卷, 并将两个共享它的容器用作存储卷。

首先, 启动数据存储来自CentOS 7官方映像的容器:

sudo docker run -it -v /shared-data --name data-storage centos /bin/bash

然后将一个小文件添加到/共享数据夹:

echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。

现在启动应用程式来自官方Python映像的容器并挂载数据存储容器体积:

sudo docker run -it --name app --volumes-from data-storage python /bin/bash

使用以下命令列出共享卷中的文件:

ls /shared-data

如你所见, /共享数据文件夹已从安装/共享数据上的文件夹数据存储容器, 并包含data-storage-hello.txt文件。

让我们从此容器中添加一个:

echo "Hello from the app container." >> /shared-data/app-hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。

最后, 启动网路官方Apache映像中的容器并挂载数据存储容器体积:

sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash

使用以下命令列出共享卷中的文件:

ls /shared-data

你会看到我们在数据存储和应用程式此处列出的容器。

将卷挂载为只读

在本指南中, 我们一直在使用默认的读写访问权限安装卷。

如果要将容器限制为对卷具有只读访问权限, 只需添加:ro到在-v声明:

docker run -v /directory:/path:ro

出于安全目的, 或者当你要确保保护特定卷中的数据以免被另一个容器意外覆盖或删除时, 这可能很有用。

例如, 首先在名为的主机上创建一个卷受限访问使用命令:

sudo docker volume create --name limited-access

然后从中心图片命名允许写并绘制音量受限访问作为普通(读写)卷:

sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash

在此容器的命令提示符下, 使用以下命令创建测试文件:

echo "Hello from the container that is allowed to write." >> /data/hello.txt

从容器上拆下Ctrl-p+Ctrl-q并返回到主机的命令提示符。

接下来, 从中心图片命名不允许写并绘制音量受限访问作为只读卷:

sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash

如果你尝试使用以下命令在共享卷中创建测试文件:

echo "Hello from the container that is not allowed to write." >> /data/no-access.txt

你将收到一条错误消息, 说明该容器没有对该目录的写访问权:

bash: /data/no-access.txt: Read-only file system
一盏木

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: