Hur man ansluter till Localhost i en Docker -behållare

0
20

När du arbetar med Docker containeriserar du vanligtvis de tjänster som bildar din stack och använda intercontainernätverk för att kommunicera mellan dem. Ibland kan du behöva en container för att prata med en tjänst på din värd som inte har containeriserats. Så här får du åtkomst till localhost eller 127.0.0.1 från en Docker-behållare.

The Easy Option

Docker Desktop 18.03+ för Windows och Mac stöder host.docker.internal som ett fungerande alias för localhost. Använd den här strängen inuti dina behållare för att komma åt din värdmaskin.

  • localhost och 127.0.0.1 – Dessa löser sig till behållaren.
  • host.docker.internal – Detta löser den externa värden.

Om du kör en MySQL -server på din värd kan Docker -behållare komma åt den genom att ansluta till host.docker.internal: 3306. Detta är den enklaste tekniken när du arbetar på en Windows- eller Mac-maskin.

Docker Engine-användare på Linux kan aktivera host.docker.internal också via –add-host-flaggan för docker-körning . Starta dina behållare med den här flaggan för att avslöja värdsträngen:

docker run -d –add-host host.docker.internal: host-gateway my-container: latest

Flaggan –add-host lägger till en post i behållarens /etc /hosts-fil. Värdet som visas ovan mappar host.docker.internal till behållarens värdgateway, som matchar det verkliga localhost -värdet. Du kan ersätta host.docker.internal med din egen sträng om du föredrar det.

Ansluta till värdnätverket

Docker tillhandahåller ett värdnätverk som låter containrar dela din värds nätverksstack. Detta tillvägagångssätt innebär att localhost inuti en behållare löser sig till den fysiska värden, istället för själva behållaren.

Annons

Behållare lanseras med värdnätverket genom att lägga till –network = host flag:

docker run -d –network = host my -container: senaste

Nu kan din container referera localhost eller 127.0.0.1 direkt.

Om du använder Docker Compose ändrar du behållarens tjänstdefinition så att det inkluderar fältet network_mode:

services: my-service: network_mode : värd

Det finns några varningar för detta tillvägagångssätt. Det är viktigt att överväga alla konsekvenser innan du använder den. Behållare får vanligtvis sitt eget privata nätverk som är åtskilt från värdens stack. När du anger –network = host, kommer behållaren som standard att ärva delade nätverksinställningar från din värd.

Alla portar som exponeras av behållaren exponeras på värden, även om de inte uttryckligen är uttryckligen deklareras med -p -flaggan. Behållarens standardvärdnamn matchar värdens, även om detta kan ändras med –hostname -flaggan.

Värdnätverket kan vara ett säkerhetsproblem som bryter isoleringsmodellen för Docker -behållare. Det kan fortfarande vara användbart i scenarier där du är säker på att körning av containrar inte kommer att stå i konflikt med varandra eller orsaka problem i din värdmiljö. Värdnätverksläget är också snabbare än standardbryggläget eftersom det inte finns något virtualiseringslager för trafik att passera.

Åtkomst till värden med standardbryggläget

Det går fortfarande att komma åt din värd från behållare i standardbryggläget för bro. Du behöver bara referera till den med dess Docker -nätverks -IP, istället för localhost eller 127.0.0.1.

Annonsering

De flesta Docker Engine -installationer kommer att representera värden som 172.17.0.1 på standard docker0 bridge -nätverk. Du kan kontrollera din egen IP genom att köra det här kommandot på din värd:

ip addr show docker0

Värdens Docker -IP visas på inet -raden. Anslut till den här IP -adressen från dina behållare för att få tillgång till tjänsterna som körs på din värd.

En fallgrop med detta tillvägagångssätt är att du kanske inte kan ansluta till tjänster som binder direkt till localhost. Du måste se till att dina tjänster lyssnar efter anslutningar på din Docker bridge IP, såväl som localhost och 127.0.0.1. Annars ser du anslutningsvägran eller liknande fel i din behållare.

Sammanfattning

Du har flera alternativ när du behöver nå utanför en Docker -behållare till maskinens lokala värd. Om du använder Windows eller Mac är det bäst att använda det inbyggda host.docker.internaliaset. Linux-användare kan konfigurera något liknande med –add-host-flaggan när de startar en container.

Värdnätverksläge är ett universellt alternativ som låter behållare dela din värds nätverksstack. Du kan hänvisa till localhost direkt men måste hålla dig medveten om riskerna och begränsningarna. Det är inte ett lämpligt alternativ när stark nätverksisolering krävs.

Annonsering

Att hålla sig till bryggläge kan vara det bästa alternativet för arbetsbelastningar som stöder det. Bind värdens tjänster till dess Docker -IP och använd sedan den adressen för att ansluta från din behållare. Detta låter dig använda Dockerers virtuella nätverk per container samtidigt som du tillhandahåller en rutt till din värd när det krävs.