1. 犀牛前端部落首页
  2. Docker

如何访问Docker容器外的文件

如何访问Docker容器外的文件

如果容器是隔离的,它们如何与主机通信,或者存储数据?因为当我们用镜像创建容器时,当容器被删除时,生成的任何数据都会丢失。

所以我们需要一种永久存储的方法。

我们可以使用绑定挂载和卷来做到这一点。

除了绑定挂载可以指向主机上的任何文件夹,并且不直接由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容器外的文件

现在使用配置项运行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> 删除一个卷。

原创文章,作者:犀牛前端部落,如若转载,请注明出处:https://www.pipipi.net/3522.html

发表评论

登录后才能评论