Comment changer le répertoire d'installation de l'image docker?

183

D'après ce que je peux dire, les images docker sont installées au /var/lib/dockerfur et à mesure qu'elles sont extraites. Existe-t-il un moyen de changer cet emplacement, comme un volume monté comme /mnt?

Michael Barton
la source
3
sur quel système d'exploitation fonctionne votre docker?
Thomasleveil

Réponses:

135

Avec les versions récentes de Docker, vous définiriez la valeur du data-rootparamètre sur votre chemin personnalisé, dans /etc/docker/daemon.json (selon https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-configuration-file ).

Avec les anciennes versions, vous pouvez modifier le répertoire de base de stockage de Docker (où le conteneur et les images vont) à l'aide de l' -goption lors du démarrage du démon Docker. (vérifier docker --help). Vous pouvez appliquer ce paramètre automatiquement au démarrage de Docker en l'ajoutant à / etc / default / docker

mbarthelemy
la source
4
Je pense que la meilleure solution est d'ajouter cette -goption à / etc / defaults / docker au lieu de modifier le fichier Upstart, voir ma réponse.
mbarthelemy
9
Oui, changer cette ligne enDOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
mbarthelemy
6
Ne fonctionne pas dans Fedora. Voir ma réponse si votre distribution est Fedora
Vitor
3
Vous devrez peut-être implémenter cette solution à un bogue dans certaines versions de Debian ou d'Ubuntu si docker ignore votre /etc/default/dockerfichier.
nedim le
4
L' graphattribut dans daemon.json est obsolète à partir de la version 17.05.0, utilisez à la data-rootplace, cf. stackoverflow.com/a/50217666/743507
dschulten
141

Suite aux conseils des commentaires, j'utilise la documentation Docker systemd pour améliorer cette réponse. La procédure ci-dessous ne nécessite pas de redémarrage et est beaucoup plus propre.

Créez d'abord un répertoire et un fichier pour une configuration personnalisée:

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

Pour la version docker antérieure à la pâte 17.06-ce :

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

Pour docker après pâte 17.06-ce :

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

Méthode alternative par daemon.json

J'ai récemment essayé la procédure ci-dessus avec 17.09-ce sur Fedora 25 et cela semble ne pas fonctionner. Au lieu de cette simple modification, /etc/docker/daemon.jsonfaites l'affaire:

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

Malgré la méthode, vous devez recharger la configuration et redémarrer Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

Pour confirmer que Docker a été reconfiguré:

docker info|grep "loop file"

Dans la version récente (17.03), une commande différente est requise:

docker info|grep "Docker Root Dir"

La sortie devrait ressembler à ceci:

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

Ou:

 Docker Root Dir: /mnt

Ensuite, vous pouvez supprimer en toute sécurité l'ancien stockage Docker:

rm -rf /var/lib/docker
Piotr Król
la source
8
C'est la seule méthode qui m'a aidé sur Ubuntu 16.04!
Vadim
1
Ce lien docs.docker.com/engine/admin/systemd explique comment configurer Docker avec systemd, qui fonctionne pour les nouvelles distributions Linux telles que Ubuntu 16.04.
Joseph Hui
6
La docker infodéclaration est probablement dépassée. Sur Ubuntu 16.04, la vérification de la reconfiguration est sudo docker info | grep "Docker Root Dir". Sinon, bonne réponse, devrait être celle acceptée;)
Guillaume Perrot
5
Dans la nouvelle version de Linux (4.10) et Docker (docker-ce 17.06), la ligne doit être modifiée comme suit: / usr / bin / dockerd -H fd: // --data-root = "/ mnt"
lorenzo-bettini
2
Si vous voyez Docker Root Dir: /"/mnt"lorsque vous exécutez docker info|grep "Docker Root Dir", vous devez remplacer --data-root="/mnt"à l' --data-root=/mntintérieur du fichierdocker-storage.conf
Ser
62

Pour les nouvelles versions de Docker, nous devons utiliser data-roottel graphquel dans la version 17.05.0: documents officiels obsolètes

Modifiez /etc/docker/daemon.json(s'il n'existe pas, créez-le) et incluez:

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

Ensuite, redémarrez Docker avec:

sudo systemctl daemon-reload
sudo systemctl restart docker
  • Une explication plus détaillée étape par étape (y compris le déplacement de données) à l'aide de Docker Storage avec data-root peut être trouvée dans: Article de blog
  • Dans le cas de Windows, un poste similaire spécifique à Windows
andreas-supersmart
la source
votre commentaire m'a aidé à trouver cette page: adriel.co.nz/blog/2018/01/25/… merci!
nasatome
8
Je pense qu'il est temps de donner à cette réponse le drapeau "accepté", car cela fonctionne dans la version actuelle.
The Bndr
Je commente ici pour que les gens sachent quelle version pourrait l'utiliser, après la version github.com/docker/docker.github.io/pull/5978 , cela change le site Web officiel.
zhongjiajie
Cela a fonctionné pour moi aussi, merci :)
Aashay Amballi
39

