Wie ändere ich das Docker-Image-Installationsverzeichnis?

182

Soweit ich das beurteilen kann, werden Docker-Images beim Ziehen installiert /var/lib/docker. Gibt es eine Möglichkeit, diesen Speicherort zu ändern, z. B. auf ein bereitgestelltes Volume wie /mnt?

Michael Barton
quelle
3
Auf welchem ​​Betriebssystem läuft Ihr Docker?
Thomasleveil

Antworten:

135

In neueren Versionen von Docker haben Sie den Wert des data-rootParameters auf Ihren benutzerdefinierten Pfad in festgelegt /etc/docker/daemon.json (gemäß https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file) ).

Bei älteren Versionen können Sie das Speicherbasisverzeichnis von Docker (wo sich Container und Images befinden) mithilfe der -gOption beim Starten des Docker-Dämons ändern . (überprüfen docker --help). Sie können diese Einstellung automatisch anwenden, wenn Docker gestartet wird, indem Sie sie zu / etc / default / docker hinzufügen

mbarthelemy
quelle
4
Ich denke, die beste Lösung ist, diese -gOption zu / etc / defaults / docker hinzuzufügen, anstatt die Upstart-Datei zu ändern, siehe meine Antwort.
Mbarthelemy
9
Ja, ändern Sie diese Zeile zuDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
6
Funktioniert nicht in Fedora. Siehe meine Antwort, wenn Ihre Distribution Fedora
Vitor
3
Möglicherweise müssen Sie diese Lösung für einen Fehler in einigen Versionen von Debian oder Ubuntu implementieren, wenn Docker Ihre /etc/default/dockerDatei ignoriert .
Nedim
4
Das graphAttribut in daemon.json ist ab Version 17.05.0 veraltet. Verwenden Sie data-rootstattdessen, vgl. stackoverflow.com/a/50217666/743507
dschulten
141

Nach den Ratschlägen aus den Kommentaren verwende ich die Docker-Systemdokumentation , um diese Antwort zu verbessern. Das folgende Verfahren erfordert keinen Neustart und ist viel sauberer.

Erstellen Sie zuerst ein Verzeichnis und eine Datei für die benutzerdefinierte Konfiguration:

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

Für Docker-Version vor 17.06-ce einfügen:

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

Für Docker nach 17.06-ce Paste:

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

Alternative Methode durch daemon.json

Ich habe kürzlich das obige Verfahren mit 17.09-ce auf Fedora 25 ausprobiert und es scheint nicht zu funktionieren. Anstelle dieser einfachen Modifikation /etc/docker/daemon.jsonmachen Sie den Trick:

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

Trotz der Methode müssen Sie die Konfiguration neu laden und Docker neu starten:

sudo systemctl daemon-reload
sudo systemctl restart docker

So bestätigen Sie, dass Docker neu konfiguriert wurde:

docker info|grep "loop file"

In der letzten Version (17.03) ist ein anderer Befehl erforderlich:

docker info|grep "Docker Root Dir"

Die Ausgabe sollte folgendermaßen aussehen:

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

Oder:

 Docker Root Dir: /mnt

Dann können Sie den alten Docker-Speicher sicher entfernen:

rm -rf /var/lib/docker
Piotr Król
quelle
8
Es ist nur eine Methode, die mir unter Ubuntu 16.04 geholfen hat!
Vadim
1
Dieser Link docs.docker.com/engine/admin/systemd erklärt, wie Docker mit systemd konfiguriert wird, das für neuere Linux-Distributionen wie Ubuntu 16.04 funktioniert.
Joseph Hui
6
Die docker infoAussage ist wahrscheinlich veraltet. Unter Ubuntu 16.04 wird überprüft, ob neu konfiguriert wurde sudo docker info | grep "Docker Root Dir". Ansonsten sollte eine gute Antwort die akzeptierte sein;)
Guillaume Perrot
5
In der neuen Version von Linux (4.10) und Docker (docker-ce 17.06) muss die Zeile wie folgt geändert werden: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Wenn Sie sehen, Docker Root Dir: /"/mnt"wann Sie ausgeführt werden docker info|grep "Docker Root Dir", müssen Sie --data-root="/mnt"in --data-root=/mntder Datei ersetzendocker-storage.conf
Ser
60

