Docker Desktop 네트워킹 개요

Docker Desktop 네트워킹 개요

이 페이지는 Docker Desktop이 컨테이너, VM, 호스트 사이에서 네트워크 트래픽과 파일 I/O를 어떻게 라우팅하는지, 그리고 이 동작이 방화벽과 엔드포인트 보호 도구에 어떻게 보이는지를 설명해요.

출처: Networking features in Docker Desktop

본문

개요

Docker Desktop은 Docker Engine을 가벼운 Linux 가상 머신(VM) 안에서 실행해요. 시스템 구성과 운영체제에 따라 Docker Desktop은 서로 다른 백엔드 컴포넌트로 Docker VM과 호스트 사이의 네트워크와 파일 작업을 라우팅해요.

백엔드 컴포넌트와 역할

백엔드는 다음 역할을 해요.

  • 네트워크 프록시: 호스트와 Linux VM 사이의 트래픽을 변환해요. Windows와 Mac에서는 com.docker.backend 프로세스가 처리해요. Linux에서는 qemu 프로세스가 이 역할을 해요.
  • 파일 서버: 컨테이너에서 호스트 파일시스템으로의 파일 접근을 처리해요. gRPC FUSE를 쓰면 백엔드가 파일 공유를 담당하고, virtiofskrun을 쓰면 각각의 데몬이 파일 접근을 처리해요.
  • 컨트롤 플레인: Docker API 호출, 포트 포워딩, 프록시 구성을 관리해요.

일반적인 설정을 정리한 표예요.

플랫폼 설정 네트워킹 처리 파일 공유 처리 비고
Windows Hyper-V com.docker.backend.exe com.docker.backend.exe EDR/방화벽에 완전히 보이는 가장 단순한 설정
Windows (WSL 2) WSL 2 com.docker.backend.exe WSL 2 커널 (호스트에서 안 보임) WSL 2 통합이 필요할 때만 권장
Mac Virtualization framework + gRPC FUSE com.docker.backend com.docker.backend 성능과 가시성을 위해 권장
Mac Virtualization framework + virtiofs com.docker.backend Apple Virtualization framework 성능은 높지만 호스트에서 파일 접근을 볼 수 없음
Mac DockerVMM + virtiofs com.docker.backend krun 현재 베타
Linux Native Linux VM qemu virtiofsd Linux에는 com.docker.backend 프로세스가 없음

컨테이너가 인터넷에 연결되는 방법

Docker Desktop의 각 Linux 컨테이너는 Docker가 관리하는 작은 가상 네트워크 안에서 실행돼요. 모든 컨테이너는 Docker 관리 네트워크에 연결되고 각자 내부 IP 주소를 받아요. docker network ls, docker network create, docker network inspect로 이 네트워크를 보고 관리할 수 있고, daemon.json으로 관리돼요.

컨테이너가 apt-get updatedocker pull 같은 네트워크 요청을 시작하면:

  • 컨테이너의 eth0 인터페이스가 VM 안의 가상 브리지(docker0)에 연결돼요.
  • 컨테이너에서 나가는 트래픽은 가상 어댑터(보통 192.168.65.3 같은 내부 IP)를 사용해 NAT(Network Address Translation)로 보내져요. 이 값은 Docker Desktop 설정에서 볼 수 있고 바꿀 수 있어요.
  • 트래픽은 전통적인 가상 네트워크 인터페이스가 아니라 공유 메모리 채널을 통해 호스트 시스템으로 전달돼요. 이 방식은 안정적인 통신을 보장하고 호스트 수준 네트워크 어댑터나 방화벽 설정과의 충돌을 피해요.
  • 호스트에서 Docker Desktop 백엔드 프로세스가 트래픽을 받아 다른 애플리케이션과 같은 네트워킹 API로 표준 TCP/IP 연결을 만들어요.

