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?
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
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:
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:
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:
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
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
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/…
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 / "
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
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 :)
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 .
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
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.
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
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.
Réponses:
Avec les versions récentes de Docker, vous définiriez la valeur du
data-root
paramè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'
-g
option lors du démarrage du démon Docker. (vérifierdocker --help
). Vous pouvez appliquer ce paramètre automatiquement au démarrage de Docker en l'ajoutant à / etc / default / dockerla source
-g
option à / etc / defaults / docker au lieu de modifier le fichier Upstart, voir ma réponse.DOCKER_OPTS="-dns 8.8.8.8 -dns 8.8.4.4 -g /mnt"
/etc/default/docker
fichier.graph
attribut dans daemon.json est obsolète à partir de la version 17.05.0, utilisez à ladata-root
place, cf. stackoverflow.com/a/50217666/743507Suite 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:
Pour la version docker antérieure à la pâte 17.06-ce :
Pour docker après pâte 17.06-ce :
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.json
faites l'affaire:Malgré la méthode, vous devez recharger la configuration et redémarrer Docker:
Pour confirmer que Docker a été reconfiguré:
Dans la version récente (17.03), une commande différente est requise:
La sortie devrait ressembler à ceci:
Ou:
Ensuite, vous pouvez supprimer en toute sécurité l'ancien stockage Docker:
la source
docker info
déclaration est probablement dépassée. Sur Ubuntu 16.04, la vérification de la reconfiguration estsudo docker info | grep "Docker Root Dir"
. Sinon, bonne réponse, devrait être celle acceptée;)Docker Root Dir: /"/mnt"
lorsque vous exécutezdocker info|grep "Docker Root Dir"
, vous devez remplacer--data-root="/mnt"
à l'--data-root=/mnt
intérieur du fichierdocker-storage.conf
Pour les nouvelles versions de Docker, nous devons utiliser
data-root
telgraph
quel dans la version 17.05.0: documents officiels obsolètesModifiez
/etc/docker/daemon.json
(s'il n'existe pas, créez-le) et incluez:Ensuite, redémarrez Docker avec:
la source
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:
donc ça deviendrait
Après un redémarrage (
systemctl restart docker
), Docker doit utiliser le nouveau répertoirela source
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 / "
la source
docker rm
lors de l'utilisation d'un lien symbolique?Ubuntu 16.04
stackoverflow.com/a/30219552/977622 pour le faire fonctionnerUn moyen beaucoup plus simple de le faire:
Arrêter le service docker
Déplacer le répertoire Docker existant vers un nouvel emplacement
Créer un lien symbolique
Démarrer le service docker
la source
sudo ln -s /path/to/new/docker/ /var/lib/docker
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.
Exécutez la commande ci-dessous
Exécutez la commande pour vérifier le répertoire docker
Si vous avez le fichier / etc / sysconfig / docker dans Red Hat ou docker 1.7.1, cochez cette réponse.
la source
Copiez et collez la version de la réponse gagnante :)
Créez ce fichier avec uniquement ce contenu:
$ sudo vi /etc/docker/daemon.json
Testé
Ubuntu 16.04.2 LTS
dans docker1.12.6
la source
graph
attribut dans daemon.json est obsolète à partir de la version 17.05.0, utilisez à ladata-root
place, cf. stackoverflow.com/a/50217666/743507Dans CentOS 6.5
ajouter la ligne suivante
puis enregistrez le fichier et redémarrez le docker
et créera un fichier de référentiel dans
/data/docker
la source
Pour Debian / Ubuntu ou Fedora, vous pouvez probablement utiliser les autres réponses. Mais si vous n'avez pas de fichiers sous
/etc/default/docker
ou/etc/sysconfig/docker
et 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/docker
comme fichier d'environnement:EnvironmentFile=-/etc/default/docker
.Dans le
/etc/default/docker
fichier puis ajoutezDOCKER_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 .
la source
Une solution beaucoup plus simple consiste à créer un point de lien souple vers ce que vous voulez, tel que
Cela fonctionne pour moi sur mon serveur CentOS 6.5.
la source
Comme recommandé par @mbarthelemy, cela peut être fait via l'
-g
option 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/docker
fichier. Il y a une directive à ce sujet située ici .La bonne approche consiste à créer un
/etc/docker/daemon.json
fichier sur les systèmes Linux (ou Mac) ou%programdata%\docker\config\daemon.json
sous Windows. Si ce fichier n'est utilisé pour rien d'autre, les champs suivants devraient suffire:Cela suppose que le nouvel emplacement où vous souhaitez que docker conserve ses données est
/docker/daemon_files
la source
Sur openSUSE Leap 42.1
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
la source
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.
la source
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
la source
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.
la source