Docker Network

  • Docker 네트워크는 컨테이너 간 통신보안을 관리하는 도구입니다.
  • 컨테이너가 서로 데이터를 주고받을 수 있도록 경로를 제공하며, 네트워크 격리를 통해 보안을 강화합니다.

실제 비즈니스 애플리케이션을 컨테이너화할 때, 여러 개의 컨테이너가 서로 협력해야 목표를 달성할 수 있어요. 그래서 각각의 컨테이너가 서로 소통할 수 있는 방법이 필요하죠. 이를 위해 컨테이너들 사이에서 데이터 패킷을 주고받을 수 있는 경로, 즉 네트워크를 설정해야 해요. 도커에서는 이런 네트워크를 쉽고 효율적으로 구축할 수 있도록 도와주는 간단한 네트워크 모델을 만들었어요. 이 모델을 컨테이너 네트워크 모델(CNM)이라고 부른답니다. 이 모델은 컨테이너 네트워크를 구현할 때 필요한 기본 요건들을 정해줘요.


2. Docker Network 개념

구성 요소 설명
샌드박스 컨테이너를 외부 세계와 격리하며, 네트워크 요청을 안전하게 처리.
엔드포인트 샌드박스와 네트워크를 연결하는 접점으로, 데이터를 주고받는 역할.
네트워크 엔드포인트 간 데이터를 전달하는 경로로, 여러 컨테이너가 소속될 수 있음.

 

  • 하나의 네트워크 샌드박스 안에는 여러 개의 엔드포인트가 있을 수 있어요. 즉, 하나의 샌드박스 안에 있는 컨테이너는 네트워크에 전혀 연결되지 않거나, 여러 네트워크에 동시에 연결될 수 있어요. 가령, 세 개의 샌드박스 중 하나는 엔드포인트를 통해 두 개의 네트워크에 동시에 연결된 상태일 수 있죠.

 

  • 이 네트워크 모델은 꽤 범용적이에요. 개별 컨테이너가 네트워크에서 어디에서 작동하는지는 정하지 않아요. 모든 컨테이너가 한 호스트에서 실행될 수도 있고(로컬), 여러 호스트에 걸쳐 있을 수도 있어요(글로벌).

 

  • 물론 CNM은 그냥 네트워크가 어떻게 작동하는지 설명하는 모델일 뿐이에요. 실제로 네트워크를 사용하려면 CNM을 구현해야 해요. 로컬이든 글로벌이든, CNM을 구현하는 여러 방법이 있답니다.

 

  • 각 네트워크는 외부에서 오는 권한 없는 접근으로부터 리소스를 보호해서 더 많은 보안을 제공해요. 그래서 애플리케이션을 만들고 운영할 때 여러 네트워크를 사용하는 게 좋아요. 그리고 서로 꼭 통신해야 하는 서비스들만 같은 네트워크에 두는 거죠. 방금 본 예제에서는 웹 API가 데이터베이스와 직접 통신할 필요가 없으니까, 이 둘을 다른 네트워크에 두었어요. 이렇게 하면 만약 해커가 웹 API를 해킹해도, 제품 카탈로그 서비스를 먼저 해킹하지 않고서는 데이터베이스에 접근하기 어렵게 됩니다.

3. Docker Network 종류

종류  설명 특징
브리지 네트워크 Docker의 기본 네트워크로, 단일 호스트 내에서 컨테이너 간 통신 가능. IP 자동 할당, 포트 매핑으로 외부 연결 가능.
호스트 네트워크 컨테이너가 호스트 머신의 네트워크를 직접 사용. 높은 성능 제공, 네트워크 격리 불가.
오버레이 네트워크 다중 호스트 간 컨테이너를 연결하는 네트워크. Swarm 모드 또는 Kubernetes에서 사용, 분산 애플리케이션에 적합.
사설 네트워크 사용자 정의 네트워크로, 특정 컨테이너만 연결 가능. 격리된 환경 제공, 보안 강화.
macvlan 네트워크 컨테이너가 물리적 네트워크 인터페이스에 직접 연결. 고유 IP 주소 제공, 네트워크 트래픽의 격리 가능.

4. 실제와 유사한 사례

예제: API, 카탈로그, 데이터베이스 서비스 네트워크

  • 목표:
    • API는 카탈로그와 통신하지만, 데이터베이스와는 통신하지 않음.
    • 카탈로그는 두 네트워크 모두 연결.

구현 코드

# 네트워크 생성
docker network create --driver=bridge back
docker network create --driver=bridge front

