Из того, что я могу сказать, докерные изображения устанавливаются на /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 вы можете просто перемещать местоположение образа диска из пользовательского интерфейса в настройках параметров. Просто измените местоположение образа диска и он будет работать (нажав Переместить образ диска) и перезапустить докер. Используя этот подход, я смог использовать внешний жесткий диск для хранения изображений докеров.