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
?
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
?
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üfen docker --help
). Sie können diese Einstellung automatisch anwenden, wenn Docker gestartet wird, indem Sie sie zu / etc / default / docker hinzufügen
-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"
graph
Attribut in daemon.json ist ab Version 17.05.0 veraltet. Verwenden Sie data-root
stattdessen, vgl. stackoverflow.com/a/50217666/743507
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"
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:
{
"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
docker info
Aussage 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;)
Docker Root Dir: /"/mnt"
wann Sie ausgeführt werden docker 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
wie graph
in 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
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
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 / "
docker rm
bei der Verwendung eines Symlinks rechnen ?
Ubuntu 16.04
stackoverflow.com/a/30219552/977622 tun , damit es funktioniert
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
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.
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.
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 LTS
im Docker1.12.6
graph
Attribut in daemon.json ist ab Version 17.05.0 veraltet. Verwenden Sie data-root
stattdessen, vgl. stackoverflow.com/a/50217666/743507
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
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
datei
Wenn 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ü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 .
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.
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:
{
"graph": "/docker/daemon_files"
}
Dies setzt voraus, dass der neue Speicherort, an dem Docker seine Daten beibehalten soll, ist /docker/daemon_files
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
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.