Hvordan kan jeg afsløre en port fra ASP.NET Core i Docker Linux-container i Windows?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har flere ASP.NET Core-tjenester defineret i docker-compose. Jeg skal kunne eksponere port i host -netværket (jeg bruger linuxbeholdere på Docker til Windows 18.03.0-ce).


Prøve:



  • Tjeneste C1 og C2 kører i containere.

  • Service H3 kører direkte i værten, ikke i container.

  • Alle tjenester (C1, C2 og H3) skal være tilgængelige for hinanden.



Jeg ved ikke hvordan man konfigurerer netværk for tjenester C1 og C2 i docker-compose. Jeg prøvede dette:


version: '3'

services:
  c1:
    image: <some image name>
    build:
      context: .
      dockerfile: <path to dockerfile>
    environment:
      - ASPNETCORE\_ENVIRONMENT=Development      
      - ASPNETCORE\_URLS=http://localhost:9084
    ports:
      - "9084:9084"
    network\_mode: "host"

  c2:
    image: <some image name>
    build:
      context: .
      dockerfile: <path to dockerfile>
    environment:
      - ASPNETCORE\_ENVIRONMENT=Development      
      - ASPNETCORE\_URLS=http://localhost:9085
    ports:
      - "9085:9085"
    network\_mode: "host"


Jeg ser dette i konsollen, når containerne startes:


Hosting environment: Development
Content root path: /app
Now listening on: http://localhost:9085
Application started. Press Ctrl+C to shut down.


Men jeg kan ikke forbinde dem fra værten. netstat -an viser ikke disse havne, telnet localhost 9084 fejler.


Dette er output fra docker inspect for den pågældende beholder:


"NetworkSettings": {
    "Bridge": "",
    "SandboxID": "df480d4d68cb109dc6b85f689f8b210a9f74e650c48a343cdd3d11eb3d10bec7",
    "HairpinMode": false,
    "LinkLocalIPv6Address": "",
    "LinkLocalIPv6PrefixLen": 0,
    "Ports": {},
    "SandboxKey": "/var/run/docker/netns/default",
    "SecondaryIPAddresses": null,
    "SecondaryIPv6Addresses": null,
    "EndpointID": "",
    "Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "IPAddress": "",
    "IPPrefixLen": 0,
    "IPv6Gateway": "",
    "MacAddress": "",
    "Networks": {
        "host": {
            "IPAMConfig": null,
            "Links": null,
            "Aliases": null,
            "NetworkID": "324d836f54fa685d56b416f01a18e3e75f88d4516dafac43bb1a4ff760a2b67a",
            "EndpointID": "9212f6a01e142ef9fb71116c9fe03c37567c60ed8a2add91fe28bf0bd6de001a",
            "Gateway": "",
            "IPAddress": "",
            "IPPrefixLen": 0,
            "IPv6Gateway": "",
            "GlobalIPv6Address": "",
            "GlobalIPv6PrefixLen": 0,
            "MacAddress": "",
            "DriverOpts": null
        }
    }
}


Når jeg fjerner network\_mode: "host" konfigurationen fra docker-compose (netværk er så bridge som standard), får jeg denne besked formularen programmet:


warn: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to bind to http://localhost:9084 on the IPv6 loopback interface: 'Error -99 EADDRNOTAVAIL address not available'.


Kan du hjælpe mig med at konfigurere netværkskonfigurationen?

Bedste reference


Jeg fandt en løsning på mit problem:



  • Jeg sætter ikke noget netværk i docker-compose (den genererede * \_default med bridge driver bruges) - fjernet network\_mode.

  • Jeg fjernede ASPNETCORE\_URLS ENV-variablen i docker-compose.

  • APS.NET Core-applikationer bruger port 80 (indvendig container).

  • Port 80 er eksponeret (for eksempel) som 9084 for at være tilgængelig fra værten.

  • Programmet er konfigureret til at bruge (for eksempel) localhost:9085.

  • docker-compose bruger miljøvariabel til at tilsidesætte slutpunktet til host.docker.internal.9085.



Nu bruger alle tjenester, der kører i containere, host.docker.internal og en havn
at oprette forbindelse til en anden tjeneste, så disse tjenester kan forbinde andre tjenester, der kører i en container eller direkte i værten.


Tjenester, der kører i værtsbrugen localhost og en havn, så de kan forbinde andre tjenester, der kører i værten eller i containeren.


Dette er en prøve af docker-compose fil:


version: '3'

services:
  c1:
    image: <some image name>
    build:
      context: .
      dockerfile: <path to dockerfile>
    environment:
      - ASPNETCORE\_ENVIRONMENT=Development
    env\_file:
      - docker-compose.override.env
    ports:
      - "9084:80"

  c2:
    image: <some image name>
    build:
      context: .
      dockerfile: <path to dockerfile>
    environment:
      - ASPNETCORE\_ENVIRONMENT=Development
    env\_file:
      - docker-compose.override.env
    ports:
      - "9085:80"


Eksempel på docker-compose.override.env fil:


ApiOptions\_\_DomainModelApiBaseUrl=http://host.docker.internal:9081/api
ApiOptions\_\_SearchApiBaseUrl=http://host.docker.internal:9088/api


Nu kan jeg køre samme tjeneste i container eller fra Visual Studio og fejle det.