Comme je n'ai pas trouvé les instructions correctes pour faire cela dans Fedora (EDIT: les gens ont souligné dans les commentaires que cela devrait également fonctionner sur CentOS et Suse) (/ etc / default / docker n'est pas utilisé ici), j'ajoute mon répondez ici:

Vous devez éditer / etc / sysconfig / docker et ajouter l'option -g dans la variable OPTIONS. S'il y a plus d'une option, assurez-vous de les mettre entre "". Dans mon cas, ce fichier contenait:

OPTIONS=--selinux-enabled

donc ça deviendrait

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

Après un redémarrage ( systemctl restart docker), Docker doit utiliser le nouveau répertoire

Vitor
la source
Sur CentOS 6.5 / 6.6 et probablement 7, vous utilisez le même fichier / etc / sysconfig / docker, mais vous ajoutez les arguments au nom de variable other_args.
dlaidlaw
L'option s'appelle DOCKER_OPTS maintenant (docker version 1.7.0).
nedim le
6
À partir de la version 1.8 de Docker, l'utilisation des fichiers de configuration Docker dans / etc / sysconfig est obsolète. Au lieu de cela, vous devez utiliser les fichiers de configuration drop-in systemd dans etc / systemd / system / docker.service.d. Après avoir ajouté ou modifié un fichier de dépôt pendant que le service docker est en cours d'exécution, exécutez la commande systemctl daemon-reload pour indiquer à systemd de recharger la configuration du service. docs.oracle.com/cd/E52668_01/E54669/html/…
Pablo Marin-Garcia
et utilisez les fichiers de dépôt docs.docker.com/engine/articles/systemd/…
Pablo Marin-Garcia
23

N'utilisez pas de lien symbolique pour déplacer le dossier Docker vers / mnt (par exemple). Cela peut entraîner des problèmes avec la commande docker rm .

Mieux vaut utiliser l'option -g pour docker. Sur Ubuntu, vous pouvez le définir de manière permanente dans /etc/default/docker.io. Améliorez ou remplacez la ligne DOCKER_OPTS.

