Je voudrais exécuter un conteneur Docker qui héberge une simple application Web, mais je ne comprends pas comment concevoir/exécuter l'image en tant que serveur. Par exemple:
docker run -d -p 80:80 ubuntu:14.04 /bin/bash
Cela démarrera et arrêtera immédiatement le conteneur. Au lieu de cela, nous pouvons le démarrer de manière interactive:
docker run -i -p 80:80 ubuntu:14.04 /bin/bash
Cela fonctionne, mais maintenant je dois garder le shell interactif ouvert pour chaque conteneur en cours d'exécution? Je préfère simplement le démarrer et le faire fonctionner en arrière-plan. Un hack utiliserait une commande qui ne retourne jamais:
docker run -d -p 80:80 {image} tail -F /var/log/kern.log
Mais maintenant, je ne peux plus me connecter au Shell, pour inspecter ce qui se passe si l'application fonctionne.
Existe-t-il un moyen de démarrer le conteneur en arrière-plan (comme nous le ferions pour un VM), d'une manière qui permet d'attacher/de détacher un Shell de l'hôte? Ou est-ce que je manque complètement le point?
Le dernier argument de docker run
est la commande à exécuter dans le conteneur. Lorsque vous exécutez docker run -d -p 80:80 ubuntu:14.04 /bin/bash
, vous exécutez bash
dans le conteneur et rien de plus. Vous voulez réellement exécuter votre application Web dans un conteneur et garder ce conteneur en vie, vous devez donc faire docker run -d -p 80:80 ubuntu:14.04 /path/to/yourapp
.
Mais votre application dépend probablement d'une configuration pour fonctionner. S'il lit sa configuration à partir de variables d'environnement, vous pouvez utiliser le -e key=value
arguments avec docker run
. Si votre application a besoin d'un fichier de configuration pour être en place, vous devriez probablement utiliser un Dockerfile
pour installer la configuration en premier.
Cet article fournit un bel exemple complet d'exécution d'une application de noeud dans un conteneur.
Les utilisateurs de docker ont tendance à supposer qu'un conteneur est une machine virtuelle complète, tandis que le concept de conception de docker est plus axé sur une conteneurisation optimale plutôt que d'imiter le VM dans un conteneur).
Les deux sont corrects, mais certains détails de mise en œuvre ne sont pas faciles à connaître au début. J'essaie de résumer certaines des différences de mise en œuvre d'une manière plus facile à comprendre.
SSH serait le moyen le plus simple d'aller à l'intérieur d'un Linux VM (ou conteneur), cependant de nombreux modèles dockerized n'ont pas de serveur ssh installé. Je pense que c'est pour des raisons d'optimisation et de sécurité pour le conteneur.
la fixation Docker peut être pratique si elle est prête à l'emploi. Cependant, au moment de l'écriture, il n'est pas stable - https://github.com/docker/docker/issues/8521 . Peut être associé à la configuration SSH, mais vous ne savez pas quand il est complètement résolu.
Quelques alternatives (ou meilleures pratiques dans un certain sens) recommandées par Docker à https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/
Cette pratique sépare fondamentalement les éléments mutables d'un conteneur et les mappe à certains endroits dans un hôte Docker afin qu'ils puissent être manipulés de l'extérieur du conteneur et/ou persistés. Cela pourrait être une bonne pratique dans un environnement de production, mais pas maintenant lorsque davantage de projets liés aux dockers concernent l'environnement de développement et de transfert.
Le cloud "docker exec -it {container id} bash" est un outil très pratique et pratique pour accéder à la machine.
Quelques notions de base
À la question d'origine, vous pouvez tailler un fichier, comme vous l'avez mentionné, pour maintenir le processus en cours.
Pour atteindre le Shell, au lieu de "joindre", vous avez deux options:
docker exec -it <container_id> /bin/bash
Ou