Verbinding maken met Localhost binnen een Docker-container

0
188

Als u met Docker werkt, plaatst u gewoonlijk de services die uw stapel vormen en gebruik inter-containernetwerken om tussen hen te communiceren. Soms heb je een container nodig om met een service op je host te praten die niet in een container is geplaatst. Hier leest u hoe u toegang krijgt tot localhost of 127.0.0.1 vanuit een Docker-container.

De gemakkelijke optie

Docker Desktop 18.03+ voor Windows en Mac ondersteunen host.docker.internal als een functionerende alias voor localhost. Gebruik deze string in uw containers om toegang te krijgen tot uw hostmachine.

  • localhost en 127.0.0.1 – Deze worden omgezet in de container.
  • host.docker.internal – Dit wordt opgelost naar de externe host.

Als u een MySQL-server op uw host draait, kunnen Docker-containers er toegang toe krijgen door verbinding te maken met host.docker.internal:3306. Dit is de eenvoudigste techniek als je op een Windows- of Mac-machine werkt.

Docker Engine-gebruikers op Linux kunnen host.docker.internal ook inschakelen via de –add-host-vlag voor docker-run . Start uw containers met deze vlag om de hoststring bloot te leggen:

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

De vlag –add-host voegt een item toe aan het bestand /etc/hosts van de container. De hierboven weergegeven waarde wijst host.docker.internal toe aan de hostgateway van de container, die overeenkomt met de echte localhost-waarde. U kunt host.docker.internal vervangen door uw eigen tekenreeks als u dat wilt.

Verbinding maken met het hostnetwerk

Docker biedt een hostnetwerk waarmee containers de netwerkstack van uw host kunnen delen. Deze benadering betekent dat localhost in een container wordt omgezet naar de fysieke host, in plaats van naar de container zelf.

Advertentie

Containers worden gestart met het hostnetwerk door de –network=host-vlag toe te voegen:

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

Nu kan uw container verwijzen naar localhost of 127.0.0.1 rechtstreeks.

Als u Docker Compose gebruikt, wijzigt u de servicedefinitie van uw container om het veld network_mode op te nemen:

services: my-service: network_mode : host

Er zijn enkele kanttekeningen bij deze benadering. Het is belangrijk om alle implicaties te overwegen voordat u het gebruikt. Containers krijgen gewoonlijk hun eigen privénetwerk dat gescheiden is van de stack van de host. Wanneer u –network=host opgeeft, neemt de container standaard de gedeelde netwerkinstellingen van uw host over.

Alle poorten die door de container worden weergegeven, worden zichtbaar op de host, zelfs als ze niet expliciet zijn gedeclareerd met de vlag -p. De standaard hostnaam van de container komt overeen met die van de host, hoewel dit kan worden gewijzigd met de vlag –hostname.

Het hostnetwerk kan een beveiligingsprobleem zijn dat het isolatiemodel van Docker-containers doorbreekt. Het kan nog steeds nuttig zijn in scenario's waarin u er zeker van bent dat het uitvoeren van containers niet met elkaar in conflict zal komen of problemen zal veroorzaken in uw hostomgeving. De host-netwerkmodus is ook sneller dan de standaard bridge-modus, omdat er geen virtualisatielaag is waar verkeer doorheen kan.

Toegang tot de host met de standaard bridge-modus

Uw host is nog steeds toegankelijk vanuit containers in de standaard bridge-netwerkmodus. Je hoeft er alleen maar naar te verwijzen met zijn Docker-netwerk-IP, in plaats van localhost of 127.0.0.1.

Advertentie

De meeste Docker Engine-installaties zullen de host vertegenwoordigen als 172.17.0.1 op het standaard docker0 bridge-netwerk. U kunt uw eigen IP controleren door deze opdracht op uw host uit te voeren:

ip addr show docker0

Het Docker IP-adres van uw host wordt weergegeven op de inet-regel. Maak vanuit uw containers verbinding met dit IP-adres om toegang te krijgen tot de services die op uw host worden uitgevoerd.

Een valkuil van deze aanpak is dat u mogelijk geen verbinding kunt maken met services die rechtstreeks aan localhost binden. U moet ervoor zorgen dat uw services luisteren naar verbindingen op uw Docker bridge-IP, evenals localhost en 127.0.0.1. Anders zie je de verbinding geweigerd of soortgelijke fouten in je container.

Samenvatting

Je hebt verschillende opties wanneer je naar buiten moet gaan een Docker-container naar de localhost van uw machine. Als u Windows of Mac gebruikt, kunt u het beste de ingebouwde host.docker.internal-alias gebruiken. Linux-gebruikers kunnen iets soortgelijks instellen met de vlag –add-host bij het starten van een container.

Host-netwerkmodus is een universeel alternatief waarmee containers de netwerkstack van uw host kunnen delen. U kunt rechtstreeks verwijzen naar localhost, maar u moet op de hoogte blijven van de risico's en beperkingen. Het is geen geschikte optie wanneer een sterke netwerkisolatie vereist is.

Advertentie

Het vasthouden aan de bridge-modus kan de beste optie zijn voor workloads die dit ondersteunen. Bind de services van uw host aan zijn Docker-IP en gebruik dat adres om verbinding te maken vanuit uw container. Hierdoor kunt u Docker's gevirtualiseerde netwerken per container gebruiken terwijl u een route naar uw host biedt wanneer dat nodig is.