Voici un exemple: `DOCKER_OPTS =" - g / mnt / quelque part / autre / docker / "

Suther
la source
dans mon cas, j'ai dû redémarrer
psychok7
1
À quel type de problème dois-je m'attendre docker rmlors de l'utilisation d'un lien symbolique?
bjhend le
1
J'ai également dû le faire dans Ubuntu 16.04 stackoverflow.com/a/30219552/977622 pour le faire fonctionner
psychok7
21

Un moyen beaucoup plus simple de le faire:

Arrêter le service docker

sudo systemctl stop docker

Déplacer le répertoire Docker existant vers un nouvel emplacement

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

Créer un lien symbolique

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

Démarrer le service docker

sudo systemctl start docker
fnjn
la source
2
C'est IMO la solution la plus juste et la plus simple - a fonctionné pour moi.
Martin Dvorak
2
a fonctionné comme un charme pour moi mais sans la barre oblique de fin pour la commande de lien symbolique:sudo ln -s /path/to/new/docker/ /var/lib/docker
damio
Voici ce que suggèrent les forums docker: forums.docker.com/t
...
C'est une solution formidable qui m'a sauvé la vie. :)
Niketh Sudhakaran
J'ai exécuté ci-dessus et le docker était opérationnel. Mais je ne trouve pas que mes images docker existent déjà. Aucune suggestion?
Thilina Viraj
13

Cette solution fonctionne sur Red Hat 7.2 et Docker 1.12.0

Modifiez le fichier /lib/systemd/system/docker.service dans votre éditeur de texte.

ajoutez -g / chemin / vers / docker / à la fin de la directive ExecStart . La ligne complète devrait ressembler à ceci.

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

Exécutez la commande ci-dessous

systemctl daemon-reload
systemctl restart docker

Exécutez la commande pour vérifier le répertoire docker

docker info | grep "loop file\|Dir"

Si vous avez le fichier / etc / sysconfig / docker dans Red Hat ou docker 1.7.1, cochez cette réponse.

Sudeepta
la source
mon cas: centos7, dernier docker; J'ai dû appeler "systemctl status docker" pour trouver le fichier "docker.service" et j'ai ajouté l'option "-g" comme dans la réponse. Merci
datdinhquoc
13

Copiez et collez la version de la réponse gagnante :)

Créez ce fichier avec uniquement ce contenu:

$ sudo vi /etc/docker/daemon.json

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

Testé Ubuntu 16.04.2 LTSdans docker1.12.6

Topera
la source
1
L' graphattribut dans daemon.json est obsolète à partir de la version 17.05.0, utilisez à la data-rootplace, cf. stackoverflow.com/a/50217666/743507
dschulten
12

Dans CentOS 6.5

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

ajouter la ligne suivante

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

puis enregistrez le fichier et redémarrez le docker

service docker start

et créera un fichier de référentiel dans /data/docker

sean kim
la source
6

Pour Debian / Ubuntu ou Fedora, vous pouvez probablement utiliser les autres réponses. Mais si vous n'avez pas de fichiers sous /etc/default/dockerou /etc/sysconfig/dockeret que votre système exécute systemd, vous pouvez suivre cette réponse de h3nrik . J'utilise Arch et cela fonctionne pour moi.

Fondamentalement, vous devez configurer systemd pour lire le nouvel emplacement de l'image Docker en tant que variable d'environnement et transmettre cette variable d'environnement dans le script d'exécution du démon Docker.

Pour être complet, voici la réponse de h3nrick:


As tu un /lib/systemd/system/docker.service dossier?

Si tel est le cas, modifiez-le pour que le service Docker utilise l'habituel /etc/default/dockercomme fichier d'environnement:EnvironmentFile=-/etc/default/docker .

Dans le /etc/default/dockerfichier puis ajoutez DOCKER_OPTS="-g /home/rseixas/Programs/Docker/images".

À la fin, faites simplement un systemctl daemon-reload && systemctl restart docker.

Pour plus d'informations, veuillez également consulter la documentation .

modulitos
la source
Si vous suivez les instructions d'installation actuelles du docker pour Debian, vous obtenez des scripts SysVinit mais ils ne sont pas utilisés. Voir github.com/docker/docker/issues/9889#issuecomment-109766580
Simon Woodside
4

Une solution beaucoup plus simple consiste à créer un point de lien souple vers ce que vous voulez, tel que

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

Cela fonctionne pour moi sur mon serveur CentOS 6.5.

liuyanghejerry
la source
6
Ne créez pas de lien souple. Raisons voir mon commentaire que j'ai posté avant ... Vous pouvez avoir des problèmes avec les commandes 'docker rm'!
suther
2
@suther: Mai? Y a-t-il maintenant une situation dans laquelle vous rencontrez des problèmes ou non? May est un peu imprécis pour la documentation technique, si je rencontre un problème, je veux savoir quand exactement cela se produit, comment ce problème est causé et comment le résultat serait.
hakre
4

Comme recommandé par @mbarthelemy, cela peut être fait via l' -goption lors du démarrage direct du démon docker.

Cependant, si docker est démarré en tant que service système, il n'est pas recommandé de modifier le /etc/default/dockerfichier. Il y a une directive à ce sujet située ici .

La bonne approche consiste à créer un /etc/docker/daemon.jsonfichier sur les systèmes Linux (ou Mac) ou %programdata%\docker\config\daemon.jsonsous Windows. Si ce fichier n'est utilisé pour rien d'autre, les champs suivants devraient suffire:

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

Cela suppose que le nouvel emplacement où vous souhaitez que docker conserve ses données est /docker/daemon_files

Ivandov
la source
2

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

Notez que DOCKER_OPTS était initialement vide et tout ce que j'ai fait a été d'ajouter l'argument pour que docker utilise mon nouveau répertoire

Mahlatse Makalancheche
la source
2

Sur Fedora 26 et probablement de nombreuses autres versions, vous pouvez rencontrer une erreur après avoir déplacé l'emplacement de votre dossier de base comme décrit ci-dessus. Cela est particulièrement vrai si vous le déplacez quelque part sous / home. En effet, SeLinux entre en action et empêche le conteneur docker d'exécuter plusieurs de ses programmes à partir de cet emplacement.

La solution courte consiste à supprimer l'option --enable-selinux lorsque vous ajoutez le paramètre -g.

Euan
la source
Cela ne ferait-il pas de la place aux attaques?
yuriploc
1

Sur un serveur AWS Ubuntu 16.04, j'ai placé les images Docker sur un EBS séparé, monté sur / home / ubuntu / kaggle /, sous le répertoire docker

Cet extrait de mon script d'initialisation a fonctionné correctement

# 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
la source
0

Pour les utilisateurs de Mac dans la version 17.06.0-ce-mac19, vous pouvez simplement déplacer l'emplacement de l'image du disque de l'interface utilisateur dans l'option de préférences Changez simplement l'emplacement de l'image du disque et cela fonctionnera (en cliquant sur Déplacer l'image du disque ) et en redémarrant le docker. En utilisant cette approche, j'ai pu utiliser mon disque dur externe pour stocker des images de docker.

sahu
la source
que diriez-vous des fichiers existants de docker? devrions-nous le déplacer manuellement?
gustav
Vous pouvez essayer de réinstaller le docker à l'emplacement de votre choix. Les fichiers image et docker sont indépendants.
sahu