docker-compose zal standaard een virtueel netwerk creëren waar alle containers/services in het samenstellingsbestand elkaar kunnen bereiken via een IP-adres. Door gebruik te maken van links
, depends_on
of netwerkaliassen kunnen ze elkaar via de hostnaam bereiken. In uw geval is de hostnaam de servicenaam, maar deze kan worden overschreven. (zie:docs
)
Uw script in my_common_package
container/service moet dan verbinding maken met mysql
op poort 3306
volgens uw opstelling. (niet localhost
op poort 3306
)
Merk ook op dat het gebruik van expose
is alleen nodig als de Dockerfile voor de service geen EXPOSE
. heeft uitspraak. De standaard mysql-afbeelding doet dit al.
Als u een containerhaven wilt toewijzen aan localhost
je moet ports
gebruiken , maar doe dit alleen als het nodig is.
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"
Hier zeggen we dat poort 3306 in de mysql-container moet worden toegewezen aan localhost op poort 3306.
Nu kunt u verbinding maken met mysql met behulp van localhost:3306
buiten dokwerker. U kunt bijvoorbeeld proberen uw testsql.py
. uit te voeren lokaal (NIET in een container).
Container-naar-container-communicatie zal altijd plaatsvinden met behulp van de hostnaam van elke container. Zie containers als virtuele machines.
U kunt zelfs de netwerk-docker-compose vinden die is gemaakt met behulp van docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. gebruik dan docker network inspect <id>
om de details te bekijken.
Toegewezen IP-adressen aan containers kunnen vrij willekeurig zijn, dus de enige haalbare manier voor communicatie van container naar container is het gebruik van hostnamen.