Docker 명령의 --net=host 옵션은 실제로 무엇을 합니까?
저는 도커에 대해 조금 초보입니다.도커 실행 명령에서 이 옵션이 수행하는 작업에 대한 명확한 설명을 심층적으로 찾을 수 없었고 약간 혼란스러웠습니다.
포트를 지정하지 않고 도커 컨테이너에서 실행되는 애플리케이션에 액세스할 수 있습니까?예를 들어 포트 8080에서 도커 이미지를 통해 배포된 웹 앱을 실행하는 경우 옵션을 사용하여-p 8080:8080
도커 실행 명령에서는 도커 컨테이너 ip / the WebAppName의 8080 포트에서 액세스해야 합니다.하지만 어떻게 해야 할지 생각이 안 나요--net=host
옵션이 작동합니다.
도커 설치 후 기본적으로 3개의 네트워크가 있습니다.
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
난 이걸 단순하게 유지하려고 노력하고 있습니다.따라서 기본적으로 컨테이너를 시작하면 브리지(도커0) 네트워크 내부에 컨테이너가 생성됩니다.
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
젠킨스의 도커 파일에 있는 포트들은8080
그리고.50000
노출되었습니다.이러한 포트는 브리지 네트워크의 컨테이너에 대해 열립니다.그래서 브리지 네트워크 내의 모든 것이 포트의 컨테이너에 액세스할 수 있습니다.8080
그리고.50000
브리지 네트워크의 모든 것은 개인 범위에 있습니다."Subnet": "172.17.0.0/16",
외부에서 액세스하려면 포트를 매핑해야 합니다.-p 8080:8080
컨테이너의 포트를 실제 서버(호스트 네트워크)의 포트에 매핑합니다.그래서 서버에 액세스하는 것은8080
포트의 브리지 네트워크로 라우팅합니다.8080
.
이제 호스트 네트워크도 있습니다.컨테이너 네트워킹을 컨테이너화하지 않습니다.따라서 호스트 네트워크에서 컨테이너를 시작하면 다음과 같이 나타납니다(첫 번째 컨테이너).
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
차이점은 포트에 있습니다.이제 컨테이너가 호스트 네트워크 내부에 있습니다.그래서 만약 당신이 항구를 연다면,8080
호스트에서 컨테이너에 즉시 액세스합니다.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
개항했습니다.8080
방화벽에서 포트의 서버에 액세스하는 경우8080
젠킨스에 접속하고 있습니다저는 이 블로그가 더 잘 이해하는 데도 유용하다고 생각합니다.
그--net=host
옵션은 네트워크 관점에서 Docker 컨테이너 내부의 프로그램이 호스트 자체에서 실행 중인 것처럼 보이게 하는 데 사용됩니다.컨테이너가 일반적으로 얻을 수 있는 것보다 더 많은 네트워크 액세스를 허용합니다.
일반적으로 호스트 시스템에서 컨테이너로 포트를 전달해야 하지만 컨테이너가 호스트의 네트워크를 공유할 때 프로그램이 컨테이너 내부가 아닌 호스트에서 로컬로 실행되는 경우와 마찬가지로 모든 네트워크 작업이 호스트 시스템에서 직접 수행됩니다.
따라서 더 이상 포트를 노출하고 컨테이너 포트에 매핑할 필요가 없지만 두 개의 컨테이너가 동일한 호스트 포트에서 작동할 수 없으므로 충돌을 방지하기 위해 각 컨테이너가 수신하는 포트를 조정하기 위해 도커 파일을 편집해야 합니다.그러나 이 옵션의 실제 이유는 포트 수준의 컨테이너로 전달하기 어려운 네트워크 액세스가 필요한 앱을 실행하기 위한 것입니다.
예를 들어 DHCP 서버를 실행하려면 네트워크에서 브로드캐스트 트래픽을 수신하고 패킷에서 MAC 주소를 추출할 수 있어야 합니다.이 정보는 포트 포워딩 프로세스 중에 손실되므로 Docker 내부에서 DHCP 서버를 실행하는 유일한 방법은 컨테이너를 다음과 같이 실행하는 것입니다.--net=host
.
일반적으로 말하면,--net=host
이는 매우 구체적이고 비정상적인 네트워크 요구를 가진 프로그램을 실행하는 경우에만 필요합니다.
마지막으로, 보안 관점에서 Docker 컨테이너는 단일 포트만 보급(노출)하더라도 많은 포트에서 수신할 수 있습니다.일반적으로 이것은 예상되는 단일 포트만 전달하기 때문에 괜찮지만, 사용하는 경우--net=host
그러면 도커 파일에 나열되지 않은 모든 컨테이너 포트가 호스트에서 수신됩니다.이는 컨테이너를 자세히 확인해야 함을 의미합니다(특히 소프트웨어 프로젝트에서 제공하는 공식 컨테이너가 아닌 경우). 실수로 추가 서비스가 기계에 노출되지 않도록 해야 합니다.
호스트 네트워킹 드라이버는 Linux 호스트에서만 작동하며, Mac용 Docker Desktop, Windows용 Docker Desktop 또는 Windows Server용 Docker EE에서는 지원되지 않습니다.
- --net="anyname"과 같은 새로운 네트워크를 만들 수 있습니다.
- 이 작업은 서비스를 다른 컨테이너에서 분리하기 위해 수행됩니다.
- 동일한 서비스가 서로 다른 컨테이너에서 실행되고 있지만 포트 매핑은 동일하게 유지되고 첫 번째 컨테이너는 정상적으로 시작되지만 두 번째 컨테이너의 동일한 서비스는 실패한다고 가정합니다.이 문제를 방지하려면 포트 매핑을 변경하거나 네트워크를 생성합니다.
언급URL : https://stackoverflow.com/questions/43316376/what-does-net-host-option-in-docker-command-really-do
'programing' 카테고리의 다른 글
최신 타임스탬프별 MySQL 선택 (0) | 2023.09.04 |
---|---|
UI 레이블의 textColor 속성을 애니메이션화하는 방법은 무엇입니까? (0) | 2023.09.04 |
select2 - 검색 상자 숨기기 (0) | 2023.08.15 |
Div 높이가 100%이고 내용에 맞게 확장됩니다. (0) | 2023.08.15 |
powershell의 스크립트 블록에 인수 전달 (0) | 2023.08.15 |