호스트 PC와 Docker 컨테이너 사이의 인터페이스와 포트 사이의 관계는 무엇입니까?

호스트 PC와 Docker 컨테이너 사이의 인터페이스와 포트 사이의 관계는 무엇입니까?

전제:

함께 끌어내려고 노력 중이야최근의 학습네트워크 인터페이스와 포트에 대해 알아보고 새로운 학습 내용을 Docker와 연결해 보세요.

이 질문과 관련하여 제가 배운 내용을 간략하게 요약하면 다음과 같습니다.

  • 모든 컴퓨터는 각 네트워크 인터페이스마다 하나씩 여러 개의 IP 주소를 가질 수 있습니다.
  • IP 주소는 컴퓨터 등이 아닌 인터페이스에 할당됩니다.
  • 소켓은 IP+포트입니다.
  • DHCP는 인터페이스에 IP 주소를 할당하는 경우가 많습니다.

소프트웨어 작업의 여러 측면과 마찬가지로 저는 먼저 배운 "의식"에 따라 작업을 수행합니다. 왜냐하면 "그렇게 되기" 때문입니다. 그런 다음 시간과 경험을 통해 이유와 원인을 숙고하고 조사하기 시작합니다. 그래서 저는 이 새로운 학습을 Docker와 연결하고 싶습니다.

내가 배운 "의식"은 컨테이너화된 애플리케이션이 TCP 소켓에서 수신 대기하는 경우 해당 포트의 호스트 인터페이스 중 하나에 도착하는 트래픽이 TCP 소켓으로 "전달"되도록 해당 소켓의 포트를 "노출"해야 한다는 것입니다. 컨테이너.
예를 들어 docker run -d -p 81:80 httpd웹 브라우저가 127.0.0.81을 가리키면 해당 HTTP/TCP/IP 트래픽이 다음으로 "전달"되도록 설정합니다.httpd컨테이너의 포트 80.

따라서 웹 브라우저에서 127.0.0.1:81을 가리키면 Apache의 "It works!"가 표시됩니다. 메시지.

또한: 웹 브라우저를 127.0.0으로 지정하면.2:81 또는 127.0.0.16:81, 그리고 Apache의 "It works!"도 보입니다. 메시지.

링크된 게시물에서 알 수 있듯이 DHCP는 내 NIC의 인터페이스에 IP 주소 10.0.0.17을 할당했으며 웹 브라우저에서 10.0.0.17:81을 가리키면 여기서 다시 Apache의 "작동합니다!"가 표시됩니다. 메시지.
동일한 네트워크에 있는 다른 PC의 웹 브라우저를 10.0.0.17:81로 지정해도 작동합니다.


질문:

내 기본질문docker runis: 인수 를 사용할 때 호스트 PC의 인터페이스(IP 주소) 중 어떤 포트가 호스트에서 컨테이너로 전달됩니까 -p? 지적한 관찰에 따르면 대답은 "모든 인터페이스"인 것으로 보입니다. 사실입니까?

하지만 더 광범위하게 말하면 호스트 PC와 Docker 컨테이너 사이의 인터페이스와 포트 사이의 관계는 무엇입니까?


내가 시도한 것

도움말 텍스트를 읽어보았지만 docker run해당 텍스트가 -p내가 묻는 질문과 연관시킬 수 있는 수준이 아닙니다.

-p, --publish list 컨테이너의 포트를 호스트에 게시합니다.

ifconfig내 PC의 맥락에서 보면서 달리기를 해보고 ,httpd컨테이너.
ifconfig호스트 PC에서:

$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:caff:fe23:f0f4  prefixlen 64  scopeid 0x20<link>
        ether 02:42:ca:23:f0:f4  txqueuelen 0  (Ethernet)
        RX packets 3079  bytes 322688 (322.6 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6429  bytes 15942682 (15.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 17975  bytes 1557651 (1.5 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 17975  bytes 1557651 (1.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.17  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::5f8c:c301:a6a3:6e35  prefixlen 64  scopeid 0x20<link>
        ether f8:59:71:01:89:cf  txqueuelen 1000  (Ethernet)
        RX packets 1672559  bytes 2237440808 (2.2 GB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 726083  bytes 113598143 (113.5 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ifconfig실행 중httpd컨테이너 (저는 으로 설치했습니다 apt-get):

# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 1326  bytes 8916833 (8.5 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1134  bytes 76866 (75.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

위 출력의 맥락에서 이 질문을 적용하면 ifconfig호스트 PC의 인터페이스와 Docker 컨테이너의 인터페이스 간의 관계는 무엇입니까?
에서여기, 내 이해에 따르면 DHCP는 내 호스트 PC의 NIC에 10.0.0.17을 할당했습니다. 그러나 172.17.0.3은 어디에서 왔습니까?

답변1

[NB: 여기에 세 가지 질문이 있는 것 같습니다. 그 중 적어도 하나는 너무 광범위하여 명확하고 수용 가능한 답변을 얻을 수 없습니다. 일반적으로 슈퍼유저는 질문 게시물당 하나의 좁게 정의된 질문만 묻는 경우 가장 잘 작동합니다.]

내 주요 질문은 다음과 같습니다. -p 인수를 사용하여 docker run을 수행할 때 호스트 PC의 인터페이스(IP 주소) 중 어느 것이 호스트에서 컨테이너로 포트 전달됩니까? 지적한 관찰에 따르면 대답은 "모든 인터페이스"인 것으로 보입니다. 사실입니까?

예.

하지만 더 광범위하게 말하면 호스트 PC와 Docker 컨테이너 사이의 인터페이스와 포트 사이의 관계는 무엇입니까?

Docker의 네트워킹 문서를 참조하지 않고 답변하기에는 너무 광범위합니다. Docker에는 호스트 PC와 Docker 컨테이너 간의 인터페이스와 포트 간의 관계를 변경하는 다양한 네트워킹 옵션이 포함되어 있습니다. 매우 유연합니다.

그러나 172.17.0.3은 어디에서 왔습니까?

Docker의 기본 네트워킹 모드,브리지 네트워킹, 호스트에 소프트웨어 브리지(예: 가상 이더넷 스위치)를 생성하고 가상 네트워크 인터페이스를 통해 컨테이너를 호스트에 연결합니다. 호스트 내의 모든 가상 이더넷 LAN과 같습니다. 그런 다음 NAT(홈 게이트웨이 라우터가 사용하는 것과 유사)를 사용하여 컨테이너가 호스트를 넘어 네트워크에 도달할 수 있도록 합니다. NAT는 172.17.0.0/16 서브넷을 프라이빗 서브넷으로 사용합니다.

Docker는 192.168.0.0/16, 10.0.0.0/8 및 나머지 172와 마찬가지로 RFC 1918 개인 주소 공간의 일부이기 때문에 해당 서브넷을 사용합니다.16.0.0/12.

Docker는 해당 서브넷의 고정 주소로 컨테이너를 프로그래밍 방식으로 구성하는 것으로 보입니다(DHCP는 불필요하게 상황을 복잡하게 만듭니다).

관련 정보