Docker组成卷:持久,但在哪里



我已经断断续续地为此挣扎了好几个星期,我不知道自己做错了什么。它一定非常简单,因为我严格遵循了许多教程,并尝试了几乎所有可用的命令。

我尝试做一些非常基本的事情:创建一个(或多个)带有绑定卷的容器,这样我就可以在本地编辑我的代码。我把一个简单的测试设置简化为:

services:
nginx:
container_name: nginx
image: nginx:stable-alpine
ports: 
- "80:80"
volumes:
- "./data:/var/www/html"

我尝试过不同的图像,通过Dockerfile构建了上面的图像,并将nginx配置为您想要的样子(从/var/www/html提供php/html),但这没有什么不同(似乎与我的问题没有直接关系)。

现在,从我所看到和阅读的一切来看,这应该会创建一个目录/docker-compose.yml文件所在的文件夹中的"data"。但它没有。我知道中有一个index.php/数据在这种情况下不起作用,因为nginx还没有配置,但我仍然期望的内容/访问终端中的容器时可用的数据。

当我使用容器中的终端时(通过Docker Desktop),我可以浏览容器中的文件,但没有指向本地的链接/数据文件夹。将nginx配置为提供/var/www/html目录中的文件正如预期的那样:浏览器窗口显示文档根目录中的任何内容。

现在,真正奇怪的部分是:容器的/var/www/html目录的内容似乎被持久化了。如果我在里面放了一个index.php,使用docker compose down,build,prune,up--build甚至删除所有容器、图像和卷,在我再次构建和升级容器后,手动将文件保存在/var/www/html中。只有重新启动系统才能消除这种神秘现象。

据我所知,关闭一个容器应该会导致容器文件系统中的所有更改。从图像中重建应该会有一个新的开始,但事实并非如此。

由于没有在我期望的位置创建卷(在我的本地开发机器上的./data),但我放在容器的/var/www/html中的任何文件似乎在整个过程中都是持久的,我只能想象一些缓存正在发生——或者——在我不期望的地方创建了一个卷(在系统重新启动后清除)。

docker cli和docker Desktop应用程序都没有显示任何卷:

$ docker volume ls
DRIVER    VOLUME NAME

在Docker Desktop中检查正在运行的容器时说(/var/www/test/data应该是我的本地目录):

Mounts
/VAR/WWW/HTML     /var/www/test/data

我的问题:

  • 为什么没有卷目录/数据创建(或使用,如果我手动创建)
  • 为什么nginx容器中/var/www/html的内容是持久的(即使在关闭/清除/修剪/重建所有内容之后)

我到处找,但我找错了地方或使用了错误的搜索词。。。我在其他地方找不到这个问题。这可能是我的系统,我的具体设置吗?可能是文件系统级别的写入权限吗?

典型工作流程:

  • 创建docker-compose.yml文件
  • 运行docker-compose-build(尝试跳过此操作并运行docker-compose-up-build)
  • 运行docker组合

在这个过程中没有显示任何错误,nginx日志告诉我服务器已经启动并运行正常。

系统/版本信息:

$ cat /etc/os-release
NAME="Linux Mint"
VERSION="21 (Vanessa)
$ docker --version
Docker version 20.10.22, build 3a2c30b
$ docker-compose --version
Docker Compose version v2.13.0
$ docker version
Client: Docker Engine - Community
Cloud integration: v1.0.29
Version:           20.10.22
API version:       1.41
Go version:        go1.18.9
Git commit:        3a2c30b
Built:             Thu Dec 15 22:28:04 2022
OS/Arch:           linux/amd64
Context:           desktop-linux
Experimental:      true
Server: Docker Desktop 4.15.0 (93002)
Engine:
Version:          20.10.21
API version:      1.41 (minimum version 1.12)
Go version:       go1.18.7
Git commit:       3056208
Built:            Tue Oct 25 18:00:19 2022
OS/Arch:          linux/amd64
Experimental:     false
containerd:
Version:          1.6.10
GitCommit:        770bd0108c32f3fb5c73ae1264f7e503fe7b2661
runc:
Version:          1.1.4
GitCommit:        v1.1.4-0-g5fd4c4d
docker-init:
Version:          0.19.0
GitCommit:        de40ad0

尝试了几乎所有的东西,包括系统重新启动和反复创建场景。问题依然存在。我在这里检查了很多问题和答案,但我最接近这个问题的是人们试图在图像中安装卷。。。那不是我在做的,我相信。。。我只与docker-compose.yml合作(直到我开始工作为止)。

/var/www/test/data应该是我的本地目录

Server: Docker Desktop 4.15.0 (93002)

Docker Desktop在一个隐藏的Linux虚拟机中运行Docker。这在所有平台上都是正确的,即使是本机Linux。这意味着容器不一定能够访问整个主机文件系统。

在Linux上,使用Docker Desktop,默认情况下只有主目录与Docker VM共享。这是几个明显有效但有意外副作用的设置之一:从其他描述来看,它看起来像是绑定挂载了什么(目录内容正在持久化),但它很可能是隐藏的Linux虚拟机中的一个目录。

我在这里建议三个主要选项:

  1. 将您的项目移动到您的主目录中;这是你在另一个答案中已经做过的
  2. 将主机的CCD_ 1目录添加到";文件共享";Docker Desktop中的选项卡";设置";第页
  3. 不要在本机Linux上使用Docker Desktop。卸载它并使用独立的Docker引擎。(如果您已经安装了它,则可能需要运行docker context use default。)

@Garuno您正在了解有关目录的内容!我已经将docker-compose.yml复制到我的~/Projects文件夹中的一个新目录中,它现在可以正常工作了。。。本地目录被持久化,并在重建/重新启动后被装载。。。耶!

作品:

:~/Projects/test3$ ls -al
total 16
drwxrwxr-x 3 jeroen jeroen 4096 Dec 20 14:29 .
drwxr-xr-x 3 jeroen jeroen 4096 Dec 20 14:28 ..
drwxr-xr-x 2 jeroen jeroen 4096 Dec 20 14:30 data
-rw-rw-r-- 1 jeroen jeroen  111 Dec 20 14:28 docker-compose.yml

不起作用:

:/var/www/test2$ ls -al
total 12
drwxr-xr-x 2 jeroen jeroen 4096 Dec 20 14:27 .
drwxr-xr-x 9 jeroen jeroen 4096 Dec 20 11:22 ..
-rw-r--r-- 1 jeroen jeroen  110 Dec 20 14:15 docker-compose.yml

明显的区别在于对当前目录和docker-compose.yml文件的一些组权限,但即使我的chmod/var/www/test2与Project目录完全相同,绑定卷也不起作用。

然而,在/home/jeroen/Projects/test3。。。创建了数据目录,本地或通过容器命令行中的终端访问的文件会显示出来。

我很困惑这是怎么回事,或者出了什么问题,但我的/var/www目录似乎就是不起作用。现在,我很高兴我能以某种方式发挥作用。

如果你有任何信息可以进一步了解这一点,请将其作为答案发布,我很乐意将其标记为其他可能面临同样谜团的人的解决方案。

最新更新