본문 바로가기
System Engineering/Docker (도커)

[Docker] 도커 컨테이너 네트워크와 파일 전송(transport file)

by 코딩하는 동현 2025. 8. 6.

도커는 단일 서버부터 대규모 마이크로서비스 배포까지 네트워크 격리, 통신, 확장성의 문제를 효과적으로 다루도록 설계된 컨테이너 네트워크 시스템을 갖추고 있습니다. 

도커 네트워크의 기본 동작 원리

컨테이너, 네트워크, 그리고 호스트

  • 도커 컨테이너는 기본적으로 네트워크 격리(네임스페이스 분리)를 통해 서로 독립된 네트워크 스택(IP, 포트 공간, 라우팅 테이블)을 할당받습니다.
  • 단일 Docker 호스트(OS)에서 여러 컨테이너들이 각각 고유 IP주소를 받으며, 네트워크 유형에 따라 서로 다른 통신 경로와 격리 수준을 확보합니다.

컨테이너 네트워크 구조의 핵심

컨테이너가 네트워크를 사용하는 구조적 원리는 다음과 같습니다:

  1. 컨테이너 내부 인터페이스
    • 컨테이너 내부에는 eth0와 같은 가상 네트워크 인터페이스가 자동 생성되며, 네임스페이스 내에서만 보입니다.
  2. 호스트 통신 연결
    • 컨테이너의 eth0는 호스트의 veth(virtual ethernet pair)와 연결되어 있고, 이 veth는 도커 네트워크 브릿지(docker0) 혹은 사용자 정의 네트워크와 접속됩니다.
  3. 외부 네트워크 라우팅
    • 기본 브릿지는 호스트의 실제 물리 네트워크 인터페이스(예: enp0s3, eth0 등)에 라우팅되어 있습니다.

도커 네트워크 드라이버

기본 드라이버와 동작 원리

네트워크 타입 설명
bridge 기본값. 단일 호스트 내 컨테이너 간 통신. 가상 브릿지(docker0) 통해 연결
host 컨테이너가 호스트와 네트워크 공간 공유(포트점유 겹침). 리눅스에서만 의미 있음
none 네트워크 미할당(완전 격리). 네트워크 디바이스 없음
overlay 다중 호스트 간 컨테이너 네트워크(클러스터/오케스트레이터 환경에서 사용)
macvlan 컨테이너에 물리적 NIC 수준의 주소(별도 MAC) 부여

상세 구조: bridge 네트워크 예시

도커를 설치하면 자동으로 bridge 네트워크(docker0)가 생성됩니다.

  • docker0 자체는 리눅스 커널의 브릿지 장치입니다.
  • 새로운 컨테이너가 생성되면, 다음 흐름이 따라갑니다:
    1. 컨테이너 내부에 eth0생성 → veth 가상 NIC 쌍(vethXXX)이 함께 생성
    2. veth의 한쪽 끝은 컨테이너 내부, 다른 한쪽은 호스트의 브릿지에 연결
    3. 브릿지는 여러 컨테이너를 Layer2(스위치처럼)로 붙임, 로컬 통신과 외부 라우팅 지원
    4. 호스트 네트워크 인터페이스(예: enp0s3, eth0)와 NAT(iptables)로 외부와 통신 가능
  • 컨테이너끼리는 브릿지 네트워크 내부에서 직접 IP로 통신 가능합니다. 외부에서 컨테이너까지는 일반적으로 포트포워딩(-p 호스트포트:컨테이너포트) 필요

host 드라이버 구조

  • 컨테이너의 네트워크 네임스페이스를 호스트와 완전히 공유
  • 컨테이너 내부에서 127.0.0.1:80에 바인딩하면, 곧바로 호스트의 80포트에 노출(포트포워딩 설정 불가)
  • 주의: 호스트에서 이미 점유된 포트는 컨테이너가 바인딩 할 수 없음

