🐳 Docker 시리즈 살펴보기 🐳
      1. Docker와 Container
      2. Dockerfile과 Docker Image
      3. Docker Volume
➡️  4. Docker Network
      5. Docker Compose

 

도커는 목적에 따라 다양한 종류의 네트워크 드라이버를 지원한다. 여러 종류의 드라이버가 있지만 많이 사용하는 네트워크 드라이버는 다음과 같다.

  • bridge : 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있게 해준다.
  • host : 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 실행할 수 있다.
  • overlay : 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해 사용한다.

 

🐳 Docker의 네트워크 구조

  • 컨테이너는 외부와 통신하기 위해 2개의 네트워크 인터페이스를 함께 생성한다.
    • 컨테이너 내부에는 eth0 네트워크 인터페이스가 생성된다.
    • 호스트에는 veth~(virtual ethernet)이라는 이름으로 시작하는 네트워크 인터페이스가 생성된다.
    • 컨테이너의 eth0와 호스트의 veth~는 쌍을 이룬다.
  • 도커를 설치하면 기본적으로 docker0라는 가상 네트워크 인터페이스가 생성된다.
    • 이는 도커가 자체적으로 제공하는 네트워크 드라이버 중 bridge에 해당한다.
  • veth는 docker0와 바인됭 된다.
  • docker0는 호스트의 eth0 인터페이스와 연결되어 외부와 통신하게 된다.
  • 네트워크 옵션을 주지 않고 컨테이너를 생성하면 기본적으로 docker0 브릿지를 통해 외부와 통신할 수 있는 환경을 제공한다.
    • 이것이 bridge 네트워크이다. 도커가 기본적으로 생성해주는 bridge 네트워크가 아닌 사용자가 bridge 네트워크를 생성하고, 이를 할당하는 방식도 가능하다.

 

🐳 Bridge Network

Mac이나 Window에서는 VM 안으로 감춰져 있어 docker0나 veth 같은 네트워크 인터페이스를 확인할 수 없다.

 

docker0 (host)

  • 도커를 설치하면 기본적으로 호스트 머신에 docker0 네트워크 인터페이스가 생성된다.

  • 따로 설정하지 않아도 도커를 설치하면 기본적으로 bridge 네트워크가 생긴다.
  • 이 bridge 네트워크를 상세 조회했을때, Gateway ip 가 호스트머신에서 조회한 docker0의 ip와 같음을 알 수 있다.
  • 따라서 우리는 기본 bridge 네트워크가 Gateway로 docker0 인터페이스를 사용한다는 것을 알 수 있다.

docker0 와 veth (host)

앞서 docker0는 veth 네트워크 인터페이스와 바인딩 되어 컨테이너와 통신한다고 했다.

  • veth 인터페이스가 docker0 와 바인딩 된 것을 확인 할 수 있다.
  • brctl: 이더넷 브릿지 관리 도구

eth0 (container)

  • 컨테이너 내부에서 veth~ 와 통신하기 위한 네트워크 인터페이스인 eth0이다.

 

✅ user-defined bridges VS default bridge

사용자가 따로 정의하지 않아도, Docker 시작과 동시에 default bridge network가 생기고, 따로 네트워크 설정을 하지 않으면 이 네트워크에 연결되어 컨테이너간 연결이 가능하다.

하지만 이를 사용하기 보단 네트워크를 새로 정의해 사용하는 것이 좋다. 이유는 무엇일까?

(사용자 정의 브릿지 네트워크란 docker network create 해서 생기는 네트워크를 말한다.)

 

1. 사용자 정의 브릿지는 컨테이너간 DNS 를 제공한다.

  • 기본 브릿지는 --link 옵션(deprecated)을 사용하지 않는 한 IP 주소로 서로 접근해야 한다.
  • 사용자 정의 브릿지는 DNS를 제공해 이름으로 컨테이너간 접근이 가능하다.

2. --network 설정을 하지 않은 (compose에서 network:) 컨테이너들은 모두 bridge 네트워크에 포함되기 때문에, 관련 없는 서비스들끼리 통신 가능해져 좋지 않다. 

 

3. 기본 브릿지 네트워크에서 컨테이너를 제거하려면 컨테이너를 중지하고 해야하지만, 사용자 정의 네트워크는 즉시 연결하거나 연결을 끊을 수 있다.

 

🐳 Docker Network CLI

명령어 설명
docker network connect 컨테이너가 이미 시작된 후 네트워크에 연결할 때 사용한다.
docker network create 새 네트워크를 생성한다.
docker network disconnect 컨테이너간 네트워크 연결을 끊는다.
docker network inspect 네트워크 상세 정보를 조회한다.
docker network ls 네트워크 목록을 조회한다.
docker network prune 쓰지 않는 모든 네트워크를 삭제한다.
docker network rm 네트워크를 삭제한다.