Come modificare la directory di installazione dell'immagine docker?


183

Da quello che posso dire, le immagini della finestra mobile vengono installate /var/lib/dockermentre vengono estratte. C'è un modo per cambiare questa posizione, come ad esempio un volume montato /mnt?


3
su quale sistema operativo è in esecuzione la finestra mobile?
Thomasleveil,

Risposte:


135

Con le versioni recenti di Docker, imposteresti il ​​valore del data-rootparametro sul tuo percorso personalizzato, in /etc/docker/daemon.json (secondo https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

Con le versioni precedenti, è possibile modificare la directory di base di archiviazione di Docker (dove vanno il contenitore e le immagini) utilizzando l' -gopzione all'avvio del daemon Docker. (controlla docker --help). È possibile applicare automaticamente questa impostazione all'avvio di Docker aggiungendola a / etc / default / docker


4
Penso che la soluzione migliore sia quella di aggiungere questa -gopzione a / etc / defaults / docker invece di modificare il file Upstart, vedi la mia risposta.
mbarthelemy,

9
Sì, cambia questa riga inDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy il

6
Non funziona in Fedora. Vedi la mia risposta se la tua distribuzione è Fedora
Vitor,

3
Potrebbe essere necessario implementare questa soluzione in un bug in alcune versioni di Debian o Ubuntu se la finestra mobile ignora il tuo /etc/default/dockerfile.
nedim,

4
L' graphattributo in daemon.json è obsoleto a partire dalla versione 17.05.0, utilizzare data-rootinvece, cfr. stackoverflow.com/a/50217666/743507
dschulten

141

Seguendo i consigli dei commenti, utilizzo la documentazione di Systemer Docker per migliorare questa risposta. Di seguito la procedura non richiede il riavvio ed è molto più pulita.

Innanzitutto creare directory e file per la configurazione personalizzata:

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

Per la versione docker precedente alla pasta 17.06-ce :

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

Per docker dopo la pasta 17.06-ce :

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

Metodo alternativo attraverso daemon.json

Di recente ho provato sopra la procedura con 17.09-ce su Fedora 25 e sembra non funzionare. Invece di quella semplice modifica, /etc/docker/daemon.jsonfai il trucco:

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

Nonostante il metodo devi ricaricare la configurazione e riavviare Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Per confermare che Docker è stato riconfigurato:

docker info|grep "loop file"

Nella versione recente (17.03) sono richiesti diversi comandi:

docker info|grep "Docker Root Dir"

L'output dovrebbe essere simile al seguente:

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

O:

 Docker Root Dir: /mnt

Quindi puoi rimuovere in sicurezza la vecchia memoria Docker:

rm -rf /var/lib/docker

8
È l'unico metodo che mi ha aiutato su Ubuntu 16.04!
Vadim,

1
Questo link docs.docker.com/engine/admin/systemd spiega come configurare Docker con systemd, che funziona con una nuova distribuzione di Linux come Ubuntu 16.04.
Joseph Hui,

6
L' docker infoaffermazione è probabilmente obsoleta. Su Ubuntu 16.04, il controllo per riconfigurato è sudo docker info | grep "Docker Root Dir". Altrimenti, una buona risposta, dovrebbe essere quella accettata;)
Guillaume Perrot

5
Nella nuova versione di Linux (4.10) e Docker (docker-ce 17.06) la linea deve essere modificata come segue: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini

2
Se si vede Docker Root Dir: /"/mnt"quando si corre docker info|grep "Docker Root Dir", si deve sostituire --data-root="/mnt"in --data-root=/mntall'interno del filedocker-storage.conf
Ser

62

Per le nuove versioni della finestra mobile dobbiamo usare data-rootcome graphè deprecato in v17.05.0: documenti deprecati ufficiali

Modifica /etc/docker/daemon.json(se non esiste, crealo) e includi:

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

Quindi riavviare Docker con:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Una spiegazione dettagliata più dettagliata (incluso lo spostamento dei dati) utilizzando Docker Storage con data-root è disponibile in: Blog post
  • In caso di Windows un post simile specifico per Windows

il tuo commento mi ha aiutato a trovare questa pagina: adriel.co.nz/blog/2018/01/25/… grazie!
nasatome

8
Penso che sia tempo di dare a questa risposta il flag "accettato", perché funziona nella versione corrente.
Il Bndr il

Commento qui per far sapere alle persone quale versione potrebbe usare questo, dopo il rilascio di github.com/docker/docker.github.io/pull/5978 , cambia il sito Web ufficiale.
zhongjiajie,

Questo ha funzionato anche per me, grazie :)
Aashay Amballi il

