개요
도커(Docker)는 컨테이너화된 애플리케이션을 위한 다양한 네트워크 모드를 제공합니다.
각 네트워크 모드는 서로 다른 사용 사례와 요구사항을 충족시키기 위해 설계되었습니다.
docker network ls
위와 같이 ls 명령어로 현재 네트워크 목록을 확인하면 아래와 같이 3가지의 네트워크 모드가 존재하는 것을 알 수 있습니다.
bridge, host, none 이외에도 추가적으로 Ipvlan,Macvlan도 존재하는 데 본 글에서는 이 도커의 주요 네트워크 모드들을 정리하고자 합니다.
Bridge 네트워크 모드란❓
Bridge 네트워크는 도커의 기본 네트워크 모드입니다.
도커의 브릿지 네트워크 모드는 컨테이너들이 서로 통신할 수 있게 해주는 가상의 네트워크 브릿지를 생성합니다.
왼쪽 그림에서 볼 수 있듯이 "mybridge"라는 브릿지가 여러 컨테이너들을 연결하는 중간 다리 역할을 합니다.
브릿지 네트워크의 중요한 특징 중 하나는 외부 네트워크와의 통신입니다.
이미지에서 볼 수 있듯이, 호스트 시스템은 192.168.1.2라는 IP를 가지고 있으며, 이를 통해 컨테이너들이 외부 네트워크와 통신할 수 있습니다.
예를 들어, web 컨테이너의 5000번 포트는 호스트의 8000번 포트와 매핑되어 있어, 외부에서 접근이 가능합니다.
이처럼 브릿지 네트워크 모드는 컨테이너 간의 격리된 통신 환경을 제공하면서도, 필요한 경우 외부와의 통신도 가능하게 만드는 유연한 네트워킹 솔루션입니다.
도커 브릿지 네트워크 모드의 특징
- 기본적으로 컨테이너 간 격리된 네트워크를 제공
- "docker network create" 명령어로 사용자 정의 브리지 네트워크 생성 가능
- "-p 옵션"을 사용하면 컨테이너 포트를 호스트와 연결 가능
사용 예시
1. 기본 브릿지 네트워크 사용
# 기본 브릿지 네트워크로 nginx 컨테이너 실행
docker run -d nginx
# 포트 매핑과 함께 실행
docker run -d -p 8080:80 nginx
위와 같이 명령어를 실행하면 nginx 컨테이너가 생성되며 자동으로 기본 브릿지 네트워크('docker0')에 연결됩니다.
첫 번째 명령어는 단순히 백그라운드에서 컨테이너를 실행하는 반면, 두 번째 명령어는 포트 매핑을 추가하여 호스트의 8080 포트를 통해
외부에서 nginx 웹 서버(컨테이너의 80 포트)에 접근할 수 있게 됩니다.
2. 사용자 정의 브릿지 네트워크 생성 및 사용
# 새로운 브릿지 네트워크 생성
docker network create myapp-network
# 네트워크에 컨테이너 연결
docker run -d --name backend --network myapp-network mongodb
docker run -d --name frontend --network myapp-network -p 3000:3000 nginx
위와 같이 명령어를 실행하면 먼저 'myapp-network'라는 사용자 정의 브릿지 네트워크가 생성됩니다.
그 다음 MongoDB 컨테이너와 Nginx 컨테이너가 이 네트워크에 연결되어 실행되며, 두 컨테이너는 서로 통신이 가능합니다.
frontend 컨테이너는 포트 매핑(3000:3000)이 설정되어 외부에서 접근할 수 있으며, --name 옵션으로 지정된 이름을 통해 컨테이너들은 서로를 찾을 수 있습니다.
언제 사용하는 것이 좋을까❓
- 일반적인 MSA환경에서 컨테이너 간 통신이 필요할 때
- 여러 독립적인 서비스(웹 서버, API 서버, 데이터베이스 등)가 서로 통신해야 하는 상황
- 각 서비스를 독립적으로 관리하면서도 안전한 네트워크 통신이 필요한 경우
- 포트 바인딩을 통해 외부에서 컨테이너에 접근할 때 (-p 8080:80)
- 웹 서버나 API 서버를 외부에 노출시켜야 하는 경우
- 특정 포트만 선택적으로 외부 접근을 허용하고 싶을 때
- 호스트의 포트를 통해 컨테이너의 서비스에 안전하게 접근해야 할 때
Host 네트워크 모드란❓
호스트 네트워크 모드는 컨테이너가 Host의 네트워크를 직접 사용하는 모드입니다.
즉, Host 컴퓨터와 동일한 네트워크 환경 사용
컨테이너가 호스트의 네트워크 네임스페이스를 그대로 사용하기 때문에 별도의 네트워크 격리가 없습니다.
도커 Host 네트워크 모드의 특징
- 컨테이너가 호스트의 네트워크를 직접 사용하므로 네트워크 성능이 가장 좋음
포트 매핑이 필요 없음- 네트워크
격리가 되지 않아 보안상 취약할 수 있음 - 호스트의 네트워크 인터페이스를 직접 사용하므로 네트워크 관련 설정이 단순화됨
사용 예시
# 호스트 네트워크 모드로 nginx 실행
docker run -d --network host nginx
위 명령어를 실행하면 nginx 컨테이너가 호스트의 네트워크를 직접 사용하게 되어, 별도의 포트 매핑 없이 호스트의 80포트로 직접 접근이 가능합니다.
언제 사용하는 것이 좋을까❓
- 네트워크 성능이 중요한 경우
- 대용량 데이터 처리가 필요한 서비스
- 지연 시간에 민감한 애플리케이션
- 호스트 수준의 네트워크 기능이 필요한 경우
- 네트워크 모니터링 도구
- 호스트 네트워크 스택을 직접 조작해야 하는 경우
- 컨테이너 간 네트워크 격리가
필요 없는단일 컨테이너 환경
None 네트워크 모드란❓
None 네트워크 모드는 말 그대로 컨테이너의 모든 네트워크를 비활성화하는 모드입니다.
컨테이너가 완전히 격리된 네트워크 환경에서 실행되며, 외부와의 모든 네트워크 연결이 차단됩니다.
도커 None 네트워크 모드의 특징
- 컨테이너가 네트워크 인터페이스를 가지지 않음
- 외부와의 모든 네트워크 통신이 불가능
- 최대한의 네트워크 격리를 제공
- 컨테이너 내부에서는 localhost(loopback)만 사용 가능
사용 예시
# None 네트워크 모드로 컨테이너 실행
docker run -d --network none alpine
위 명령어를 실행하면 alpine 컨테이너는 완전히 격리된 네트워크 환경에서 실행되며, 외부와의 어떠한 네트워크 통신도 불가능합니다.
언제 사용하는 것이 좋을까❓
- 최대한의 보안이 필요한 경우
- 민감한 데이터를 처리하는 배치 작업
- 네트워크가 전혀 필요 없는 계산 작업
- 네트워크 접근을 완전히 차단해야 하는 경우
- 보안 정책상 격리가 필요한 작업
- 로컬에서만 실행되는 프로세스
IPvlan과 Macvlan이란❓
IPvlan과 Macvlan은 컨테이너에게 호스트의 네트워크 인터페이스에 직접 연결할 수 있는 권한을 주는 고급 네트워크 모드입니다.
Macvlan 모드
# Macvlan 네트워크 생성
docker network create -d macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 macvlan-net
# Macvlan 네트워크로 컨테이너 실행
docker run --network macvlan-net -d nginx
위 명령어에서 알 수 있듯이 Macvlan은 물리적 네트워크 인터페이스(eth0)에 직접 연결되며, 각 컨테이너에 고유한 MAC 주소와 IP 주소를 할당합니다.
subnet과 gateway를 지정하여 독립적인 네트워크 구성이 가능하며, 이를 통해 컨테이너가 마치 물리적 네트워크에 직접 연결된 것처럼 동작할 수 있습니다.
이는 특히 컨테이너가 물리 네트워크와 직접적인 통신이 필요한 경우나 특정 IP/MAC 주소가 필요한 레거시 애플리케이션을 컨테이너화할 때 유용합니다.
IPvlan 모드
# IPvlan L2 모드 네트워크 생성
docker network create -d ipvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 ipvlan-net
# IPvlan 네트워크로 컨테이너 실행
docker run --network ipvlan-net -d nginx
위 명령어에서 알 수 있듯이 IPvlan은 Macvlan과 유사하게 물리적 네트워크 인터페이스(eth0)에 연결되지만, 모든 컨테이너가 호스트의 MAC 주소를 공유하면서 각자 고유한 IP 주소만을 할당받습니다.
L2 또는 L3 모드로 동작할 수 있으며, -d ipvlan 옵션을 통해 IPvlan 드라이버를 지정합니다. subnet과 gateway 설정으로 네트워크 구성이 가능합니다.
이는 MAC 주소 제한이 있는 환경이나 더 나은 확장성이 필요한 경우에 Macvlan의 대안으로 사용됩니다.
각 네트워크 모드의 차이점
위 이미지처럼 Docker의 네트워크 모드는 Bridge, None, Host 세 가지 방식으로 나눌 수 있습니다.
- Bridge 모드
- docker0라는 가상 브릿지를 통해 컨테이너들이 연결되며, 각각 독립된 IP(172.17.0.x)를 할당받아 통신합니다.
- None 모드
- 완전히 격리된 네트워크 환경을 제공하여
외부와의 통신이 불가능합니다.
- 완전히 격리된 네트워크 환경을 제공하여
- Host 모드
- 호스트의 네트워크를 직접 사용하여 별도의 격리 없이 호스트의 포트를 그대로 사용합니다.
이처럼 각각의 네트워크 모드는 서로 다른 특징을 가지고 있으므로, 애플리케이션의 요구사항과 보안 정책에 따라 적절한 모드를 선택하여 사용해야 합니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커 네트워크 이해하기 (Docker network) (0) | 2025.02.09 |
---|---|
[Docker] Docker 컨테이너에서 호스트 머신에 접근하기: host.docker.internal (0) | 2025.02.02 |
[Docker] 도커 컨테이너 환경변수 설정 : ENV & ARG (0) | 2025.01.27 |
[Docker] 도커 바인드 마운트란 무엇일까❓: 데이터 저장과 실시간 공유 (0) | 2025.01.07 |
[Docker] Docker 컨테이너 데이터 관리: 익명 볼륨 vs 명명된 볼륨 (0) | 2025.01.06 |