Comment puis-je exécuter un système d'exploitation complet dans un conteneur Docker, sans spécifier de commande?

25

Je suis la documentation CoreOS Docker et elle mentionne le démarrage des conteneurs avec des commandes comme:

docker run someImageName /bin/somebinary

someImageNameest une image. Lorsque / bin / somebinary se ferme, l'image ne sera plus en cours d'exécution.

Je voudrais simplement exécuter une image, sans spécifier de binaires à exécuter. Au lieu de cela, je veux simplement exécuter les services (par exemple, systemd / sysvinit) qui sont normalement exécutés dans le système d'exploitation des images .

Cela semble être la chose la plus courante que quiconque voudrait faire avec Docker, mais essayer d'exécuter une image sans commande renvoie:

2014/02/05 14:49:19 Error: create: No command specified

Comment puis-je démarrer un conteneur Docker et exécuter un système d'exploitation complet, plutôt que de spécifier une commande ?

mikemaccana
la source
Ceci est un double de cette question stackoverflow.com/questions/19332662/…
Fred le chien Magic Wonder
@FredtheMagicWonderDog Pas tout à fait, bien que la réponse soit la même.
mikemaccana

Réponses:

24

Comme indiqué ici, vous exécutez simplement /sbin/initla commande comme tout autre démarrage unix du mode mono-utilisateur au mode multi-utilisateurs.

/programming/19332662/start-full-container-in-docker

Les conteneurs peuvent être des OS à part entière, ils n'ont tout simplement pas à l'être (pas plus que les VM d'ailleurs, c'est juste plus compliqué à configurer et à gérer).

Je dirais que le but de Docker est de rendre les conteneurs d'applications faciles, afin que vous n'ayez qu'à configurer une application, pas tout le système d'exploitation.

Fred le chien magique
la source
Merci. Après avoir démarré l'image avec / sbin / init, j'ai couru docker ps -notrunc, pour obtenir l'ID du conteneur, puis sudo /usr/sbin/lxc-attach -n containerIDpour accéder à l'image en cours d'exécution. Comme le mentionne l'autre affiche, je n'ai pas vraiment besoin d'un deuxième init, donc je vais vérifier les conteneurs à commande unique ensuite ...
mikemaccana
Dire que vous n'avez pas besoin d'exécuter un système d'exploitation complet dans une machine virtuelle, c'est comme dire que vous n'avez pas besoin d'exécuter un système d'exploitation complet dans une machine physique, oui c'est vrai que le noyau est fondamentalement juste un x86 / C normal programme qui s'exécute sans le stdlib et init ainsi, mais c'est
Lie Ryan
11

Docker est un système de gestion et de déploiement de conteneurs d' applications , pas de conteneurs de système d'exploitation . Il semble que vous confondiez l'exécution d'un conteneur Docker avec le démarrage d'un système d'exploitation.

Vos conteneurs Docker doivent être des applications à usage unique à portée très étroite pouvant être démarrées avec une seule commande. Si vous recherchez quelque chose de plus complexe que cela, Docker n'est pas la solution que vous recherchez. Dans ce cas, consultez KVM, ESXi, OpenVZ, LXD etc.

Si vous cherchez simplement comment spécifier une valeur par défaut CMDet ENTRYPOINTpour vos conteneurs, vous pouvez le faire au moment de la construction à l' aide d'un Dockerfile.

EEAA
la source
5
Je sais ce qu'est Docker. Je soulignerai que les conteneurs d'applications sont basés sur des systèmes d'exploitation, par exemple Fedora ou Ubuntu. Les applications persistantes sous Unix - même dans l'espace utilisateur uniquement Unix comme les conteneurs Docker - sont démarrées à partir des fichiers d'initscripts ou des fichiers d'unité systemd. Par exemple, si mon application se bloque, je voudrais qu'elle redémarre automatiquement, avec un systemd de type seuil fourni.
mikemaccana
5
Vous essayez de trop entasser vos conteneurs - ce n'est pas un système d'exploitation. La supervision du processus doit être effectuée à l'extérieur de chaque conteneur.
EEAA
1
Donc, si un processus se termine ... redémarrez tout le conteneur? Je suppose que ce n'est pas si cher, donc ça pourrait être OK. Cela semble un peu bizarre - mon conteneur a un / sbin / init, mais il ne s'utilise jamais ...
mikemaccana
1
Oui, c'est l'idée. Votre conteneur en possède un /sbin/init, mais il ne doit pas nécessairement l' avoir. Vous avez probablement utilisé un conteneur ubuntu par défaut ou quelque chose comme ça. Il y a beaucoup de morceaux dans ces conteneurs qui peuvent être retirés si vous le souhaitez.
EEAA
1
@ValkoSipuli Vous êtes certainement libre d'avoir cette opinion. Je maintiens toujours que l'exécution de plusieurs processus à l'intérieur d'un conteneur annule en grande partie la raison d'utiliser des conteneurs en premier lieu. Existe-t-il un emplacement pour exécuter un système d'exploitation à l'intérieur d'un conteneur? Probablement. C'est une exception, cependant, et ne devrait pas se faire sans trop de délibérations sur les avantages / inconvénients.
EEAA
5

Pour exécuter un système d'exploitation complet dans un conteneur, créez le Dockerfile suivant:

FROM fedora:25

CMD /sbin/init

Ensuite, créez et démarrez le conteneur et entrez un shell à l'intérieur pour explorer les services qui y sont exécutés:

docker build -t os .
docker run -d --privileged --name os os
docker exec -it os bash

Services systemd complets à l'intérieur du conteneur. Beau.

Markus Hallmann
la source
0
docker pull ubuntu

Exécutez simplement la même image autant de fois que nécessaire. De nouveaux conteneurs seront créés et ils pourront ensuite être démarrés et arrêtés chacun enregistrant sa propre configuration. Pour votre commodité, il serait préférable de donner à chacun de vos conteneurs un nom avec "--name".

Fi:

docker run --name MyContainer1 <ubuntu image>
docker run --name MyContainer2 <ubuntu image>
docker run --name MyContainer3 <ubuntu image>

C'est ça.

$ docker ps
CONTAINER ID        IMAGE            CREATED          STATUS               NAMES
a7e789711e62        67759a80360c   12 hours ago     Up 2 minutes         MyContainer1
87ae9c5c3f84        67759a80360c   12 hours ago     Up About a minute    MyContainer2
c1524520d864        67759a80360c   12 hours ago     Up About a minute    MyContainer3

Après cela, vous avez créé vos conteneurs pour toujours et vous pouvez les démarrer et les arrêter comme des machines virtuelles.

docker start MyContainer1

Pour entrer dans le conteneur et faire ce que vous voulez faire:

docker exec -it MyContainer1 bash
DimiDak
la source