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!
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:
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é)
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
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.
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é
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
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.