39

Dal momento che non ho trovato le istruzioni corrette per farlo in Fedora (EDIT: le persone hanno sottolineato nei commenti che questo dovrebbe funzionare anche su CentOS e Suse) (/ etc / default / docker non viene utilizzato lì), sto aggiungendo il mio rispondi qui:

Devi modificare / etc / sysconfig / docker e aggiungere l'opzione -g nella variabile OPTIONS. Se esiste più di un'opzione, assicurati di racchiuderla tra "". Nel mio caso, quel file conteneva:

OPTIONS=--selinux-enabled

così sarebbe diventato

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

Dopo un riavvio ( systemctl restart docker), Docker dovrebbe utilizzare la nuova directory


Su CentOS 6.5 / 6.6 e probabilmente 7, usi lo stesso file / etc / sysconfig / docker, ma aggiungi gli argomenti al nome della variabile other_args.
Dlaidlaw,

L'opzione si chiama DOCKER_OPTS ora (versione docker 1.7.0).
nedim,

6
Dalla versione 1.8 di Docker in poi, l'utilizzo dei file di configurazione Docker in / etc / sysconfig è obsoleto. Invece, dovresti usare i file di configurazione drop-in di systemd in etc / systemd / system / docker.service.d. Dopo aver aggiunto o modificato un file drop-in mentre il servizio docker è in esecuzione, eseguire il comando systemctl daemon-reload per dire a systemd di ricaricare la configurazione per il servizio. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia,


23

Non utilizzare un collegamento simbolico per spostare la cartella della finestra mobile in / mnt (ad esempio). Ciò potrebbe causare problemi con il comando docker rm .

Meglio usare l'opzione -g per la finestra mobile. Su Ubuntu puoi impostarlo permanentemente in /etc/default/docker.io. Migliora o sostituisci la riga DOCKER_OPTS.

