Из того, что я могу сказать, образы докеров устанавливаются по /var/lib/docker
мере их извлечения. Есть ли способ изменить это местоположение, например, на смонтированный том, как /mnt
?
Из того, что я могу сказать, образы докеров устанавливаются по /var/lib/docker
мере их извлечения. Есть ли способ изменить это местоположение, например, на смонтированный том, как /mnt
?
Ответы:
В последних версиях 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
-g
опцию в / etc / defaults / docker вместо изменения файла Upstart, см. Мой ответ.
DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
graph
Атрибутом в daemon.json является устаревшим v17.05.0, использовать data-root
вместо этого, ср stackoverflow.com/a/50217666/743507
Следуя советам из комментариев, я использую документацию 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
docker info
Заявление, вероятно , устарели. В Ubuntu 16.04, проверка на Реконфигурированный есть sudo docker info | grep "Docker Root Dir"
. В противном случае, хороший ответ, должен быть принят;)
Docker Root Dir: /"/mnt"
когда вы работаете docker info|grep "Docker Root Dir"
, вы должны заменить --data-root="/mnt"
в --data-root=/mnt
внутри файлаdocker-storage.conf
Для новых версий докеров мы должны использовать 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
Поскольку я не нашел правильных инструкций для этого в Fedora (РЕДАКТИРОВАТЬ: люди указывали в комментариях, что это также должно работать на CentOS и Suse) (/ etc / default / docker там не используется), я добавляю свой ответ здесь:
Вы должны отредактировать / etc / sysconfig / docker и добавить опцию -g в переменную OPTIONS. Если есть несколько вариантов, убедитесь, что вы заключили их в "". В моем случае этот файл содержал:
OPTIONS=--selinux-enabled
так стало бы
OPTIONS="--selinux-enabled -g /mnt"
После перезапуска ( systemctl restart docker
) Docker должен использовать новый каталог
Не используйте символическую ссылку для перемещения папки Docker в / mnt (например). Это может вызвать проблемы с командой docker rm .
Лучше использовать опцию -g для докера. В Ubuntu вы можете установить его постоянно в /etc/default/docker.io. Расширьте или замените строку DOCKER_OPTS.
Вот пример: `DOCKER_OPTS =" - g / mnt / где-то / else / docker / "
docker rm
при использовании символической ссылки?
Ubuntu 16.04
stackoverflow.com/a/30219552/977622, чтобы заставить его работать
Остановить службу докера
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
sudo ln -s /path/to/new/docker/ /var/lib/docker
Это решение работает на 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, проверьте этот ответ.
Скопируйте и вставьте версию ответа победителя :)
Создайте этот файл только с этим содержимым:
$ sudo vi /etc/docker/daemon.json
{
"graph": "/my-docker-images"
}
Проверено Ubuntu 16.04.2 LTS
в докере1.12.6
graph
Атрибутом в daemon.json является устаревшим v17.05.0, использовать data-root
вместо этого, ср stackoverflow.com/a/50217666/743507
Для 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
.
Для получения дополнительной информации, пожалуйста, ознакомьтесь с документацией .
Гораздо более простое решение - создать мягкую ссылку на то, что вы хотите, например,
link -s /var/lib/docker /mnt/whatever
Это работает для меня на моем сервере CentOS 6.5.
Как рекомендует @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
На 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 изначально был пуст, и все, что я сделал, это добавил в аргумент, чтобы докер использовал мой новый каталог
В Fedora 26 и, возможно, во многих других версиях вы можете столкнуться с ошибкой после перемещения расположения базовой папки, как описано выше. Это особенно верно, если вы перемещаете его куда-то в / home. Это связано с тем, что SeLinux запускает и предотвращает запуск многих своих программ из этого местоположения в контейнере Docker.
Короткое решение - удалить опцию --enable-selinux при добавлении параметра -g.
На сервере 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
Для пользователей Mac в версии 17.06.0-ce-mac19 вы можете просто переместить расположение образа диска из пользовательского интерфейса в параметре настроек. Просто измените расположение образа диска, и он будет работать (нажав « Переместить образ диска» ) и перезапустив его. докер Используя этот подход, я смог использовать свой внешний жесткий диск для хранения образов докера.