도커는 단일 서버부터 대규모 마이크로서비스 배포까지 네트워크 격리, 통신, 확장성의 문제를 효과적으로 다루도록 설계된 컨테이너 네트워크 시스템을 갖추고 있습니다.
도커 네트워크의 기본 동작 원리
컨테이너, 네트워크, 그리고 호스트
- 도커 컨테이너는 기본적으로 네트워크 격리(네임스페이스 분리)를 통해 서로 독립된 네트워크 스택(IP, 포트 공간, 라우팅 테이블)을 할당받습니다.
- 단일 Docker 호스트(OS)에서 여러 컨테이너들이 각각 고유 IP주소를 받으며, 네트워크 유형에 따라 서로 다른 통신 경로와 격리 수준을 확보합니다.
컨테이너 네트워크 구조의 핵심

컨테이너가 네트워크를 사용하는 구조적 원리는 다음과 같습니다:
- 컨테이너 내부 인터페이스
- 컨테이너 내부에는 eth0와 같은 가상 네트워크 인터페이스가 자동 생성되며, 네임스페이스 내에서만 보입니다.
- 호스트 통신 연결
- 컨테이너의 eth0는 호스트의 veth(virtual ethernet pair)와 연결되어 있고, 이 veth는 도커 네트워크 브릿지(docker0) 혹은 사용자 정의 네트워크와 접속됩니다.
- 외부 네트워크 라우팅
- 기본 브릿지는 호스트의 실제 물리 네트워크 인터페이스(예: enp0s3, eth0 등)에 라우팅되어 있습니다.
도커 네트워크 드라이버
기본 드라이버와 동작 원리
| 네트워크 타입 | 설명 |
| bridge | 기본값. 단일 호스트 내 컨테이너 간 통신. 가상 브릿지(docker0) 통해 연결 |
| host | 컨테이너가 호스트와 네트워크 공간 공유(포트점유 겹침). 리눅스에서만 의미 있음 |
| none | 네트워크 미할당(완전 격리). 네트워크 디바이스 없음 |
| overlay | 다중 호스트 간 컨테이너 네트워크(클러스터/오케스트레이터 환경에서 사용) |
| macvlan | 컨테이너에 물리적 NIC 수준의 주소(별도 MAC) 부여 |

상세 구조: bridge 네트워크 예시
도커를 설치하면 자동으로 bridge 네트워크(docker0)가 생성됩니다.
- docker0 자체는 리눅스 커널의 브릿지 장치입니다.
- 새로운 컨테이너가 생성되면, 다음 흐름이 따라갑니다:
- 컨테이너 내부에 eth0생성 → veth 가상 NIC 쌍(vethXXX)이 함께 생성
- veth의 한쪽 끝은 컨테이너 내부, 다른 한쪽은 호스트의 브릿지에 연결
- 브릿지는 여러 컨테이너를 Layer2(스위치처럼)로 붙임, 로컬 통신과 외부 라우팅 지원
- 호스트 네트워크 인터페이스(예: 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 ..."
- 활용 예: 로깅, 결과물 수집, 컨테이너 내부에서 생성된 데이터 백업, 디버깅 등.
- 컨테이너 → 호스트 방향임
반응형
'System Engineering > Docker (도커)' 카테고리의 다른 글
| [Docker] 도커 스토리지 이론과 실습 (Volume, Bind Mount, tmpfs Mount (3) | 2025.08.06 |
|---|---|
| [Docker] 도커의 커널 매커니즘과 기술 (VFS, UnionFS, CoW, cgroups) (4) | 2025.08.06 |
| [Docker] 도커의 기본 아키텍처와 기능 (4) | 2025.08.06 |
| [Docker] GitHub Actions와 Docker Hub를 이용해 CI/CD 환경 구축하기 (1) | 2025.01.24 |
댓글