# 컨테이너 생성 및 실행
docker run --name=webapi -itd --net=front ubuntu:14.04
docker run --name=catalog -itd --net=back ubuntu:14.04
docker run --name=database -itd --net=back ubuntu:14.04

# catalog 컨테이너를 front 네트워크에 추가 연결
docker network connect front catalog

# 각 컨테이너에서 네트워크 상태 확인
docker exec webapi route
docker exec catalog route
docker exec database route

# 네트워크 정보 확인
docker network inspect front
docker network inspect back

# 네트워크 통신 테스트
docker exec -it webapi bash
ping -c 1 catalog
ping -c 1 database  # 불가능
exit

docker exec -it catalog bash
ping -c 1 webapi
ping -c 1 database
exit

# 네트워크 및 컨테이너 정리
docker network disconnect front catalog
docker stop webapi catalog database
docker rm webapi catalog database
docker network rm back front

5. Docker Network 명령어

명령어 설명
docker network create <이름> 사용자 정의 네트워크 생성.
docker network ls 현재 생성된 네트워크 리스트 확인.
docker network inspect <이름> 특정 네트워크의 상세 정보 확인.
docker network connect <네트워크> <컨테이너> 컨테이너를 네트워크에 연결.
docker network disconnect <네트워크> <컨테이너> 컨테이너를 네트워크에서 분리.
docker network rm <이름> 네트워크 삭제. 컨테이너가 연결된 네트워크는 삭제 불가.

6. Docker Network 사용 이유

이유 설명
컨테이너 간 통신 여러 컨테이너가 데이터를 주고받으며 협력 가능.
보안 강화 네트워크 격리를 통해 외부 및 불필요한 통신 차단.
구조적 연결 서비스 간 통신 구조를 체계적으로 설계 가능.
다중 호스트 지원 오버레이 네트워크를 활용해 여러 호스트에 분산된 컨테이너 연결.

7. Docker Network의 장단점

장점 단점
네트워크 격리로 보안 강화. 복잡한 네트워크 설정 시 추가 학습 필요.
컨테이너 간 효율적 데이터 전송. 여러 네트워크 드라이버 사용 시 성능 차이 발생 가능.
다중 호스트에서도 네트워크 연결 가능. Swarm 모드 또는 Kubernetes 설정 필요.

8. 부가적으로 알아야 할 정보

  1. Bridge와 Host 네트워크 차이:
    • 브리지 네트워크는 컨테이너 간 독립적 IP와 네트워크 격리 제공.
    • 호스트 네트워크는 컨테이너가 호스트의 네트워크를 직접 사용해 높은 성능 제공.
  2. 오버레이 네트워크:
    • Swarm 클러스터에서 여러 호스트를 연결할 때 사용.
    • 분산 애플리케이션과 마이크로서비스 환경에서 필수적.
  3. macvlan 네트워크:
    • 고유 IP 주소를 컨테이너에 직접 제공해 외부 네트워크와의 원활한 통신 가능.
# back, front 네트워크 생성
docker network create --driver=bridge back
docker network create --driver=bridge front

# 각 서비스를 생성 및 실행
docker run --name=webapi -itd --net=front ubuntu:14.04
docker run --name=catalog -itd --net=back ubuntu:14.04
docker run --name=database -itd --net=back ubuntu:14.04

# catalog 서비스는 기본 back 네트워크 뿐만 아니라 front 네트워크에도 연결
docker network connect front catalog

# webapi 의 라우팅 테이블
docker exec webapi route

# catalog 의 라우팅 테이블
docker exec catalog route

# database 의 라우팅 테이블
docker exec database route

docker network inspect front # webapi / catalog
docker network inspect back # catalog / database


docker exec -it webapi bash
# 머신 안에서
ping -c 1 catalog # 가능
ping -c 1 database # 연결 불가능
exit

# 
docker exec -it catalog bash
# 머신 안에서
ping -c 1 webapi
ping -c 1 database

# 리소스 정리
docker network disconnect front catalog

docker stop webapi catalog database

docker rm webapi catalog database

docker network rm back

docker network rm front

 

 

'Docker > Docker' 카테고리의 다른 글

[Docker] Docker Volume  (0) 2025.02.05
[Docker] Docker 모니터링&로깅  (0) 2025.02.04
[Docker] Docker Compose  (0) 2025.02.03
[Docker] Dockerfile  (1) 2025.02.01
[CI/CD] Github Actions CI  (0) 2025.01.31

+ Recent posts