Как написать или создать новые данные в Docker Writable Layer - PullRequest
0 голосов
/ 09 апреля 2019

Я понимаю, что каждый контейнер Docker будет иметь доступный для записи слой для сохранения или сохранения данных, связанных с контейнером.Несмотря на то, что это эпимерально, я хотел бы хранить данные своего приложения внутри контейнера.

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 голосов
/ 09 апреля 2019

Записать данные в доступный для записи слой контейнера и зафиксировать изменения в изображении с другим тегом (ИЛИ), используя то же имя контейнера для запуска контейнера.

Например: запустил один контейнер 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
0 голосов
/ 09 апреля 2019

Как узнать каталог для хранения этого файла (приложения)?

Любой файл, записанный в местоположение, которое не является томом Docker , записывается в слой записи файловой системы контейнера Docker.


Как драйверы хранилища играют роль?

Как описано здесь :

Docker поддерживает следующие драйверы хранилища:

overlay2 является предпочтительным драйвером хранилища, для всех поддерживаемых в настоящее время Дистрибутивы Linux, и не требует дополнительной настройки. aufs это предпочтительный драйвер хранилища для Docker 18.06 и старше при работе на Ubuntu 14.04 на ядре 3.13, которое не поддерживает overlay2. devicemapper поддерживается, но для производства требуется direct-lvm окружения, потому что loopback-lvm, в то время как нулевая конфигурация, имеет очень низкая производительность. devicemapper был рекомендуемым драйвером для хранения CentOS и RHEL, так как их версия ядра не поддерживала оверлей2. Однако, текущие версии CentOS и RHEL теперь поддерживают overlay2, который сейчас является рекомендуемым драйвером. Btrfs и ZFS драйверы хранилища используются, если они являются резервной файловой системой ( файловая система хоста, на котором установлен Docker). Эти файловые системы допускают расширенные возможности, такие как создание «снимков», но требуют большего обслуживания и настройки. Каждый из них опирается на резервная файловая система настроена правильно. Драйвер хранилища VFS предназначен для целей тестирования, а также для ситуаций, когда нет можно использовать файловую систему копирования при записи. Производительность этого хранилища драйвер некачественный и обычно не рекомендуется для производственного использования.

Так что в большинстве случаев вам придется подавать в суд overlay2. Только если ваша машина использует zfs или btrfs, вы можете использовать драйверы хранилища док-станции zfs или btrfs. Но тогда вам лучше знать, как управлять этими файловыми системами. Используйте только эти параметры, если вы хотите использовать моментальные снимки.


При выполнении ls -lrt внутри моего контейнера я вижу, что все каталоги не имеют разрешений на запись для пользователя без полномочий root. Поскольку я запускаю свой контейнер как пользователь без полномочий root, я не уверен, как я могу хранить данные приложения внутри контейнера.

В вашем Dockerfile просто используйте RUN chown <your user> <location>.

...