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?
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
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:
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:
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
Eine ausführlichere schrittweise Erklärung (einschließlich des Verschiebens von Daten) mithilfe von Docker Storage mit Data-Root finden Sie in: Blogpost
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
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/…
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 / "
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.
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
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 .
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
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.
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
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.
Antworten:
In neueren Versionen von Docker haben Sie den Wert des
data-root
Parameters 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
-g
Option beim Starten des Docker-Dämons ändern . (überprüfendocker --help
). Sie können diese Einstellung automatisch anwenden, wenn Docker gestartet wird, indem Sie sie zu / etc / default / docker hinzufügenquelle
-g
Option zu / etc / defaults / docker hinzuzufügen, anstatt die Upstart-Datei zu ändern, siehe meine Antwort.DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
/etc/default/docker
Datei ignoriert .graph
Attribut in daemon.json ist ab Version 17.05.0 veraltet. Verwenden Siedata-root
stattdessen, vgl. stackoverflow.com/a/50217666/743507Nach 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:
Für Docker-Version vor 17.06-ce einfügen:
Für Docker nach 17.06-ce Paste:
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.json
machen Sie den Trick:Trotz der Methode müssen Sie die Konfiguration neu laden und Docker neu starten:
So bestätigen Sie, dass Docker neu konfiguriert wurde:
In der letzten Version (17.03) ist ein anderer Befehl erforderlich:
Die Ausgabe sollte folgendermaßen aussehen:
Oder:
Dann können Sie den alten Docker-Speicher sicher entfernen:
quelle
docker info
Aussage ist wahrscheinlich veraltet. Unter Ubuntu 16.04 wird überprüft, ob neu konfiguriert wurdesudo docker info | grep "Docker Root Dir"
. Ansonsten sollte eine gute Antwort die akzeptierte sein;)Docker Root Dir: /"/mnt"
wann Sie ausgeführt werdendocker info|grep "Docker Root Dir"
, müssen Sie--data-root="/mnt"
in--data-root=/mnt
der Datei ersetzendocker-storage.conf
Für neue Docker-Versionen müssen wir verwenden,
data-root
wiegraph
in Version 17.05.0 veraltet : offizielle veraltete DokumenteBearbeiten
/etc/docker/daemon.json
(falls nicht vorhanden, erstellen) und einschließen:Starten Sie Docker dann neu mit:
quelle
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:
so würde es werden
Nach einem Neustart (
systemctl restart docker
) sollte Docker das neue Verzeichnis verwendenquelle
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 / "
quelle
docker rm
bei der Verwendung eines Symlinks rechnen ?Ubuntu 16.04
stackoverflow.com/a/30219552/977622 tun , damit es funktioniertViel einfacher:
Beenden Sie den Docker-Dienst
Verschieben Sie das vorhandene Docker-Verzeichnis an einen neuen Speicherort
Erstellen Sie einen symbolischen Link
Starten Sie den Docker-Dienst
quelle
sudo ln -s /path/to/new/docker/ /var/lib/docker
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.
Führen Sie den folgenden Befehl aus
Führen Sie den Befehl aus, um das Docker-Verzeichnis zu überprüfen
Wenn Sie die Datei / etc / sysconfig / docker in Red Hat oder Docker 1.7.1 haben, überprüfen Sie diese Antwort.
quelle
Copy-and-Paste-Version der Gewinnerantwort :)
Erstellen Sie diese Datei nur mit diesem Inhalt:
$ sudo vi /etc/docker/daemon.json
Getestet
Ubuntu 16.04.2 LTS
im Docker1.12.6
quelle
graph
Attribut in daemon.json ist ab Version 17.05.0 veraltet. Verwenden Siedata-root
stattdessen, vgl. stackoverflow.com/a/50217666/743507In CentOS 6.5
Fügen Sie die folgende Zeile hinzu
Speichern Sie dann die Datei und starten Sie Docker erneut
und macht Repository-Datei in
/data/docker
quelle
Für Debian / Ubuntu oder Fedora können Sie wahrscheinlich die anderen Antworten verwenden. Wenn Sie jedoch keine Dateien unter
/etc/default/docker
oder/etc/sysconfig/docker
haben 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.service
dateiWenn ja, bearbeiten Sie es so, dass der Docker-Dienst die übliche
/etc/default/docker
Umgebungsdatei verwendet:EnvironmentFile=-/etc/default/docker
.In die
/etc/default/docker
Datei dann hinzufügenDOCKER_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 .
quelle
Eine viel einfachere Lösung besteht darin, einen Softlink-Punkt zu erstellen, zu dem Sie möchten, z
Es funktioniert für mich auf meinem CentOS 6.5-Server.
quelle
Wie von @mbarthelemy empfohlen, kann dies über die
-g
Option erfolgen, wenn der Docker-Daemon direkt gestartet wird .Wenn Docker jedoch als Systemdienst gestartet wird, wird nicht empfohlen, die
/etc/default/docker
Datei zu ändern . Es ist ein Leitfaden zu dieser befindet sich hier .Der richtige Ansatz besteht darin, eine
/etc/docker/daemon.json
Datei auf Linux- (oder Mac-) Systemen oder%programdata%\docker\config\daemon.json
unter Windows zu erstellen . Wenn diese Datei für nichts anderes verwendet wird, sollten die folgenden Felder ausreichen:Dies setzt voraus, dass der neue Speicherort, an dem Docker seine Daten beibehalten soll, ist
/docker/daemon_files
quelle
Bei openSUSE-Sprung 42.1
Beachten Sie, dass DOCKER_OPTS anfangs leer war und ich nur das Argument hinzugefügt habe, damit Docker mein neues Verzeichnis verwendet
quelle
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.
quelle
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
quelle
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.
quelle