web-dev-qa-db-fra.com

Exécuter Docker dans un conteneur Docker?

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

27
Colin Murphy

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

40
cthulhu

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 )

3
lsowen

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

2
Sabin