
저는 Docker 컨테이너를 --network host
설정하여 작업하면서 한 컨테이너의 포트에 바인딩하면 오류 메시지 없이 동일한 포트에 바인딩되는 두 번째 컨테이너를 계속 시작할 수 있다는 것을 깨달았습니다.
netstat
그러면 첫 번째 컨테이너의 PID 대신 두 번째 컨테이너의 PID가 수신 대기 중인 것으로 표시됩니다.
재현 단계:
[root@test]# cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="9.2 (Plow)"
...
[root@test]# docker --version
Docker version 23.0.6, build ef23cbc
[root@test]# docker run -d --rm --network host --name container01 debian nc -l -p 80
7bc250856c7ddde57eb48f57ba800391577c728ec856da24bf80a9df8e766c84
[root@test]# netstat -tulpen | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 10435480 2162661/nc
[root@test]# docker run -d --rm --network host --name container02 debian nc -l -p 80
10897d7dea695446db48bff9d3b338554a7cd0535f30625f06b6e5f959bf8df2
[root@test]# netstat -tulpen | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 10436217 2162708/nc
[root@test]# ps auxf
root 2162640 0.0 0.5 720496 10608 ? Sl 11:03 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 7bc250856c7ddde57eb48f57ba800391
root 2162661 0.0 0.0 3200 1116 ? Ss 11:03 0:00 \_ nc -l -p 80
root 2162686 0.0 0.5 720496 10028 ? Sl 11:03 0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 10897d7dea695446db48bff9d3b33855
root 2162708 0.0 0.0 3200 1060 ? Ss 11:03 0:00 \_ nc -l -p 80
첫 번째 컨테이너에 대한 기존 연결은 두 번째 컨테이너가 시작된 후에도 계속 작동합니다. 모든 새로운 연결은 두 번째 연결로 이동됩니다.
물론 호스트에서 직접 동일한 포트에 바인딩하는 것은 작동하지 않으며 호스트가 이미 나열되어 있는 포트에 컨테이너를 바인딩할 수도 없습니다.
그래서 내 질문은: 컨테이너가 이미 기존 포트 바인딩을 따라잡을 수 있도록 컨테이너의 차이점이 정확히 무엇입니까?
답변1
동일한 클라이언트의 단일 포트 포트에서 여러 세션을 가질 수 있는 것과 거의 같은 방식입니다. 연결은소켓 쌍(고유한 클라이언트측 임시 포트 포함) 자신을 식별합니다. 호스트는 이러한 고유한 쌍을 사용하여 올바른 프로세스 ID로 트래픽을 보냅니다. 때로는 호스트 포트 자체가 다른 프로세스에 의해 바인딩된 후에도 마찬가지입니다. 호스트가 포트를 닫고, 해당 세션을 종료하고, 해당 프로세스 ID를 종료할 때까지 활성 상태를 유지해야 합니다.
운영 체제 및 사용 가능한 옵션에 따라 소프트웨어가 포트에 다시 바인딩하는 방법에는 몇 가지 제한 사항이 있습니다. 여기에 대한 답변에서 이에 대한 좋은 세부 정보와 Linux의 바인딩 프로세스를 찾았습니다.두 개의 애플리케이션이 동일한 포트를 수신할 수 있습니까?