Für neue Docker-Versionen müssen wir verwenden, data-rootwie graphin Version 17.05.0 veraltet : offizielle veraltete Dokumente

Bearbeiten /etc/docker/daemon.json(falls nicht vorhanden, erstellen) und einschließen:

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

Starten Sie Docker dann neu mit:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Eine ausführlichere schrittweise Erklärung (einschließlich des Verschiebens von Daten) mithilfe von Docker Storage mit Data-Root finden Sie in: Blogpost
  • Im Falle von Windows ein ähnlicher Beitrag Windows-spezifisch
andreas-supersmart
quelle
Ihr Kommentar hat mir geholfen, diese Seite zu finden: adriel.co.nz/blog/2018/01/25/… danke!
Nasatome
8
Ich denke, es ist Zeit, dieser Antwort das "akzeptierte" Flag zu geben, da es in der aktuellen Version funktioniert.
Die Bndr
Ich kommentiere hier, um die Leute wissen zu lassen, welche Version dies verwenden könnte, nachdem die Veröffentlichung von github.com/docker/docker.github.io/pull/5978 die offizielle Website geändert hat.
Zhongjiajie
Das hat auch bei mir funktioniert, danke :)
Aashay Amballi
39

Da ich in Fedora nicht die richtigen Anweisungen dafür gefunden habe (BEARBEITEN: In Kommentaren wurde darauf hingewiesen, dass dies auch unter CentOS und Suse funktionieren sollte) (/ etc / default / docker wird dort nicht verwendet), füge ich meine hinzu Antwort hier:

Sie müssen / etc / sysconfig / docker bearbeiten und die Option -g in die Variable OPTIONS einfügen. Wenn es mehr als eine Option gibt, stellen Sie sicher, dass Sie sie in "" einschließen. In meinem Fall enthielt diese Datei:

OPTIONS=--selinux-enabled

so würde es werden

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

Nach einem Neustart ( systemctl restart docker) sollte Docker das neue Verzeichnis verwenden

Vitor
quelle
Unter CentOS 6.5 / 6.6 und wahrscheinlich 7 verwenden Sie dieselbe / etc / sysconfig / docker-Datei, fügen jedoch die Argumente dem Variablennamen other_args hinzu.
Dlaidlaw
Die Option heißt jetzt DOCKER_OPTS (Docker-Version 1.7.0).
Nedim
6
Ab Version 1.8 von Docker ist die Verwendung der Docker-Konfigurationsdateien in / etc / sysconfig veraltet. Stattdessen sollten Sie die Dropdown-Konfigurationsdateien systemd in etc / systemd / system / docker.service.d verwenden. Führen Sie nach dem Hinzufügen oder Ändern einer Drop-In-Datei während der Ausführung des Docker-Dienstes den Befehl systemctl daemon-reload aus, um systemd anzuweisen, die Konfiguration für den Dienst neu zu laden. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia
und verwenden Sie Drop-In-Dateien docs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia
23

Verwenden Sie keinen symbolischen Link, um den Docker-Ordner (z. B.) nach / mnt zu verschieben. Dies kann zu Problemen mit dem Docker- Befehl rm führen .

Verwenden Sie besser die Option -g für Docker. Unter Ubuntu können Sie es dauerhaft in /etc/default/docker.io einstellen. Erweitern oder ersetzen Sie die Zeile DOCKER_OPTS.

