Як змінити каталог встановлення зображень докер?


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). Ви можете застосувати це налаштування автоматично, коли Докер починається, додавши його в / etc / default / docker


4
Я думаю, що найкращим рішенням є додавання цієї -gопції до / etc / defaults / docker замість зміни файлу Upstart, дивіться мою відповідь.
mbarthelemy

9
Так, змінити цю лінію наDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy

6
Не працює у Fedora. Дивіться мою відповідь, якщо ваш дистрибутив - Fedora
Vitor

3
Можливо, вам доведеться застосувати це рішення до помилки в деяких версіях Debian або Ubuntu, якщо докер ігнорує ваш /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-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 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/… дякую!
насатом

8
Я думаю, що пора дати цю відповідь "прийнятим" прапором, адже він працює в поточній версії.
Бндр

Я коментую тут, щоб повідомити людям, яка версія може використовувати це, після випуску github.com/docker/docker.github.io/pull/5978 , це змінить веб-сайт позаштатної пошти.
zhongjiajie

Це спрацювало і для мене, дякую :)
Аашай Амбаллі

39

Оскільки я не знайшов правильних вказівок для цього в Fedora (EDIT: люди вказували в коментарях, що це також має працювати на 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 зараз (версія докера 1.7.0).
недім

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


23

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

Краще використовувати опцію -g для докера. У Ubuntu ви можете його постійно встановити в /etc/default/docker.io. Покращіть або замініть рядок DOCKER_OPTS.

Ось приклад: `DOCKER_OPTS =" - g / mnt / десь / ще / 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

Запустіть послугу докера

sudo systemctl start docker

2
Це правильне і найпростіше рішення IMO - працювало для мене.
Мартін Дворак

2
працював як шарм для мене, але без sudo ln -s /path/to/new/docker/ /var/lib/docker
зворотної

Це те, що пропонують докерські
headdab

Це дивовижне рішення, яке врятувало мені життя. :)
Niketh Sudhakaran

Я виконав вище, і докер працював. Але я не можу знайти, що мої докерські зображення вже існують. Будь-які пропозиції?
Тіліна Вірай

13

Це рішення працює на Red Hat 7.2 та Docker 1.12.0

Відредагуйте файл /lib/systemd/system/docker.service у своєму текстовому редакторі.

в кінці директиви ExecStart додайте -g / path / до / docker / . Повна лінія повинна виглядати приблизно так.

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, останній докер; Мені довелося зателефонувати "docker.service статусу" systemctl, щоб знайти файл "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"

потім збережіть файл і запустіть докер знову

service docker start

і зробить файл сховища в /data/docker


6

Для Debian / Ubuntu або Fedora, ймовірно, ви можете використовувати інші відповіді. Але якщо у вас немає файлів під /etc/default/dockerабо /etc/sysconfig/docker, і ваша система працює з системою, ви, можливо, захочете відповісти за цією відповіддю 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/isissue/9889#issuecomment-109766580
Simon Woodside

4

Набагато простіше рішення - створити м'яку точку посилання на все, що завгодно, наприклад

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

Він працює для мене на моєму сервері CentOS 6.5.


6
Не створюйте софтпосилання. Причини бачити мій коментар, який я публікую раніше ... Ви можете зіткнутися з проблемою з командами 'docker rm'!
суть

2
@suther: Травень? Зараз є ситуація, з якою ви зіткнулися з проблемою чи ні? Травень трохи неточний для технічної документації, якщо я зіткнувся з проблемою, то я хочу дізнатися, коли саме це відбувається, як ця проблема викликана та яким би був результат.
хакре

4

Як рекомендує @mbarthelemy, це можна зробити за допомогою -gопції при безпосередньому запуску демон- докера .

Однак якщо докер запускається як системна служба, не рекомендується змінювати /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 та, ймовірно, у багатьох інших версіях ви можете зіткнутися з помилкою після переміщення місця розташування базової папки, як описано вище. Це особливо актуально, якщо ви переміщуєте його кудись під / додому. Це відбувається тому, що SeLinux запускає та заважає контейнеру docker запускати багато його програм з-під цього місця.

Коротке рішення полягає у видаленні параметра --enable-selinux, коли ви додаєте параметр -g.


Хіба це не відкрило б місця для атак?
yuriploc

1

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

Цей фрагмент мого сценарію ініціалізації працював коректно

# 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.