web-dev-qa-db-fra.com

Comment démarrer le conteneur Docker en tant que serveur

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?

21
Jeroen

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.

21
Ben Whaley

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.

  1. SSH

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.

  1. docker attach

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.

  1. pratiques recommandées par docker (nsenter et etc)

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.

  1. ligne de commande bash

Le cloud "docker exec -it {container id} bash" est un outil très pratique et pratique pour accéder à la machine.

  1. Quelques notions de base

    • "docker run" crée un nouveau conteneur afin que les modifications précédentes ne soient pas enregistrées.
    • "docker start" démarrera un conteneur existant de sorte que les modifications précédentes seront toujours dans le conteneur, mais vous devez trouver l'ID de conteneur correct parmi plusieurs avec un même ID d'image. Besoin de "docker commit" pour supprimer les versions si vous le souhaitez.
    • Ctrl-C arrêtera le conteneur en quittant. Vous voudrez ajouter "&" à la fin pour que le conteneur puisse s'exécuter en arrière-plan et vous donne l'invite lorsque vous appuyez sur la touche Entrée.
8
Michael Kim

À 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:

  1. docker exec -it <container_id> /bin/bash

Ou

  1. exécutez le démon ssh dans le conteneur, mappez le port ssh puis ssh vers le conteneur.
4
Guruprasad GV