Ecco un esempio: `DOCKER_OPTS =" - g / mnt / somewhere / else / docker / "


nel mio caso ho dovuto ricominciare
psychok7,

1
Che tipo di problemi devo aspettarmi docker rmquando uso un collegamento simbolico?
bjhend,

1
Ho anche dovuto farlo in Ubuntu 16.04 stackoverflow.com/a/30219552/977622 per farlo funzionare
psychok7

21

Modo molto più semplice per farlo:

Interrompere il servizio docker

sudo systemctl stop docker

Sposta la directory docker esistente in una nuova posizione

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

Crea link simbolico

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

Avviare il servizio docker

sudo systemctl start docker

2
Questa è l'IMO la soluzione giusta e più semplice - ha funzionato per me.
Martin Dvorak,

2
ha funzionato come un incantesimo per me, ma senza la barra finale per il comando di collegamento simbolico:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio

Questo è ciò che suggeriscono i forum docker
headdab

Questa è una soluzione fantastica che mi ha salvato la vita. :)
Niketh Sudhakaran,

Ho eseguito sopra e la finestra mobile era attiva e funzionante. Ma non riesco a trovare le mie immagini docker già esistenti. Eventuali suggerimenti?
Thilina Viraj,

13

Questa soluzione funziona su Red Hat 7.2 e Docker 1.12.0

Modifica il file /lib/systemd/system/docker.service nel tuo editor di testo.

aggiungi -g / path / a / docker / alla fine della direttiva ExecStart . La linea completa dovrebbe apparire così.

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

Eseguire il comando seguente

systemctl daemon-reload
systemctl restart docker

Eseguire il comando per controllare la directory docker

docker info | grep "loop file\|Dir"

Se hai / etc / sysconfig / docker in Red Hat o docker 1.7.1 controlla questa risposta.


il mio caso: centos7, ultima finestra mobile; ho dovuto chiamare "systemctl status docker" per trovare il file "docker.service" e ho aggiunto l'opzione "-g" come nella risposta. Grazie
datdinhquoc

13

Copia e incolla la versione della risposta del vincitore :)

Crea questo file con solo questo contenuto:

$ sudo vi /etc/docker/daemon.json

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

Testato Ubuntu 16.04.2 LTSnella finestra mobile1.12.6


1
L' graphattributo in daemon.json è obsoleto a partire dalla versione 17.05.0, utilizzare data-rootinvece, cfr. stackoverflow.com/a/50217666/743507
dschulten

12

In CentOS 6.5

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

aggiungi la seguente riga

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

quindi salva il file e riavvia la finestra mobile

service docker start

e farà il file repository in /data/docker


6

Per Debian / Ubuntu o Fedora, puoi probabilmente usare le altre risposte. Ma se non hai file sotto /etc/default/dockero /etc/sysconfig/dockere il tuo sistema esegue systemd, potresti voler seguire questa risposta da h3nrik . Sto usando Arch, e questo funziona per me.

Fondamentalmente, è necessario configurare systemd per leggere la nuova posizione dell'immagine della finestra mobile come variabile di ambiente e passare quella variabile di ambiente nello script di esecuzione del demone Docker.

Per completezza, ecco la risposta di h3nrick:


Hai un /lib/systemd/system/docker.servicefile?

In tal caso, modificare in modo che il servizio Docker utilizza il solito /etc/default/dockercome un file di ambiente: EnvironmentFile=-/etc/default/docker.

Nel /etc/default/dockerfile quindi aggiungi DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

Alla fine basta fare un systemctl daemon-reload && systemctl restart docker.

Per ulteriori informazioni, consultare anche la documentazione .


Se segui le attuali istruzioni di installazione della finestra mobile per Debian, otterrai gli script SysVinit ma non vengono utilizzati. Vedi github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside,

4

Una soluzione molto più semplice è quella di creare un punto di collegamento morbido a qualsiasi cosa tu voglia, come ad esempio

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

Funziona per me sul mio server CentOS 6.5.


6
Non creare un collegamento software. Le ragioni vedono il mio commento che ho postato prima ... Potresti avere problemi con i comandi 'docker rm'!
Suther,

2
@suther: maggio? C'è una situazione in cui ti trovi nei guai o no? Maggio è un po 'impreciso per la documentazione tecnica, se incappo in un problema, voglio sapere quando succede esattamente, come è causato quel problema e come sarebbe il risultato.
Hacre,

4

Come raccomandato da @mbarthelemy questo può essere fatto tramite l' -gopzione quando si avvia direttamente il daemon docker.

Tuttavia, se la finestra mobile viene avviata come servizio di sistema, non è consigliabile modificare il /etc/default/dockerfile. C'è una linea guida per questo situato qui .

L'approccio corretto è quello di creare un /etc/docker/daemon.jsonfile su sistemi Linux (o Mac) o %programdata%\docker\config\daemon.jsonsu Windows. Se questo file non viene utilizzato per nient'altro, dovrebbero essere sufficienti i seguenti campi:

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

Ciò presuppone che la nuova posizione in cui si desidera che la finestra mobile permetta di conservare i suoi dati /docker/daemon_files


2

Su 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"

Nota che DOCKER_OPTS era inizialmente vuoto e tutto ciò che ho fatto è stato aggiungere l'argomento per fare in modo che la finestra mobile utilizzi la mia nuova directory


2

Su Fedora 26 e probabilmente su molte altre versioni, potresti riscontrare un errore dopo aver spostato la posizione della cartella di base come descritto sopra. Ciò è particolarmente vero se lo stai spostando da qualche parte sotto / home. Questo perché SeLinux entra in funzione e impedisce al contenitore docker di eseguire molti dei suoi programmi da questa posizione.

La soluzione breve è rimuovere l'opzione --enable-selinux quando si aggiunge il parametro -g.


Quella stanza aperta per gli attacchi non sarebbe?
yuriploc,

1

Su un server AWS Ubuntu 16.04 ho inserito le immagini Docker su un EBS separato, montato su / home / ubuntu / kaggle /, sotto la directory docker

Questo frammento del mio script di inizializzazione ha funzionato correttamente

# 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

Per gli utenti Mac nella versione 17.06.0-ce-mac19 puoi semplicemente spostare la posizione dell'immagine disco dall'interfaccia utente nell'opzione preferenze Basta cambiare la posizione dell'immagine disco e funzionerà (facendo clic su Sposta immagine disco ) e riavviando la finestra mobile. Utilizzando questo approccio sono stato in grado di utilizzare il mio hardisk esterno per la memorizzazione di immagini docker.


che ne dici dei file esistenti di docker? dovremmo spostarlo manualmente?
Gustav il

Puoi provare a reinstallare la finestra mobile in un percorso di tua preferenza. I file immagine e docker sono indipendenti.
Sahu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.