如果容器是隔离的,它们如何与主机通信,或者存储数据?因为当我们用镜像创建容器时,当容器被删除时,生成的任何数据都会丢失。
所以我们需要一种永久存储的方法。
我们可以使用绑定挂载和卷来做到这一点。
除了绑定挂载可以指向主机上的任何文件夹,并且不直接由Docker管理之外,两者之间并没有太多的区别。
让我们从他们开始。一个典型的例子是日志。假设您的应用程序在容器内/usr/src/app/log 中创建了一个日志文件您可以将其映射到主机上的一个文件夹,在docker运行时使用-v(与–volume相同)标志,像这样:-v ~/logs:/usr/src/app/logs
这将把该文件夹映射到用户主目录中的logs子文件夹。
注意: -m或–mount标志的工作方式非常类似
这是我们之前创建的examplenode镜像 :
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
所以现在我们可以运行我们的节点应用程序,任何日志都将存储在主机中,而不是Docker容器中。
注意,examplenode应用程序在/usr/src/app/logs中不生成任何登录,它只是一个示例,您需要首先设置登录。
当你对容器名称运行docker检查时,会在“mount”下面列出关于这个卷的详细信息:
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
你能看到 “Type” : “bind” 吗?这意味着我们已经创建了一个绑定挂载。
现在,我们来讨论 Volumes 。
绑定挂载和卷的区别在于,Docker通过创建卷将数据存储在它管理的文件夹中,这意味着它将负责文件权限和所有权,并为您提供管理这些卷的工具。而绑定挂载基于文件系统路径,Docker不能提供围绕它们的工具。
例如,Docker可以通过运行Docker volume prune或Docker system prune—volume来删除所有未使用的卷。
要创建一个卷,我们首先需要运行docker卷创建:
docker volume create logs
现在你可以使用docker volume ls和docker volume inspect来获得更多关于系统卷的数据:
现在使用配置项运行docker -v logs:/usr/src/app/logs(告诉卷名而不是文件夹)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
现在在镜像上运行docker inspect将显示已挂载的卷:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
看到了吗?现在,日志将存储在/var/lib/ docator /volume /log /_data文件夹中。
例如,当需要在云服务上部署容器时,卷就非常重要。
可以使用docker volume rm <name> 删除一个卷。