Hier ein Beispiel: `DOCKER_OPTS =" - g / mnt / irgendwo / sonst / Docker / "

suther
quelle
in meinem Fall musste ich neu starten
psychok7
1
Mit welchen Problemen muss ich docker rmbei der Verwendung eines Symlinks rechnen ?
bjhend
1
Ich musste dies auch in Ubuntu 16.04 stackoverflow.com/a/30219552/977622 tun , damit es funktioniert
psychok7
21

Viel einfacher:

Beenden Sie den Docker-Dienst

sudo systemctl stop docker

Verschieben Sie das vorhandene Docker-Verzeichnis an einen neuen Speicherort

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

Erstellen Sie einen symbolischen Link

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

Starten Sie den Docker-Dienst

sudo systemctl start docker
fnjn
quelle
2
Dies ist IMO die richtige und einfachste Lösung - hat für mich funktioniert.
Martin Dvorak
2
funktionierte wie ein Zauber für mich, aber ohne den sudo ln -s /path/to/new/docker/ /var/lib/docker
abschließenden
Dies ist, was die Docker-Foren vorschlagen: forums.docker.com/t/…
headdab
Dies ist eine großartige Lösung, die mir das Leben gerettet hat. :)
Niketh Sudhakaran
Ich habe oben ausgeführt und der Docker war in Betrieb. Ich kann jedoch nicht feststellen, dass meine Docker-Bilder bereits vorhanden sind. Irgendwelche Vorschläge?
Thilina Viraj
13

Diese Lösung funktioniert weiter Red Hat 7.2 und Docker 1.12.0

Bearbeiten Sie die Datei /lib/systemd/system/docker.service in Ihrem Texteditor.

Fügen Sie -g / path / to / docker / am Ende der ExecStart- Direktive hinzu. Die komplette Zeile sollte so aussehen.

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

Führen Sie den folgenden Befehl aus

systemctl daemon-reload
systemctl restart docker

Führen Sie den Befehl aus, um das Docker-Verzeichnis zu überprüfen

docker info | grep "loop file\|Dir"

Wenn Sie die Datei / etc / sysconfig / docker in Red Hat oder Docker 1.7.1 haben, überprüfen Sie diese Antwort.

Sudeepta
quelle
mein Fall: centos7, letzter Docker; Ich musste "systemctl status docker" aufrufen, um die Datei "docker.service" zu finden, und die Option "-g" wie in der Antwort hinzugefügt. Danke
datdinhquoc
13

Copy-and-Paste-Version der Gewinnerantwort :)

Erstellen Sie diese Datei nur mit diesem Inhalt:

$ sudo vi /etc/docker/daemon.json

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

Getestet Ubuntu 16.04.2 LTSim Docker1.12.6

Topera
quelle
1
Das graphAttribut in daemon.json ist ab Version 17.05.0 veraltet. Verwenden Sie data-rootstattdessen, vgl. stackoverflow.com/a/50217666/743507
dschulten
12

In CentOS 6.5

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

Fügen Sie die folgende Zeile hinzu

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

Speichern Sie dann die Datei und starten Sie Docker erneut

service docker start

und macht Repository-Datei in /data/docker

Sean Kim
quelle
6

Für Debian / Ubuntu oder Fedora können Sie wahrscheinlich die anderen Antworten verwenden. Wenn Sie jedoch keine Dateien unter /etc/default/dockeroder /etc/sysconfig/dockerhaben und auf Ihrem System systemd ausgeführt wird, können Sie dieser Antwort von h3nrik folgen . Ich benutze Arch und das funktioniert bei mir.

Grundsätzlich müssen Sie systemd so konfigurieren, dass der neue Docker-Image-Speicherort als Umgebungsvariable gelesen und diese Umgebungsvariable an das Docker-Daemon-Ausführungsskript übergeben wird.

Der Vollständigkeit halber hier die Antwort von h3nrick:


Hast du eine /lib/systemd/system/docker.servicedatei

Wenn ja, bearbeiten Sie es so, dass der Docker-Dienst die übliche /etc/default/dockerUmgebungsdatei verwendet:EnvironmentFile=-/etc/default/docker .

In die /etc/default/dockerDatei dann hinzufügen DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

Am Ende mach einfach a systemctl daemon-reload && systemctl restart docker.

Weitere Informationen finden Sie auch in der Dokumentation .

Modulitos
quelle
Wenn Sie die aktuellen Docker-Installationsanweisungen für Debian befolgen, erhalten Sie SysVinit-Skripte, die jedoch nicht verwendet werden. Siehe github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside
4

Eine viel einfachere Lösung besteht darin, einen Softlink-Punkt zu erstellen, zu dem Sie möchten, z

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

Es funktioniert für mich auf meinem CentOS 6.5-Server.

liuyanghejerry
quelle
6
Erstellen Sie keinen Softlink. Gründe siehe meinen Kommentar, den ich zuvor gepostet habe ... Sie könnten Probleme mit 'docker rm'-Befehlen haben!
Suther
2
@suther: Mai? Gibt es eine Situation, in der Sie in Schwierigkeiten geraten oder nicht? Der Mai ist für die technische Dokumentation etwas ungenau. Wenn ich auf ein Problem stoße, möchte ich wissen, wann genau das passiert, wie dieses Problem verursacht wird und wie das Ergebnis aussehen würde.
hakre
4

Wie von @mbarthelemy empfohlen, kann dies über die -gOption erfolgen, wenn der Docker-Daemon direkt gestartet wird .

Wenn Docker jedoch als Systemdienst gestartet wird, wird nicht empfohlen, die /etc/default/dockerDatei zu ändern . Es ist ein Leitfaden zu dieser befindet sich hier .

Der richtige Ansatz besteht darin, eine /etc/docker/daemon.jsonDatei auf Linux- (oder Mac-) Systemen oder %programdata%\docker\config\daemon.jsonunter Windows zu erstellen . Wenn diese Datei für nichts anderes verwendet wird, sollten die folgenden Felder ausreichen:

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

Dies setzt voraus, dass der neue Speicherort, an dem Docker seine Daten beibehalten soll, ist /docker/daemon_files

ivandov
quelle
2

Bei openSUSE-Sprung 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"

Beachten Sie, dass DOCKER_OPTS anfangs leer war und ich nur das Argument hinzugefügt habe, damit Docker mein neues Verzeichnis verwendet

Mahlatse Makalancheche
quelle
2

Unter Fedora 26 und wahrscheinlich vielen anderen Versionen kann ein Fehler auftreten, nachdem Sie den Speicherort Ihres Basisordners wie oben beschrieben verschoben haben. Dies gilt insbesondere dann, wenn Sie es an einen Ort unter / nach Hause verschieben. Dies liegt daran, dass SeLinux aktiviert wird und verhindert, dass der Docker-Container viele seiner Programme unter diesem Speicherort ausführt.

Die kurze Lösung besteht darin, die Option --enable-selinux zu entfernen, wenn Sie den Parameter -g hinzufügen.

Euan
quelle
Wäre das nicht ein offener Raum für Angriffe?
Yuriploc
1

Auf einem AWS Ubuntu 16.04 Server habe ich die Docker-Images auf einem separaten EBS abgelegt, der unter / home / ubuntu / kaggle / unter dem Docker-Verzeichnis bereitgestellt ist

Dieser Ausschnitt aus meinem Initialisierungsskript hat korrekt funktioniert

# 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
George Fisher
quelle
0

Für Mac-Benutzer in der Version 17.06.0-ce-mac19 können Sie den Speicherort des Disk-Images einfach über die Benutzeroberfläche in der Einstellungsoption verschieben. Ändern Sie einfach den Speicherort des Disk-Images, und es funktioniert (durch Klicken auf Disk-Image verschieben ) und wird neu gestartet der Hafenarbeiter. Mit diesem Ansatz konnte ich meine externe Festplatte zum Speichern von Docker-Bildern verwenden.

sahu
quelle
Wie wäre es mit den vorhandenen Dateien von Docker? sollen wir es manuell verschieben?
Gustav
Sie können versuchen, Docker an einem Ort Ihrer Wahl neu zu installieren. Bild- und Docker-Dateien sind unabhängig.
Sahu