컨테이너에서 나가는 모든 네트워크 트래픽은 com.docker.backend 프로세스에서 시작돼요. 방화벽, VPN, CrowdStrike 같은 보안 도구는 VM이나 알 수 없는 소스가 아니라 이 프로세스에서 오는 트래픽을 보게 돼요. 그래서 방화벽과 엔드포인트 보안 소프트웨어가 com.docker.backend에 직접 규칙을 적용할 수 있어요.

노출된 포트가 동작하는 방법

-p--publish 플래그로 컨테이너 포트를 게시하면 Docker Desktop은 그 컨테이너 포트를 호스트 시스템이나 로컬 네트워크에서 접근할 수 있게 해줘요. 예를 들어 docker run -p 80:80 nginx의 경우:

  • 백엔드 프로세스가 지정된 호스트 포트(여기선 80)를 리슨해요.
  • 웹 브라우저 같은 애플리케이션이 그 포트에 연결하면 Docker Desktop은 공유 메모리 채널을 통해 컨테이너가 실행 중인 Linux VM으로 연결을 전달해요.
  • VM 안에서 그 연결은 컨테이너의 내부 IP와 포트(예: 172.17.0.2:80)로 라우팅돼요.
  • 컨테이너는 같은 경로로 응답해서, 호스트에서 다른 로컬 서비스처럼 접근할 수 있어요.

기본적으로 docker run -p는 모든 네트워크 인터페이스(0.0.0.0)에서 리슨하지만, 127.0.0.1(localhost)이나 특정 네트워크 어댑터 같은 특정 주소로 제한할 수 있어요. Docker Desktop의 네트워크 설정에서 기본적으로 localhost에 바인딩하도록 바꿀 수도 있어요. 호스트 방화벽은 com.docker.backend를 기준으로 인바운드 연결을 허용하거나 거부할 수 있어요.

프록시와 함께 Docker Desktop 사용하기

Docker Desktop은 시스템 기본 프록시 설정이나 사용자가 구성한 커스텀 설정을 사용할 수 있어요. 트래픽은 두 개의 별도 프록시로 라우팅돼요. Containers 프록시 는 모든 docker image pull 작업과, air-gapped 컨테이너 강제가 켜져 있을 때 실행 중인 컨테이너 트래픽을 관장해요. Docker Desktop 프록시 는 호스트 수준 트래픽(Desktop 애플리케이션, Docker CLI, 확장)을 관장하고, Containers 프록시가 명시적으로 설정되지 않았을 때 이미지 pull의 폴백 역할을 해요.

다음에 유의하세요.

  • 프록시는 시스템 또는 수동 프록시 구성을 따릅니다.
  • Windows에서는 Basic, NTLM, Kerberos 인증이 지원돼요.
  • Mac에서는 NTLM/Kerberos가 네이티브로 지원되지 않아요. 대안으로 localhost에 로컬 프록시를 실행하면 돼요.
  • Docker API를 직접 사용하는 CLI 플러그인 같은 도구는 HTTP_PROXY, HTTPS_PROXY, NO_PROXY 환경 변수로 별도로 설정해야 해요.

방화벽과 엔드포인트 가시성

VM이나 컨테이너 네트워킹을 제한하려면 모든 VM 네트워킹이 이 프로세스들을 거치므로 Windows는 com.docker.backend.exe, Mac은 com.docker.backend, Linux는 qemu에 규칙을 적용하면 돼요. Windows Defender 방화벽이나 엔터프라이즈 엔드포인트 방화벽으로 제어할 수 있어요. 이렇게 하면 Docker Engine을 수정하지 않고 호스트 수준에서 트래픽 검사와 제한이 가능해요. CrowdStrike 같은 도구는 백엔드 프로세스를 통과하는 모든 트래픽과 파일 접근을 관찰할 수 있어요.

동작 호스트 EDR에 보임? 이유
컨테이너가 호스트 파일 읽기 접근이 com.docker.backend에서 처리됨
컨테이너가 호스트 파일 쓰기 같은 프로세스가 쓰기 수행
컨테이너가 자신의 파일시스템 레이어 접근 아니요 VM 안에만 존재함

더 알아보기