docker-compose créera par défaut un réseau virtuel où tous les conteneurs/services du fichier de composition peuvent s'atteindre par une adresse IP. En utilisant des links
, depends_on
ou des alias de réseau, ils peuvent se contacter par nom d'hôte. Dans votre cas, le nom d'hôte est le nom du service, mais cela peut être remplacé. (voir :docs
)
Votre script dans my_common_package
le conteneur/service doit alors se connecter à mysql
sur le port 3306
selon votre configuration. (pas localhost
sur le port 3306
)
Notez également que l'utilisation de expose
n'est nécessaire que si le Dockerfile du service n'a pas de EXPOSE
déclaration. L'image mysql standard le fait déjà.
Si vous souhaitez mapper un port de conteneur sur localhost
vous devez utiliser les ports
, mais ne le faites que si c'est nécessaire.
services:
mysql:
image: mysql:5.6
container_name: test_mysql_container
environment:
- MYSQL_ROOT_PASSWORD=test
- MYSQL_DATABASE=My_Database
- MYSQL_USER=my_user
- MYSQL_PASSWORD=my_password
volumes:
- db_data:/var/lib/mysql
ports:
- "3306:3306"
Ici, nous disons que le port 3306 dans le conteneur mysql doit être mappé sur localhost sur le port 3306.
Vous pouvez maintenant vous connecter à mysql en utilisant localhost:3306
en dehors du menu fixe. Par exemple, vous pouvez essayer d'exécuter votre testsql.py
localement (PAS dans un conteneur).
La communication de conteneur à conteneur se fera toujours en utilisant le nom d'hôte de chaque conteneur. Considérez les conteneurs comme des machines virtuelles.
Vous pouvez même trouver le réseau docker-compose créé à l'aide de docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. puis utilisez docker network inspect <id>
pour regarder les détails.
Les adresses IP attribuées aux conteneurs peuvent être assez aléatoires, donc le seul moyen viable pour la communication de conteneur à conteneur est d'utiliser des noms d'hôte.