Puoi modificare la porta pubblicata di un container senza ricreare il suo database?

Eva Wong è la Technical Writer e smanettatrice residente di ZimaSpace. Una geek da sempre con una passione per homelab e software open-source, si specializza nel tradurre concetti tecnici complessi in guide accessibili e pratiche. Eva crede che l'auto-ospitare debba essere divertente, non intimidatorio. Attraverso i suoi tutorial, dà potere alla comunità di demistificare le configurazioni hardware, dalla costruzione del loro primo NAS al dominio dei container Docker.

Sì, puoi cambiare la porta pubblicata di un container senza ricreare il database, purché il database rimanga sullo stesso spazio di archiviazione persistente verificato.

Su un NAS domestico o su un host Docker, la porta visibile appartiene normalmente al container applicativo temporaneo, mentre record, account e impostazioni risiedono in un volume denominato, in un bind mount o in un servizio database separato. La modifica sicura consiste quindi nel preservare la definizione del deployment e i percorsi persistenti, alterare solo la regola di pubblicazione sul lato host, ricreare il servizio applicativo interessato e verificare quindi ogni proxy, segnalibro, callback, regola firewall e controllo di integrità che faccia ancora riferimento alla porta precedente.

Separa la porta host pubblicata dal listener del container

Prima della modifica, annota la mappatura attuale come due endpoint distinti. In 8080:80, i client si connettono alla porta 8080 sull’host Docker, mentre l’applicazione continua ad ascoltare sulla porta 80 all’interno del container. Cambiare il lato sinistro non modifica automaticamente il processo applicativo né la connessione al database.

Un caso di troubleshooting della community Docker sottolinea che la mappatura dell’host e il listener interno sono separati e che una nuova porta pubblicata non può funzionare quando non c’è nulla in ascolto internamente sulla porta di destinazione.

Controlla le porte pubblicate e i socket in ascolto del container in esecuzione, quindi testa l’endpoint interno dall’interno del container o della relativa rete. Mantieni invariata la porta interna, a meno che non sia necessario spostare l’applicazione stessa. Questo primo test impedisce che una semplice modifica della porta host si trasformi in una riconfigurazione applicativa non necessaria.

Proteggi il percorso del database attuale prima di ricreare il servizio

Annota il file Compose, il tag o il digest dell’immagine, i file di ambiente, i volumi denominati, i bind mount, i nomi delle reti, i secret e il nome host del database. L’obiettivo è dimostrare quale oggetto possiede lo stato persistente prima che Docker sostituisca il container applicativo.

La modifica della pubblicazione della porta richiede una nuova configurazione del container, ma non richiede la creazione di una nuova immagine né di un nuovo database. Una risposta pratica di Docker distingue la ricreazione del container dalla ricostruzione dell’immagine applicativa quando cambiano le impostazioni delle porte.

Esegui un backup o uno snapshot coerente con l’applicazione del database, se il servizio è importante, quindi verifica che il percorso del database non si trovi nel layer scrivibile del container. Interrompi la procedura se l’elenco dei mount non è chiaro, se il nome del volume è cambiato o se l’applicazione attuale sembra utilizzare un database vuoto inatteso.

Modifica solo la mappatura sul lato host e ricrea il servizio applicativo

Modifica il servizio applicativo passando da una mappatura come 8080:80 a 8081:80. Mantieni invariati l’immagine, la porta interna, i volumi, l’URL del database, il nome del servizio, le reti e la mappatura dell’utente, salvo l’esistenza di un altro requisito verificato.

La sintassi delle porte in Compose viene interpretata dall’host al container, quindi modificare il lato host lascia il processo in ascolto sulla porta interna esistente. Un esempio del forum Docker spiega perché il lato sinistro è la porta host e perché il lato destro deve continuare a corrispondere al listener dell’applicazione.

Ricrea solo il servizio applicativo con la definizione aggiornata. Non utilizzare un comando dello stack che rimuova i volumi, non inizializzare nuovamente il database e non aggiungere --build, a meno che l’immagine non sia cambiata. Dopo la ricreazione, controlla i mount effettivi e la mappatura delle porte prima di consentire l’esecuzione di migrazioni o processi in background.

Aggiorna ogni percorso client che dipende dalla porta precedente

Un segnalibro del browser è solo uno degli elementi che utilizzano la porta pubblicata. Proxy inversi, inoltri del router, firewall locali, probe di monitoraggio, app mobili, destinazioni dei webhook, callback OAuth, whitelist CORS e URL pubblici generati potrebbero ancora puntare all’endpoint precedente.

Alcune applicazioni self-hosted effettuano richieste di loopback o costruiscono gli URL di callback a partire dall’indirizzo pubblico configurato. Una discussione su un container WordPress mostra come una modifica della mappatura esterna possa rendere visibile un comportamento di loopback sensibile alla porta anche quando il database rimane integro.

Cerca la porta precedente nel progetto Compose, nella configurazione del proxy, nei file di ambiente e nelle impostazioni dell’applicazione. Aggiorna solo i livelli che utilizzano effettivamente l’endpoint host. Normalmente, i container interni dovrebbero continuare a utilizzare il nome del servizio e la porta interna, anziché la nuova porta host pubblicata.

Mantieni il database sul suo percorso privato del container

Non modificare né pubblicare la porta del database solo perché è cambiata la porta host dell’applicazione web. Un database utilizzato esclusivamente dai container dello stesso stack può rimanere raggiungibile tramite il nome del servizio e la porta interna, senza alcuna pubblicazione sull’host.

Confondere l’endpoint pubblico dell’app con la connessione al database può creare una seconda interruzione: l’applicazione potrebbe essere indirizzata all’indirizzo del NAS e a una porta host, anche se il database dovrebbe rimanere su una rete Docker privata. Questa modifica aggiunge variabili relative a firewall, NAT e autenticazione senza aiutare il browser a raggiungere il servizio web.

Dal container applicativo ricreato, risolvi il nome del servizio database, apri la relativa porta TCP interna, esegui l’autenticazione e una lettura innocua. Se il percorso è invariato, lascialo invariato. Se il test del database fallisce, ripristina la definizione applicativa originale prima di eseguire il troubleshooting del problema separato di rete o credenziali.

Verifica la nuova porta senza toccare i dati persistenti

Testa direttamente la nuova porta host, quindi prova il normale hostname o il percorso del proxy inverso. Verifica l’accesso, la lettura dei record, una scrittura reversibile, i caricamenti, i processi pianificati, le integrazioni e un riavvio controllato del container.

La guida di ZimaSpace su come associare i controlli di integrità ai percorsi reali dell’app è il controllo successivo quando il nuovo endpoint del browser funziona, ma Docker continua a segnalare il servizio come non integro.

La modifica è completa solo quando la nuova porta pubblicata sopravvive alla ricreazione e al riavvio, il proxy e i client non utilizzano più l’endpoint precedente, l’applicazione si riconnette allo stesso database persistente e il backup del database rimane disponibile. Esegui il rollback della mappatura della porta se l’applicazione si avvia con un nuovo stato vuoto o tenta una migrazione inattesa.

Supporto e consigli

Altro da leggere

Get More Builds Like This

Stay in the Loop

Get updates from Zima - new products, exclusive deals, and real builds from the community.

Stay in the Loop preferences

We respect your inbox. Unsubscribe anytime.