docker-compose kommer som standard att skapa ett virtuellt nätverk där alla behållare/tjänster i compose-filen kan nå varandra via en IP-adress. Genom att använda links
, depends_on
eller nätverksalias de kan nå varandra med värdnamn. I ditt fall är värdnamnet tjänstens namn, men detta kan åsidosättas. (se:dokument
)
Ditt skript i my_common_package
container/tjänst bör sedan ansluta till mysql
på port 3306
enligt din inställning. (inte localhost
på port 3306
)
Observera också att du använder expose
är bara nödvändigt om Dockerfilen för tjänsten inte har en EXPOSE
påstående. Standard mysql-bilden gör redan detta.
Om du vill mappa en containerport till localhost
du måste använda ports
, men gör bara detta om det är nödvändigt.
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"
Här säger vi att port 3306 i mysql-behållaren ska mappas till localhost på port 3306.
Nu kan du ansluta till mysql med localhost:3306
utanför hamnarbetare. Du kan till exempel försöka köra din testsql.py
lokalt (INTE i en container).
Behållare till behållare kommunikation kommer alltid att ske med värdnamnet för varje behållare. Tänk på behållare som virtuella maskiner.
Du kan till och med hitta nätverket docker-compose skapat med docker network list
:
1b1a54630639 myproject_default bridge local
82498fd930bb bridge bridge local
.. använd sedan docker network inspect <id>
för att titta på detaljerna.
Tilldelade IP-adresser till behållare kan vara ganska slumpmässiga, så det enda gångbara sättet för kommunikation mellan behållare och behållare är att använda värdnamn.