우와한 개발자

[Docker] Docker Networking이란? docker network driver 종류와 명령어 정리

by 우와한개발자

1. Docker networking란?

  • docker container 간의 통신을 가능하게 하는 기능
  • 컨테이너는 기본적으로 격리된 환경이라 네트워크 설정없이는 서로 통신하거나 연결이 안

 

1) 컨테이너 간 통신

  • 같은 네트워크에 속한 컨테이너는 이름으로 통신가능
  • IP 주소 또는 컨테이너 이름으로 통신 가능
  • 포트 매핑을 통해 외부에서 접근 가능

 

2) 컨테이너와 호스트 간 통신

  • bridge 네트워크를 사용하면 컨테이너는 호스트의 IP 주소를 통해 호스트와 통신 가능

 

3) 컨테이너와 외부와의 통신

  • 포트 매핑(p)을 사용하여 호스트 또는 외부의 특정 포트를 컨테이너의 포트로 매핑
  • 나가는 트래픽(Outbound): NAT를 통해 컨테이너의 사설 IP를 호스트 IP로 변환해서 인터넷으로 내보냄
  • 들어오는 트래픽(Inbound): 포트 포워딩 필수

 

❓포트 포워딩(Port Forwarding)
- 특정 포트로 들어오는 트래픽을 다른 곳으로 전달해주는 것
- 집에있는 공유기의 와이파이 비밀번호가 아니라 공유기의 비밀번호를 알면 포트 포워딩을 통해서 특정 포트로 들어오는걸 내 컴퓨터에 연결할 수 있음

 

2. Docker network driver 유형

  • 드라이버(Driver)
    • 어떤 장치나 기능을 동작시키는 방식을 정의한 장치/소프트웨어
  • 네트워크 드라이버(network driver)
    • 네트워크를 어떤 방식으로 구성할지 정의한 장치/소프트웨어

 

1) Bridge

# mybridge라는 가상 스위치를 호스트에 소프트웨어로 만들어 컨테이너들이 이 가상 스위치에 연결됨

      [tomcat-app] ──┐
      ↗  8080 포트    |
[브라우저]             ├── mybridge (가상 브릿지)── [Host]
      ↘  1521 포트    |
      [oracle-db]  ──┘
  • 가상 스위치
  • 같은 호스트 내에서 컨테이너들끼리 통신할수 있도록 해줌
  • docker가 설치되면 기본적으로 bridge 네트워크가 생성되어 있어서, 별도 네트워크 생성 없이도 컨테이너 간 통신이 가능함.(단, 기본 bridge는 컨테이너 이름 DNS가 안 되고 IP로만 통신가능)
# Bridge 방식 → 포트포워딩 필요
docker run -p 8080:80 nginx # 호스트 8080 → 컨테이너 80

 

2) Host

  • 컨테이너가 별도의 IP, 포트를 따로 안 가지지 않고 호스트의 IP와 포트를 그대로 사용
  • 포트 포워딩 설정 불필요
# Host 방식 → 포트포워딩 불필요
docker run --network host nginx # 그냥 호스트의 80포트가 바로 nginx

 

3) Overlay

  • 다른 호스트에 있는 여러 Docker 호스트에 걸쳐있는 컨테이너들이 서로 통신할 수 있게 해줌
  • docker swam같은 클러스터 환경에서 용이

 

4) Macvlan

물리 네트워크
      │
   스위치
      │
 ┌───────────────┐
 │   Host NIC    │
 │  (eth0)       │
 └─────┬─────────┘
       │
   macvlan network
       │
 ┌─────┴─────┐
 │           │
컨테이너1   컨테이너2
MAC: A      MAC: B
IP: 192.168.0.10
IP: 192.168.0.11

# 네트워크 입장에서는 PC, container, 서버 모두 하나의 장비처럼 보임
  • 테이너에 독립적인 MAC 주소를 가진 가상 네트워크 인터페이스를 만들어 주는 방식
  • MAC 주소를 기반으로 가상 네트워크 인터페이스를 생성하여 컨테이너에 할당함
  • MAC 주소 : 랜카드에 할당된 주소

 

⚠️ bridge vs macvlan
구분 bridge macvlan
네트워크 위치 호스트 내부 네트워크 실제 물리 네트워크
MAC 주소 호스트가 NAT 처리 컨테이너가 직접 MAC 가짐
외부에서 보기 호스트 하나만 보임 컨테이너도 하나의 장비처럼 보임
IP 내부 IP 실제 네트워크 IP

 

5) None

  • 네트워킹이 비활성화된 드라이버
  • 컨테이너가 네트워크와 완전히 격리됨
  • 네트워크 접근이 필요하지 않은 특정 작업에 사용

 

3. Docker network 주요 명령어

명령어 설명 예시
docker network ls 현재 Docker 네트워크 목록 조회 docker network ls
docker network inspect 특정 네트워크의 상세 정보 확인 docker network inspect my_network
docker network create 새로운 네트워크 생성 docker network create my_network
docker network connect 컨테이너를 네트워크에 연결 docker network connect my_network my_container
docker network disconnect 컨테이너를 네트워크에서 분리 docker network disconnect my_network my_container
docker network rm 네트워크 삭제 docker network rm my_network
docker network prune 사용하지 않는 네트워크 모두 삭제 docker network prune
docker network create --driver bridge 브리지 네트워크 생성 docker network create --driver bridge my_bridge_network
docker network create --driver overlay 오버레이 네트워크 생성 (멀티 호스트) docker network create --driver overlay my_overlay_network

 

4. Docker network 연결

# 네트워크 생성
docker network create mynetwork

# 컨테이너 생성 시 네트워크 연결
docker run -dit --name oracle21c -p 1521:1521 --network mynetwork jinkyoungheo/oracle-xe
docker run -dit --name tomcat10 -p 8888:8080 --network mynetwork tomcat:10

# 이미 실행 중인 컨테이너에 네트워크 연결
docker network connect mynetwork oracle21c
docker network connect mynetwork tomcat10

# 네트워크 연결 확인 (NetworkID가 같아야 함)
docker container inspect oracle21c
docker container inspect tomcat10

 

블로그의 정보

우와한개발자 님의 블로그

우와한개발자

활동하기