如何在Docker可写层中编写或创建新数据

问题描述 投票:0回答:2

据我所知,每个Docker容器都有一个可写层来保存或保存容器相关数据。虽然它是epimeral,但我想将我的app数据存储在容器中。

  • 我如何知道存储该(app)文件的目录?
  • storage drivers如何发挥作用?
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用户身份运行我的容器,因此我不确定如何将应用程序数据存储在容器中。

任何指针都会有所帮助。

docker containers dockerfile
2个回答
0
投票

我如何知道存储该(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。只有当您的机器使用zfsbtrfs时,您才可以选择使用zfsbtrfsdocker存储驱动程序。但是你最好知道如何管理这些文件系统。如果要从快照中受益,请仅使用这些选项。


在我的容器中执行ls -lrt时,我确实看到所有目录都没有非root用户的写权限。由于我以非root用户身份运行我的容器,因此我不确定如何将应用程序数据存储在容器中。

在Dockerfile中,只需使用RUN chown <your user> <location>即可。


0
投票

将数据写入容器的可写层并将更改提交到具有不同标记的图像(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
© www.soinside.com 2019 - 2024. All rights reserved.