내부 네트워크의 다른 머신에서 Docker 컨테이너에 액세스

내부 네트워크의 다른 머신에서 Docker 컨테이너에 액세스

Docker를 사용하여 라즈베리 파이에서 asp.net 핵심 애플리케이션을 실행하려고 하는데 주요 부분을 완료한 것 같습니다. 간단한 asp.net 핵심 프로젝트인 github에 저장소가 있습니다. 내 github 저장소에 푸시할 때마다 설정되는 docker 클라우드에 계정이 설정되어 있습니다.

docker가 내 저장소를 내 pi로 가져오도록 했습니다. pi의 도커 이미지 스크린샷

다음 명령을 실행하면 docker run -d -p 8080:80 joro550/radiusnet --network=host 실행되는 것을 볼 수 있습니다. Docker 이미지 실행 이미지

그러나 포트 8080에서 파이의 IP 주소에 액세스하면 다음과 같은 결과가 나타납니다. 연결이 거부됨 스크린샷

내가 이것을 찾고 있었을 때 사람들은 다음 플래그를 추가할 것을 제안했습니다(나는 동일한 결과로 시도했습니다:

  • docker run 명령에 --network=host 추가
  • docker run 명령에 -it 추가
  • Docker 파일에 Expose 80 추가

이제 나는 이 일에 접근하는 방법을 조금 잃어버린 것 같습니다. 도커 문서에서는 실행을 권장합니다.

`docker inspect -f "{{ .NetworkSettings.Networks.nat.IPAddress }}" myapp`

Windows 10 Nano 컨테이너를 사용하는 경우 사용하고 있다는 것이 믿기지 않지만 이 명령을 실행하면 큰 소리가 납니다.<no value>

다시 전환하면 docker inspect -f "{{ .NetworkSettings.IPAddress }}" myapp내 IP 내부 IP 주소와 다른 IP 주소가 제공됩니다. 포트 8080에서 시도했지만 동일한 결과를 얻었습니다.

두 주소를 모두 컬링하면 동일한 연결 거부 결과가 나타납니다. IP 주소에서 Curl이 실패함

관심 있는 사람을 위한 내 도커 파일은 다음과 같습니다.

FROM microsoft/aspnetcore-build:2.0 AS build-env
WORKDIR /app

# copy csproj and restore as distinct layers
COPY /src ./
RUN dotnet restore

# copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out -r linux-arm

# build runtime image
FROM microsoft/dotnet:2.0.0-runtime-stretch-arm32v7
WORKDIR /app
COPY --from=build-env /app/src/RadiusNet.Web/out .
EXPOSE 80
ENTRYPOINT ["dotnet", "RadiusNet.Web.dll"]

더 많은 정보가 필요하면 문의해 주세요. 저는 Docker를 처음 접했기 때문에 현재 상황에 대해 약간의 지식 덤프를 수행했습니다.

Github 프로젝트 링크(필요한 경우):https://github.com/joro550/RadiusNet

어떤 도움이라도 - 지금은 크게 감사하겠습니다.

답변1

먼저 몇 가지 설명

  • Dockerfile에서 "EXPOSE 80"은 "docker run -P", "publish all"에서 사용됩니다.
  • docker가 제공하지 않는 포트를 게시하는 것은 쓸모가 없습니다(예: 서비스가 포트 5000에서 실행 중인 경우 "-p 8000:80")

수신 포트는 "docker 포트"에 의해 보고되지만 제공된다는 보장은 없습니다.

# docker run --name radiusnet -p 8001-8009:5000/tcp  radiusnet
Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.

# docker port radiusnet
5000/tcp -> 0.0.0.0:8001

그 증거는 푸딩에 있다..

# wget -O /tmp/test.html  http://localhost:8001/
--2018-02-08 16:22:46--  http://localhost:8001/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:8001... connected.
HTTP request sent, awaiting response... 

실패하면 잘못된 포트가 게시된 것입니다.

"--network 호스트"로 시작하면 "docker 포트"는 docker 서비스가 정상인 동안 아무 것도 보고하지 않을 수 있습니다. "lsof"가 도움이 될 수 있습니다.

# docker run --name radiusnet --network host  radiusnet
Hosting environment: Production
Content root path: /app
Now listening on: http://localhost:5000

# docker port radiusnet 

# ps -ef | grep dotnet
root       540 27973  0 16:46 pts/2    00:00:00 grep dotnet
root     32452 32437  7 16:37 ?        00:00:43 dotnet RadiusNet.Web.dll

# lsof -Pn -p 32452 | grep LISTEN
dotnet  32452 root  368u     IPv4     106845      0t0    TCP 127.0.0.1:5000 (LISTEN)
dotnet  32452 root  383u     IPv6     106854      0t0    TCP [::1]:5000 (LISTEN)

# wget -O /tmp/test.html  http://localhost:5000/       
--2018-02-08 16:56:27--  http://localhost:5000/
Resolving localhost (localhost)... 127.0.0.1
Connecting to localhost (localhost)|127.0.0.1|:5000... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘/tmp/test.html’

모든 것이 잘되고, 모든 것이 잘됩니다.

관련 정보