据我所知,每个Docker容器都有一个可写层来保存或保存容器相关数据。虽然它是epimeral,但我想将我的app数据存储在容器中。
drwxr-xr-x 1 root root 4096 app
drwxr-xr-x 2 root root 4096 mount
dr-xr-xr-x 13 root root 0 sys
在我的容器中执行ls -lrt
时,我确实看到所有目录都没有非root用户的写权限。由于我以非root用户身份运行我的容器,因此我不确定如何将应用程序数据存储在容器中。
任何指针都会有所帮助。
我如何知道存储该(app)文件的目录?
写入不是docker volume的位置的任何文件都写在docker容器文件系统的可写层上。
存储驱动程序如何发挥作用?
正如描述here:
Docker支持以下存储驱动程序:
overlay2是所有当前支持的Linux发行版的首选存储驱动程序,无需额外配置。 aufs是Docker 18.06及更早版本的首选存储驱动程序,在内核3.13上运行Ubuntu 14.04时不支持overlay2。支持devicemapper,但生产环境需要direct-lvm,因为loopback-lvm虽然是零配置,但性能非常差。 devicemapper是CentOS和RHEL的推荐存储驱动程序,因为它们的内核版本不支持overlay2。但是,当前版本的CentOS和RHEL现在支持overlay2,现在推荐使用它。如果btrfs和zfs存储驱动程序是后备文件系统(安装Docker的主机的文件系统),则使用它们。这些文件系统允许高级选项,例如创建“快照”,但需要更多维护和设置。其中每个都依赖于正确配置的后备文件系统。 vfs存储驱动程序用于测试目的,适用于无法使用copy-on-write文件系统的情况。此存储驱动程序的性能很差,通常不建议用于生产。
所以在大多数情况下,你必须起诉overlay2
。只有当您的机器使用zfs
或btrfs
时,您才可以选择使用zfs
或btrfs
docker存储驱动程序。但是你最好知道如何管理这些文件系统。如果要从快照中受益,请仅使用这些选项。
在我的容器中执行ls -lrt时,我确实看到所有目录都没有非root用户的写权限。由于我以非root用户身份运行我的容器,因此我不确定如何将应用程序数据存储在容器中。
在Dockerfile中,只需使用RUN chown <your user> <location>
即可。
将数据写入容器的可写层并将更改提交到具有不同标记的图像(OR)使用相同的容器名称来启动容器。
例如:启动一个Ubuntu容器并将一些数据写入文件。
$ docker run --name elastic_spence -it ubuntu /bin/bash
root@5f4a60fb6348:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@5f4a60fb6348:/# mkdir data
root@5f4a60fb6348:/# cd data
root@5f4a60fb6348:/data# echo "Sample text" > data.txt
root@5f4a60fb6348:/data# ls -lrth
total 4.0K
-rw-r--r-- 1 root root 12 Apr 9 17:06 data.txt
root@5f4a60fb6348:/data# cat data.txt
Sample text
root@5f4a60fb6348:/data#
停止容器并启动具有相同名称的容器。
$ docker start elastic_spence
elastic_spence
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f4a60fb6348 ubuntu "/bin/bash" 2 minutes ago Up 3 seconds elastic_spence
在上一个会话中创建的文件已保留,并在新会话中可用。
$ docker exec -it 5f4a60fb6348 /bin/bash
root@5f4a60fb6348:/# ls
bin boot data dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@5f4a60fb6348:/# cd data/
root@5f4a60fb6348:/data# ls -lrth
total 4.0K
-rw-r--r-- 1 root root 12 Apr 9 17:06 data.txt
root@5f4a60fb6348:/data# cat data.txt
Sample text
root@5f4a60fb6348:/data#
此外,您可以将容器更改提交到新图像,如下所示。
$ docker commit elastic_spence datastore:1.0
sha256:9fd236a965f655b86c0b17588b7c87f823caaf6cd02eafb62457576e4e02b514
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
datastore 1.0 9fd236a965f6 4 seconds ago 88.9MB
运行新映像,您将能够看到持久数据。
$ docker run -it datastore:1.0
root@759a9a50b015:/# cat data/data.txt
Sample text