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

时间:2019-04-09 16:12:14

标签: docker containers dockerfile

我了解每个Docker容器都有一个可写层来持久化或保存与容器相关的数据。即使只是俗套,我也想将应用程序数据存储在容器中。

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

任何指针都会有所帮助。

2 个答案:

答案 0 :(得分:0)

  

我怎么知道存储该(应用程序)文件的目录?

任何写入非docker volume位置的文件都会写入docker容器文件系统的可写层。


  

存储驱动程序如何发挥作用?

here所述:

  

Docker支持以下存储驱动程序:

     

overlay2是首选存储驱动程序,适用于所有当前支持的驱动程序   Linux发行版,不需要任何额外的配置。 aufs是   在Docker 18.06和更早版本上运行时首选的存储驱动程序   内核3.13上的Ubuntu 14.04,不支持overlay2。   支持devicemapper,但需要直接lvm​​进行生产   环境,因为loopback-lvm虽然为零配置,但   表现不佳。 devicemapper是推荐的存储驱动程序   CentOS和RHEL的内核版本不支持overlay2。   但是,当前版本的CentOS和RHEL现在支持   overlay2,现在是推荐的驱动程序。 btrfs和zfs   如果存储驱动程序是后备文件系统(   安装Docker的主机的文件系统)。这些   文件系统允许使用高级选项,例如创建“快照”,   但需要更多的维护和设置。这些都依赖于   支持文件系统配置正确。 VFS存储驱动程序   用于测试目的,以及在没有   可以使用写时复制文件系统。该存储的性能   驱动程序很差,通常不建议用于生产环境。

因此,在大多数情况下,您将不得不起诉overlay2。仅当您的机器使用zfsbtrfs时,您才可以选择使用zfsbtrfs docker存储驱动程序。但是您最好知道如何管理这些文件系统。如果您想从快照中受益,请仅使用这些选项。


  

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

在您的Dockerfile中,只需使用RUN chown <your user> <location>

答案 1 :(得分: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