Как изменить каталог установки образа докере?

Из того, что я могу сказать, докерные изображения устанавливаются на /var/lib/docker по мере их вытаскивания. Есть ли способ изменить это местоположение, например, на смонтированный том вроде /mnt?

Ответ 1

В последних версиях Docker вы можете установить значение параметра data-root для своего пользовательского пути в /etc/docker/daemon.json (согласно https://docs.docker.com/engine/reference/commandline/dockerd/# daemon-configuration-file).

В более старых версиях вы можете изменить базовый каталог хранилища Docker (куда направляются контейнер и образы), используя -g при запуске демона Docker. (проверьте docker --help). Вы можете автоматически применить этот параметр при запуске Docker, добавив его в /etc/default/docker

Ответ 2

Следуя рекомендациям комментариев, я использую документацию Docker systemd, чтобы улучшить этот ответ. Ниже процедура не требует перезагрузки и намного чище.

Сначала создайте каталог и файл для пользовательской настройки:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo $EDITOR /etc/systemd/system/docker.service.d/docker-storage.conf

Для версии докера до 17.06-ce:

[Service]
ExecStart=
ExecStart=/usr/bin/docker daemon -H fd:// --graph="/mnt"

Для докеров после 17.06-ce:

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// --data-root="/mnt"

Альтернативный метод через daemon.json

Недавно я попробовал процедуру с 17.09-ce на Fedora 25 и, похоже, не работает. Вместо этой простой модификации в /etc/docker/daemon.json выполните трюк:

{
    "graph": "/mnt",
    "storage-driver": "overlay"
}

Несмотря на то, что вам необходимо перезагрузить конфигурацию и перезапустить Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Чтобы подтвердить, что Docker был переконфигурирован:

docker info|grep "loop file"

В последней версии (17.03) требуется следующая команда:

docker info|grep "Docker Root Dir"

Результат должен выглядеть следующим образом:

 Data loop file: /mnt/devicemapper/devicemapper/data
 Metadata loop file: /mnt/devicemapper/devicemapper/metadata

Или:

 Docker Root Dir: /mnt

Затем вы можете безопасно удалить старое хранилище Docker:

rm -rf /var/lib/docker

Ответ 3

Так как я не нашел правильных инструкций для этого в Fedora (EDIT: люди указали в комментариях, что это также должно работать на CentOS и Suse) (/etc/default/docker там не используется) m добавление моего ответа здесь:

Вам нужно отредактировать /etc/sysconfig/docker и добавить параметр -g в переменную OPTIONS. Если имеется более одного варианта, убедитесь, что вы заключили их в "". В моем случае этот файл содержал:

OPTIONS=--selinux-enabled

чтобы он стал

OPTIONS="--selinux-enabled -g /mnt"

После перезагрузки (systemctl restart docker) Docker должен использовать новый каталог

Ответ 4

Для новых версий докеров нам нужно использовать data-root поскольку graph не рекомендуется в версии 17.05.0: официальные устаревшие документы

Отредактируйте /etc/docker/daemon.json (если он не существует, создайте его) и /etc/docker/daemon.json:

{
  "data-root": "/new/path/to/docker-data"
}

Затем перезапустите Docker с помощью:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Более подробное пошаговое объяснение (включая перемещение данных) с использованием Docker Storage с корнем данных можно найти в: сообщении в блоге
  • В случае с Windows аналогичный пост Windows специфичен

Ответ 5

Не используйте символическую ссылку для перемещения папки докеров в /mnt (например). Это может вызвать проблемы с командой docker rm.

Лучше использовать параметр -g для докеров. На Ubuntu вы можете установить его навсегда в /etc/default/docker.io. Увеличьте или замените строку DOCKER_OPTS.

Вот пример: `DOCKER_OPTS = "- g/mnt/something/else/docker/"

Ответ 6

Скопировать и вставить версию ответа победителя:)

Создайте этот файл только с этим контентом:

$sudo vi/etc/docker/daemon.json

  {
      "graph": "/my-docker-images"
  }

Протестировано на Ubuntu 16.04.2 LTS в докере 1.12.6

Ответ 7

В CentOS 6.5

service docker stop
mkdir /data/docker  (new directory)
vi /etc/sysconfig/docker

добавить следующую строку

other_args=" -g /data/docker -p /var/run/docker.pid"

затем сохраните файл и снова запустите docker

service docker start

и создаст файл репозитория в /data/docker

Ответ 8

Это решение работает на Red Hat 7.2 и Docker 1.12.0

Отредактируйте файл /lib/systemd/system/docker.service в текстовом редакторе.

добавить -g/path/to/docker/ в конце директивы ExecStart. Полная строка должна выглядеть так.

ExecStart=/usr/bin/dockerd -g /path/to/docker/

Выполните следующую команду

systemctl daemon-reload
systemctl restart docker

Выполните команду для проверки каталога докеров

docker info | grep "loop file\|Dir"

Если у вас есть файл /etc/sysconfig/docker в Red Hat или docker 1.7.1, проверьте этот ответ.

Ответ 9

Намного проще сделать это:

Остановить службу докера

sudo systemctl stop docker

Переместить существующий каталог докеров в новое место

sudo mv /var/lib/docker/ /path/to/new/docker/

Создать символическую ссылку

sudo ln -s /path/to/new/docker/ /var/lib/docker/

Запустить сервис Docker

sudo systemctl start docker

Ответ 10

Для Debian/Ubuntu или Fedora вы, вероятно, можете использовать другие ответы. Но если у вас нет файлов под /etc/default/docker или /etc/sysconfig/docker, и ваша система запускает systemd, вы можете захотеть следовать этому ответу h3nrik. Я использую Arch, и это работает для меня.

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

Для полноты, вот h3nrick ответ:


У вас есть файл /lib/systemd/system/docker.service?

Если это так, отредактируйте его так, чтобы служба Docker использовала обычный /etc/default/docker как файл среды: EnvironmentFile=-/etc/default/docker.

В файле /etc/default/docker добавьте DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

В конце просто сделайте systemctl daemon-reload && systemctl restart docker.

Для получения дополнительной информации также ознакомьтесь с документацией.

Ответ 11

Более простое решение состоит в том, чтобы создать мягкую ссылку на все, что вы хотите, например

link -s /var/lib/docker /mnt/whatever

Он работает для меня на моем сервере CentOS 6.5.

Ответ 12

Как рекомендовано @mbarthelemy, это можно сделать с помощью опции -g при запуске демона докеров.

Однако, если докер запускается как системная служба, не рекомендуется изменять файл /etc/default/docker. Для этого есть здесь.

Правильный подход заключается в создании файла /etc/docker/daemon.json в системах Linux (или Mac) или %programdata%\docker\config\daemon.json в Windows. Если этот файл не используется ни для чего другого, следующие поля должны быть достаточными:

{
    "graph": "/docker/daemon_files"
}

Предполагается, что новое место, где вы хотите, чтобы докер сохранял свои данные, /docker/daemon_files

Ответ 13

В Fedora 26 и, возможно, во многих других версиях вы можете столкнуться с ошибкой после перемещения местоположения вашей базовой папки, как описано выше. Это особенно верно, если вы перемещаете его где-то под/домой. Это связано с тем, что SeLinux запускает и предотвращает запуск контейнера докеров из многих своих программ из этого местоположения.

Коротким решением является удаление опции --enable-selinux при добавлении параметра -g.

Ответ 14

На сервере AWS Ubuntu 16.04 я помещал изображения Docker в отдельную EBS, смонтированную в /home/ubuntu/kaggle/, под docker dir

Этот фрагмент моей инициализации script работал правильно

# where are the images initially stored?
sudo docker info | grep "Root Dir"
# ... not where I want them

# modify the configuration files to change to image location
# NOTE this generates an error
# WARNING: Usage of loopback devices is strongly discouraged for production use.
#          Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
# see https://stackoverflow.com/questions/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' [email protected]#DOCKER_OPTS=.*@DOCKER_OPTS="-g /home/ubuntu/kaggle/docker"@ '  /etc/default/docker

sudo chmod -R ugo+rw /lib/systemd/system/docker.service
sudo cp  /lib/systemd/system/docker.service /etc/systemd/system/
sudo chmod -R ugo+rw /etc/systemd/system/

sudo sed -i ' [email protected]*@ExecStart=/usr/bin/dockerd $DOCKER_OPTS -H fd://@ '  /etc/systemd/system/docker.service
sudo sed -i '/ExecStart/a EnvironmentFile=-/etc/default/docker' /etc/systemd/system/docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo docker info | grep "Root Dir"
# now they're where I want them

Ответ 15

В openSUSE Leap 42.1

$cat /etc/sysconfig/docker 
## Path           : System/Management
## Description    : Extra cli switches for docker daemon
## Type           : string
## Default        : ""
## ServiceRestart : docker
#
DOCKER_OPTS="-g /media/data/installed/docker"

Обратите внимание, что DOCKER_OPTS изначально был пустым, и все, что я сделал, было добавлено в аргумент, чтобы сделать докеры использующими мой новый каталог

Ответ 16

Для пользователей Mac в версии 17.06.0-ce-mac19 вы можете просто перемещать местоположение образа диска из пользовательского интерфейса в настройках параметров. Просто измените местоположение образа диска и он будет работать (нажав Переместить образ диска) и перезапустить докер. Используя этот подход, я смог использовать внешний жесткий диск для хранения изображений докеров.

aCTlT.png