overlay 네트워크

  • 여러 대의 Docker 호스트 서버(클러스터) 간 가상 네트워크를 오버레이 방식으로 형성
  • 각 컨테이너가 다른 물리서버에 있어도 마치 같은 서브넷에 있는 것처럼 통신(암호화된 VXLAN 터널 등 활용)
  • 스웜(Swarm), 쿠버네티스 등 컨테이너 오케스트레이터에서 필수

macvlan 네트워크

  • 컨테이너에 실제 물리 NIC와 별도의 MAC, IP를 할당
  • 외부 라우터나 스위치에서 컨테이너를 하나의 완전한 네트워크 엔티티로 인식
  • 고급 네트워킹 토폴로지나 레거시 환경 호환에 사용

네트워크 격리 및 통신

Linux 네임스페이스의 역할

  • net 네임스페이스 덕분에 각 컨테이너가 고유한 네트워크 스택, 라우팅 테이블, 포트 공간을 가집니다.
  • 이론상 모든 컨테이너는 별도의 네트워크 공간에서 동작(bridge/overlay는 소프트웨어 L2 브릿지로 인터커넥트).

포트 포워딩과 외부 통신

  • 외부에서 컨테이너에 접근하려면 호스트포트를 지정해 컨테이너 포트로 “포워딩”해야 합니다.
  • 예시: p 8080:80 → 호스트 8080번에 접근하면 컨테이너 80번 포트로 연결됨

사용자 정의 네트워크와 네임서비스

  • 도커는 기본 브릿지 외 사용자 정의 네트워크(bridge, overlay 등)를 만들 수 있음
  • 사용자 정의 네트워크에서는 컨테이너 이름으로 DNS(내장 네임서버 기능)로 서로 통신 가능
    • 예: ping nginx_practice처럼 컨테이너 이름으로 접근

보안과 네트워크 정책

  • 네트워크별 격리, 방화벽(iptables) 설정, 네트워크 정책, 옵션별 암호화 등 다양한 보안 기법 적용 가능
  • 컨테이너끼리는 동일 네트워크에 있을 때만 기본적으로 통신, 네트워크 간 트래픽 제어 가능

활용 방법

  • 웹 서비스: bridge 네트워크 + 포트포워딩
  • 단일포트 고성능: host 네트워크(단, 포트 점유에 유의)
  • 분산 클러스터: overlay
  • 격리 분석: none
  • 레거시 네트워크 통합: macvlan
  • 이름 기반 서비스 연결: 사용자 정의 네트워크 + 내장 DNS

도커 파일 전송 (transport)

1. 컨테이너 목록 확인

docker container ls

  • 목적: 현재 실행 중인 도커 컨테이너 목록과 정보(CONTAINER ID, 이미지, 명령어 등) 조회.
  • 아래처럼 여러 컨테이너(ubuntu, zookeeper, buildkit 등)가 실행 중임을 확인할 수 있습니다.

2. 파일을 컨테이너로 복사

docker container cp <호스트경로> <컨테이너ID>:<컨테이너경로>

docker container cp ./file.txt 130c0e0a69ea:/home
  • 동작: 로컬(호스트) 디렉터리의 file.txt를 컨테이너 ID가 130c0e0a69ea인 ubuntu 컨테이너의 /home 폴더로 복사.
  • 성공 메시지: "Successfully copied 2.05kB to 130c0e0a69ea:/home"
  • 활용 예: 애플리케이션 설정, 데이터 파일 등을 컨테이너 내부로 주입하거나 실험 파일 업로드 시 유용.
  • 호스트 → 컨테이너 방향임

3. 파일을 컨테이너에서 호스트로 복사

docker cp <컨테이너ID>:<컨테이너경로> <호스트경로>

docker cp 130c0e0a69ea:/home/file2.txt .
  • 동작: 컨테이너 내부 /home/file2.txt 파일을 현재 호스트 디렉터리(프로젝트 폴더 등) 로 복사.
  • 성공 메시지: "Successfully copied 2.05kB to ..."
  • 활용 예: 로깅, 결과물 수집, 컨테이너 내부에서 생성된 데이터 백업, 디버깅 등.
  • 컨테이너 → 호스트 방향임
반응형

댓글