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


183

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


3
на какой операционной системе работает ваш докер?
Thomasleveil

Ответы:


135

В последних версиях 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


4
Я думаю, что лучшее решение - добавить эту -gопцию в / etc / defaults / docker вместо изменения файла Upstart, см. Мой ответ.
Мбартелеми

9
Да, измените эту строку наDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy

6
Не работает в Fedora. Смотрите мой ответ, если ваш дистрибутив - Fedora
Vitor

3
Возможно, вам понадобится реализовать это решение для устранения ошибки в некоторых версиях Debian или Ubuntu, если docker игнорирует ваш /etc/default/dockerфайл.
Недим

4
graphАтрибутом в daemon.json является устаревшим v17.05.0, использовать data-rootвместо этого, ср stackoverflow.com/a/50217666/743507
dschulten

141

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

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

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

Для версии докера до 17.06-й пасты:

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

Для докера после 17.06-й пасты:

[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

8
Это единственный метод, который помог мне в Ubuntu 16.04!
Вадим

1
Эта ссылка docs.docker.com/engine/admin/systemd объясняет, как настроить Docker для systemd, который работает для более новых дистрибутивов Linux, таких как Ubuntu 16.04.
Джозеф Хуэй,

6
docker infoЗаявление, вероятно , устарели. В Ubuntu 16.04, проверка на Реконфигурированный есть sudo docker info | grep "Docker Root Dir". В противном случае, хороший ответ, должен быть принят;)
Гийом Перро

5
В новых версиях Linux (4.10) и Docker (docker-ce 17.06) строка должна быть изменена следующим образом: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini

2
Если вы видите , Docker Root Dir: /"/mnt"когда вы работаете docker info|grep "Docker Root Dir", вы должны заменить --data-root="/mnt"в --data-root=/mntвнутри файлаdocker-storage.conf
Ser

62

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

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

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

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

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

Ваш комментарий помог мне найти эту страницу: adriel.co.nz/blog/2018/01/25/… спасибо!
nasatome

8
Я думаю, что пришло время дать этому ответу флаг «принято», потому что он работает в текущей версии.
Bndr

Я комментирую здесь, чтобы люди знали, какая версия могла бы использовать это, после того, как github.com/docker/docker.github.io/pull/5978 выпустит, Это изменит официальный сайт.
Чжунцзяцзе

Это сработало и для меня, спасибо :)
Aashay Amballi

39

Поскольку я не нашел правильных инструкций для этого в Fedora (РЕДАКТИРОВАТЬ: люди указывали в комментариях, что это также должно работать на CentOS и Suse) (/ etc / default / docker там не используется), я добавляю свой ответ здесь:

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

OPTIONS=--selinux-enabled

так стало бы

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

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


В CentOS 6.5 / 6.6 и, вероятно, 7 вы используете тот же файл / etc / sysconfig / docker, но добавляете аргументы к имени переменной other_args.
Dlaidlaw

Опция теперь называется DOCKER_OPTS (версия Docker 1.7.0).
Недим

6
Начиная с версии 1.8 Docker, использование файлов конфигурации Docker в / etc / sysconfig не рекомендуется. Вместо этого вы должны использовать системные конфигурационные файлы в файле etc / systemd / system / docker.service.d. После добавления или изменения раскрывающегося файла во время работы службы Docker выполните команду systemctl daemon-reload, чтобы сообщить systemd о необходимости перезагрузить конфигурацию для службы. docs.oracle.com/cd/E52668_01/E54669/html/…
Пабло Марин-Гарсия


23

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

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

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


в моем случае мне пришлось перезапустить
psychok7

1
Какие неприятности мне следует ожидать docker rmпри использовании символической ссылки?
bjhend

1
Я также должен был сделать это в Ubuntu 16.04 stackoverflow.com/a/30219552/977622, чтобы заставить его работать
psychok7

21

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

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

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

2
Это ИМО правильное и самое простое решение - сработало для меня.
Мартин Дворжак

2
работал для меня как обаяние, но без косой черты для команды символической ссылки:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio

Это то, что предлагают форумы докеров
headdab

Это потрясающее решение, которое спасло мне жизнь. :)
Никет Судхакаран

Я выполнил выше, и докер был запущен. Но я не могу найти, что мои докеры уже существуют. Какие-либо предложения?
Тилина Вирадж

13

Это решение работает на 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, проверьте этот ответ.


мой случай: centos7, последний докер; мне пришлось вызвать «systemctl status docker», чтобы найти файл «docker.service» и добавить опцию «-g», как в ответе. Спасибо
datdinhquoc

13

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

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

$ sudo vi /etc/docker/daemon.json

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

Проверено Ubuntu 16.04.2 LTSв докере1.12.6


1
graphАтрибутом в daemon.json является устаревшим v17.05.0, использовать data-rootвместо этого, ср stackoverflow.com/a/50217666/743507
dschulten

12

В 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


6

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

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

Для полноты вот ответ 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.

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


Если вы будете следовать текущим инструкциям по установке докера для Debian, вы получите скрипты SysVinit, но они не используются. См. Github.com/docker/docker/issues/9889#issuecomment-109766580
Саймон Вудсайд,

4

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

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

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


6
Не создавайте мягкую ссылку. Причины видят мой комментарий, который я публикую раньше ... У вас могут возникнуть проблемы с командами 'docker rm'!
Süther

2
@suther: май? Есть ли ситуация, когда у вас проблемы или нет? Может быть, немного неточно для технической документации, если я столкнусь с проблемой, то я хочу узнать, когда именно это происходит, как эта проблема вызывается и каков будет результат.
Хакре

4

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

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

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

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

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


2

На 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 изначально был пуст, и все, что я сделал, это добавил в аргумент, чтобы докер использовал мой новый каталог


2

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

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


Разве это не открыло бы место для атак?
yuriploc

1

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

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

# 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 /programming/31620825/
#     warning-of-usage-of-loopback-devices-is-strongly-discouraged-for-production-use

sudo sed -i   ' s@#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 ' s@ExecStart.*@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

0

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


как насчет существующих файлов докера? мы должны переместить это вручную?
Густав

Вы можете попробовать переустановить докер в том месте, где вы предпочитаете. Файлы изображений и докеров являются независимыми.
Саху
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.