J'utilise un conteneur Docker pour créer et déployer mon logiciel dans une collection d'ec2. Dans le script de déploiement, je crée mon logiciel, puis je le conditionne dans une image docker. L'image est poussée dans mon registre privé, tirée par mes ec2 de production, puis exécutée. Donc, essentiellement, je devrai exécuter Docker dans un conteneur Docker.
Le problème est que je ne peux pas réellement démarrer docker sur mon conteneur. Si j'essaye
service docker start
Je reçois
bash: service: command not found
Et si j'essaye
docker -d
Je reçois
2014/10/07 15:54:35 docker daemon: 0.11.1-dev 02d20af/0.11.1; execdriver: native; graphdriver:
[e2feb6f9] +job serveapi(unix:///var/run/docker.sock)
[e2feb6f9] +job initserver()
[e2feb6f9.initserver()] Creating server
2014/10/07 15:54:35 Listening for HTTP on unix (/var/run/docker.sock)
[error] attach_loopback.go:42 There are no more loopback device available.
loopback mounting failed
[e2feb6f9] -job initserver() = ERR (1)
2014/10/07 15:54:35 loopback mounting failed
La commande de service n'existe pas sur le conteneur Docker, je ne peux donc pas démarrer Docker. Je ne suis pas sûr de ce que je dois faire maintenant pour démarrer Docker, donc je suis un peu coincé ici, toute aide est appréciée.
Un peu plus d'informations
La machine hôte exécute Fedora 20 (exécutera éventuellement Amazon Linux sur un ec2)
Le conteneur Docker exécute centos 7.0
L'hôte exécute Docker version 1.2.0, build fa7b24f/1.2.0
Le conteneur exécute docker-0.11.1-22.el7.centos.x86_64
Que diriez-vous de ne pas exécuter 'docker inside docker' et d'exécuter docker sur votre hôte, mais à partir de votre conteneur docker? Montez simplement votre docker.sock et docker binaire:
docker run -v /var/run/docker.sock:/run/docker.sock -v $(which docker):/bin/docker [your image]
https://github.com/sameersbn/docker-gitlab utilise cette approche pour faire tourner les conteneurs docker, jetez un œil à cette image.
Vous pouvez également consulter: https://registry.hub.docker.com/u/mattgruter/doubledocker/
MISE À JOUR en juillet 2016
L'approche la plus courante consiste à utiliser docker:dind
image, comme décrit ici: https://hub.docker.com/_/docker/
Court résumé:
$ docker run --privileged --name some-docker -d docker:dind
puis: $ docker run --rm --link some-docker:docker docker info
Alors que dans presque tous les cas, je suggère de suivre la réponse de @ cthulhu et de ne pas exécuter "docker in docker", dans les cas où vous devez (par exemple, une suite de tests qui teste contre plusieurs versions de docker), utilisez ce qui suit pour créer des périphériques de bouclage supplémentaires:
#!/bin/bash
for i in {0..6}
do
mknod -m0660 /dev/loop$i b 7 $i
done
(Tiré du fil pour Docker Issue # 7058 )
Vous pouvez simplement exécuter docker dans le conteneur docker en utilisant dind
. Essayez cette image de Jérôme, comme suit:
docker run --privileged -t -i jpetazzo/dind
Consultez cette page pour plus de détails:
https://github.com/jpetazzo/dind