Dentro un container, localhost indica il container stesso. Su Docker Desktop puoi usare host.docker.internal per raggiungere un servizio sul computer host. Con Docker Engine su Linux, quando supportato dalla versione e dalla rete usate, aggiungi esplicitamente il mapping in Compose:
services:
app:
image: mia-app:locale
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
DB_HOST: host.docker.internalÈ un frammento da integrare nel progetto, non un’immagine pronta da scaricare. Non è necessario installare net-tools nel container o estrarre il gateway con grep.
Accesso al database
Il mapping DNS non rende MySQL raggiungibile da solo. Verifica l’interfaccia su cui ascolta, il firewall e l’host ammesso dall’account SQL. Limita l’accesso alla rete necessaria; impostare indiscriminatamente bind-address=0.0.0.0 espone il servizio su tutte le interfacce IPv4. Se entrambi i servizi sono in Compose, usa normalmente il nome del servizio database sulla rete condivisa, senza passare dall’host.
Prova senza modificare l’applicazione
Per un MySQL dell’host già configurato per connessioni TLS da quella rete, prova un client temporaneo. Su Docker Engine Linux:
docker run --rm -it --add-host=host.docker.internal:host-gateway \
mysql:8.4 mysql --protocol=tcp --ssl-mode=REQUIRED \
-h host.docker.internal -u app -pDocker scarica l’immagine se manca e chiede la password. Su Docker Desktop il nome host.docker.internal è già disponibile. Esegui SELECT 1, CURRENT_USER();: devi ricevere 1 e l’account riconosciuto. REQUIRED cifra il collegamento ma non verifica l’identità del server: è un test locale, non il modello TLS per un database remoto di produzione.
Se ottieni Access denied, verifica l’host autorizzato nell’account MySQL, che deve corrispondere alla provenienza vista dal database. Se la connessione va in timeout, controlla bind e firewall. Solo dopo il test imposta DB_HOST nel progetto e usa le stesse credenziali tramite la sua configurazione privata.