web-dev-qa-db-fra.com

Plusieurs conteneurs Docker, même image, configuration différente

Je suis totalement nouveau sur Docker, donc j'apprécie votre patience.

Je cherche un moyen de déployer plusieurs conteneurs avec la même image, mais dois-je transmettre une configuration (fichier) différente à chacun?

En ce moment, je comprends qu'une fois que vous créez une image, c'est ce qui est déployé, mais le problème pour moi est que je ne vois pas l'intérêt de créer plusieurs images de la même application alors que ce n'est que la configuration qui est différente entre les conteneurs.

Si c'est la norme, alors je devrai y faire face cependant s'il y a un autre moyen alors s'il vous plaît, mettez-moi hors de ma misère! :)

Merci!

24
Ant

Je pense que regarder des exemples faciles à comprendre pourrait vous donner la meilleure image.

Ce que vous voulez faire est parfaitement valide, une image doit être tout ce dont vous avez besoin pour exécuter, sans la configuration.

Pour générer la configuration, vous devez soit:


a) supports de volume

utiliser des volumes et monter le fichier lors du démarrage du conteneur docker run -v my.ini:/etc/mysql/my.ini percona (et similaire avec docker-compose). Sachez que vous pouvez répéter cela aussi souvent que vous le souhaitez, alors montez plusieurs configurations dans votre conteneur (donc la version d'exécution de l'image). Vous créerez ces configurations sur l'hôte avant d'exécuter le conteneur et devrez expédier ces fichiers avec le conteneur, ce qui est l'inconvénient de cette approche (portabilité)

b) configuration basée sur le point d'entrée (génération)

La plupart des images de docker avancées fournissent un soi-disant point d'entrée complexe qui consomme les variables ENV que vous passez au démarrage de l'image, pour créer la ou les configurations pour vous, comme https://github.com/docker -library/percona/blob/master/5.7/docker-entrypoint.sh

donc quand vous exécutez cette image, vous pouvez faire docker run -e MYSQL_DATABASE=myapp percona et ceci démarrera percona et créera la base de données percona pour vous. Tout cela est fait par

  1. ajouter le script de point d'entrée ici https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65
  2. n'oubliez pas de copier le script lors de la construction de l'image https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L6
  3. Ensuite, lors du démarrage de l'image, votre variable ENV provoquera ce déclenchement: https://github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91

Bien sûr, vous pouvez faire ce que vous voulez avec ça. Par exemple, cela configure une image de portus générale: https://github.com/EugenMayer/docker-rancher-extra-catalogs/blob/master/templates/registry-slim/11/docker-compose.yml qui a ce point d'entrée https://github.com/EugenMayer/docker-image-portus/blob/master/build/startup.sh

Donc, vous voyez, la stratégie du point d'entrée est très courante et très puissante et je suppose que vous devriez suivre cette voie chaque fois que vous le pouvez.

c) Images dérivées

Peut-être pour "l'exhaustivité", la stratégie de dérivation d'image, donc vous avez votre image de base appelée "myapp" et pour l'installation X vous créez une nouvelle image

from myapp
COPY my.ini /etc/mysql/my.ini
COPY application.yml /var/app/config/application.yml

Et appelez cette image myapp: x - le problème évident avec cela est que vous finissez par avoir beaucoup d'images, de l'autre côté, par rapport à a) c'est beaucoup plus portable.

J'espère que ça t'as aidé

11
Eugen Mayer

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 <same image id>
docker run --name MyContainer2 <same image id>
docker run --name MyContainer3 <same image id>

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
10
DimiDak

Chaque conteneur s'exécute avec la même image RO mais avec une couche de système de fichiers spécifique au conteneur RW. Le résultat est que chaque conteneur peut avoir ses propres fichiers distincts de tous les autres conteneurs.

Vous pouvez transmettre la configuration sur la CLI, en tant que variable d'environnement ou en tant que montage de volume unique. C'est un cas d'utilisation très standard pour Docker.

3
BMitch