8
votes

Comment exécuter Docker dans Docker sur Heroku?

Pourquoi?
J'essaie de créer une solution à usage général pour exécuter docker-compose sur Heroku. Je souhaite créer une solution de déploiement en un clic grâce à l'utilisation du déploiement Heroku Button. De cette façon, un utilisateur n'a besoin d'aucune connaissance de git, Heroku cli et docker.

Le problème.
Docker et le démon docker ne sont disponibles que lorsque je définis la stack sur container . Il existe des buildpacks qui vous donnent docker et docker-compose CLI, mais sans le démon docker, vous ne pouvez pas exécuter l'image docker. Les buildpacks ne fonctionneront donc pas.
Avec la stack définie sur container je peux utiliser le fichier heroku.yml ( article ). Là, je définis mes processus. (Il remplace Procfile . Si j'ajoute toujours un Procfile à mon projet, il ne fera rien.)
Je peux également y définir un Dockerfile pour créer mon image Dockerfile .
Cependant, lorsque j'exécute l'image docker, l'erreur suivante apparaît:

2019-02-28T15:32:48.462101+00:00 app[worker.1]: Couldn't connect to Docker daemon at http+docker://localhost - is it running?
2019-02-28T15:32:48.462119+00:00 app[worker.1]: 
2019-02-28T15:32:48.462122+00:00 app[worker.1]: If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

Le problème est à l'intérieur du conteneur Docker que le démon Docker n'est pas en cours d'exécution. La solution à cela est de le monter:
docker run -v /var/run/docker.sock:/var/run/docker.sock ...
Et comme vous ne pouvez pas utiliser Procfile je ne peux pas exécuter cette commande. (Voir ci-dessus heroku.yml remplace Procfile .) Et si j'utilisais un buildpack, je pourrais utiliser Procfile mais le démon docker ne fonctionnerait pas .....

J'ai essayé de définir un VOLUME dans le Dockerfile et le problème persiste. De plus, un article heroku dit "Le montage de volume n'est pas pris en charge. Le système de fichiers du dyno est éphémère."

Sur Heroku, il est possible d'exécuter une image docker. Ce à quoi je lutte, c'est d'exécuter un docker dans une image de docker.
L'exécution d'un docker dans une image docker fonctionne bien sur mon VPS en montant /var/run/docker.sock mais cela ne peut pas (?) /var/run/docker.sock fait sur Heroku.

Derniers mots: j'essaie de faire en sorte que cela fonctionne afin que d'autres personnes puissent facilement déployer une solution logicielle même si elles ne sont pas à l'aise avec git, heroku cli et docker.


6 commentaires

Ça fait un an. Je cherche toujours une solution à ce problème.


Avez-vous essayé de vous connecter à votre démon via SSH? Pour des raisons de sécurité, je suppose qu'il n'est pas possible d'accéder au démon docker de Heroku et c'est ce que vous faites localement lorsque vous montez le volume.


Sur un VPS, je peux le faire très bien. Sur Heroku, je ne peux pas. SSHing vers une application de pile Heroku fonctionne mais le démon docker ne fonctionne pas comme indiqué dans la description. SSHing vers un conteneur docker fonctionne probablement (je n'ai pas essayé) mais je ne vois pas comment vous pouvez accéder à l'hôte à partir du conteneur. De plus, lors de l'exécution d'une application de pile, elle est sévèrement limitée (racine non disponible et beaucoup d'autres limitations). Je recherche un conteneur Docker qui exécute son propre démon Docker. Il y avait des travaux à ce sujet dans le passé, mais il semble qu'il ait été interrompu en faveur de la liaison au démon docker de l'hôte.


Ce n'est pas de ce que je peux voir: hub.docker.com/_/docker . Je veux dire, lorsque vous êtes à l'intérieur de votre conteneur déployé sur heroku, êtes-vous sûr que le démon ne fonctionne pas? L'erreur m'indique que vous ne pouvez pas vous connecter au démon en utilisant cette adresse: http+docker://localhost . Encore une fois, pouvez-vous utiliser le tcp: //0.0.0.0: 2375 ou sur le port 2376 ou une adresse personnalisée si elle est activée? Utilisez ceci comme référence: docs.docker.com/engine/reference/commandline/dockerd / ...


J'ai essayé cela aussi et cela ne fonctionnait pas avec le même message d'erreur. J'ai spécifié l'emplacement avec l'env var DOCKER_HOST et essayé différentes URL, y compris celle que vous avez mentionnée. J'ai également essayé /var/run/docker.sock . J'apprécierais vraiment que vous puissiez créer un exemple minimal hello world avec DinD sur Heroku.


Eh bien, après quelques recherches, je pense que ce que vous essayez de réaliser n'est pas possible, du moins sur Heroku. Ils ne vous permettent pas d'exécuter --priviledged container. Et DinD fonctionne comme un charme lorsque vous travaillez localement, mais lorsqu'il est poussé vers Heroku, le dockerd répond que vous avez besoin d'un utilisateur root (ou privilégié) pour démarrer le démon. Vous voudrez peut-être utiliser une image docker sans racine telle que docker: stable-dind- rootless ( hub.docker.com/_/docker ). J'ai joué avec et je n'ai pas trouvé quelque chose qui fonctionnait et je ne peux pas y passer plus de temps. J'espère que vous trouverez quelque chose :)


3 Réponses :


0
votes

Ce que j'ai fait, c'est l'installer dans mon dockerfile comme ceci:

args '--user root -v /var/run/docker.sock:/var/run/docker.sock'

Ensuite, dans la section args pour exécuter le docker, j'ai ajouté ceci:

RUN curl -fsSLO https://get.docker.com/builds/Linux/x86_64/docker-17.04.0-ce.tgz \
  && tar xzvf docker-17.04.0-ce.tgz \
  && mv docker/docker /usr/local/bin \
  && rm -r docker docker-17.04.0-ce.tgz

Pour plus d'explications sur pourquoi cela fonctionne, voir: stackoverflow.com/q/27879713/354577 Cela fonctionne bien pour moi cependant.


1 commentaires

J'en ai parlé dans ma question. Il n'est pas possible de monter /var/run/docker.sock sur Heroku.



0
votes

Je ne pense pas que vous puissiez exécuter un service sur Heroku qui puisse utiliser la commande docker pour démarrer un conteneur docker.

Je souhaite créer une solution de déploiement en un clic grâce à l'utilisation du déploiement Heroku Button.

Je pense que vous pouvez mettre à jour la référence du bouton Deploy sur certains de vos serveurs d'automatisation (ex: une instance que Jenkins est déjà déployée sur Heroku / un autre cloud) pour déclencher le pipeline de déploiement et ne pas laisser les gens interagir avec git / docker, etc.
Mais oui, vous devez faire face à beaucoup de problèmes comme la sécurité, les paramètres. lorsque vous n'utilisez pas de solutions populaires telles que la connexion Jenkins / CircleCI, puis déployez ...


1 commentaires

Vous pouvez déployer des conteneurs docker sur Heroku voir blog.heroku.com/build-docker-images-heroku-yml et devcenter.heroku.com/articles/build-docker-images-heroku-yml Mais au lieu de déployer plusieurs conteneurs docker, je veux pour les regrouper dans un seul conteneur comme dans l'esprit de DinD, Docker dans Docker. Ce serait pour le mieux s'il y avait un conteneur Docker qui exécutait son propre démon Docker.



1
votes

Malheureusement, la réponse à votre question est: pas encore.

Pour des raisons de sécurité, Heroku ne fournit pas aux utilisateurs la possibilité d'exécuter des conteneurs privilégiés car le conteneur pourrait accéder aux capacités de l'hôte. La documentation est assez claire sur vos limitations , par exemple: Pas de conteneur --priviledged et pas d'utilisateur root non plus, pas de VOLUMES et le disque est éphémère.

Après avoir joué avec des images DinD pour votre préoccupation, je suis arrivé à la conclusion qu'essayer d'exécuter Docker dans un conteneur Heroku n'est pas le bon choix et la bonne conception. Je suis sûr que ce que vous essayez de réaliser est proche de ce que Heroku propose aux utilisateurs. Proposer une plate-forme ou une application sur laquelle un non-développeur peut pousser et déployer des applications avec juste un bouton peut être très intéressant de différentes manières. Et cela peut être fait avec une application utilisant leur API Platform. Dans cette situation, une application Web (exécutée sur Heroku) peut ne pas (à ma connaissance) être capable de faire ce que vous voulez. Au lieu de cela, vous devez intégrer dans une application de bureau: git, docker et votre application pour analyser, vérifier, créer et pousser vos applications / composants vers le registre de conteneurs Heroku.

En fin de compte, si vous pensez toujours à quoi vous avez besoin d'une solution DinD, eh bien, votre solution principale pour utiliser un VPS est la seule solution pour le moment. Mais sachez que cela peut ouvrir des failles de sécurité sur votre système et que vous pouvez arriver à offrir quelque chose de similaire à l'offre d'Heroku lorsque vous essayez de limiter ces portes de sécurité.


0 commentaires