[Docker Container] 도커 컨테이너 네트워크

2019. 10. 23. 17:05Engineering/Container&Kubernetes

Contents

1. Default Networks

2. Bridge Network

3. Bridge Network 실습


 

Docker Container가 제공하는 네트워크 설정에 대해 알아봅니다. 


1. Default Networks

Docker를 설치하면 기본적으로 아래와 같이 3개의 network가 자동 생성 됩니다. 

($ docker network ls 명령어를 통해 네트워크 목록을 조회할 수 있습니다.)

1.1 bridge 

bridge 네트워크는 docker container의 default 설정 네트워크 입니다. 

$docker run --network={NETWORK} 와 같이 네트워크 옵션을 사용하여 특정 네트워크를 지정하지 않는 경우, bridge 네트워크를 사용하게 됩니다. 

 

host 내부에 container마다의 IP를 할당하여 각 컨테이너의 패킷 포워딩을 관리 합니다. 

 

docker를 설치하게 되면 docker 호스트에는 docker0 라는 네트워크 인터페이스가 생성되는데,

bridge네트워크를 사용하는 컨테이너들은 모두 이 docker0 네트워크 인터페이스에 연결됩니다. 

 

컨테이너와 docker0 인터페이스에 연결관계에 대한 자세한 설명은 2장에서 계속합니다.

 

1.2 host

host 네트워크는 host의 네트워크 인터페이스를 컨테이너가 그대로 사용합니다.  

따라서 컨테이너와 호스트 간 네트워크 격리가 필요 없는 경우 사용합니다. 

 

host로 들어온 패킷을 contianer가 바로 전달 받게 됩니다. 

 

1.3 none

말 그대로 아무 네트워크를 사용하지 않습니다.

따라서 none 네트워크를 사용하는 컨테이너는 오직 local loopback 네트워크 인터페이스만을 갖습니다. 

 

1.4 container

기존에 생성된 container와 동일한 네트워크 인터페이스를 사용합니다.

$ docker run --net=container:{containerID} 와 같은 명령으로 설정 가능합니다. 

 

2. Bridge Network

1.1절에서 설명 했듯이. bridge network는 docker0 인터페이스에 컨테이너들을 연결하는 구조 입니다. 

다른 블로그에서 잘 설명되어 있는 그림이 있어 아래 가져 왔으니 참고하시기 바랍니다. 

 

아래 그림을 이해하기 위해서는 veth 를 알아야 합니다. 

veth 는 virtual ethernet device라는 리눅스 네트워크 인터페이스 입니다. 

간단히 하나의 network를 여러개의 namespace로 격리하여 외부와 통신가능하도록 하는 인터페이스로 이해하면 됩니다.  

 

 출처 : https://bluese05.tistory.com/15

 

하나의 container가 생성될 때 마다 하나의 veth가 생성됩니다.

생성된 veth는 host에서 'vethXXX' 와 같은 이름으로 표기됩니다. 

각 container 내부(namespace 내부)에서 해당 veth는 'eth0' 인터페이스로 표기되며, 

이 인터페이스는 namespace로 격리되어 있기 때문에 host에서는 보이지 않습니다.

 

veth들은 bridge를 통해 docker0 인터페이스에 연결되며,

컨테이너의 모든 패킷들은 docker0 인터페이스를 거치게 됩니다. 

실제로 bridge network의 각 컨테이너들은 docker0 인터페이스의 IP 주소를 gateway로 사용합니다. 

 

3. Bridge Network 실습 

1개의 docker host에 busybox1, busybox2 라는 2개의 컨테이너가 bridge netowrk로 실행되는 환경에서 각 네트워크 인터페이스를 확인해 봅니다. 

 

호스트와 각 컨테이너들의 네트워크 정보를 ifconfig 명령어를 통해 확인해봅니다. 

@호스트

@busybox1 컨테이너

@busybox2 컨테이너

docker0 인터페이스는 172.17.0.1의 IP 주소를 가지며,

컨테이너가 생성 될 때마다, 172.17.0.0/16 ragne 안의 IP 주소가 각 컨테이너 할당 됨을 확인할 수 있습니다. 

 

 

다음으로 각 컨테이너의 gateway가 docker0로 설정되어 있는지 확인합니다. 

@busybox1,  busybox2 컨테이너

두 컨테이너 모두 gateway 주소로 docker0의 IP 주소인 172.17.0.1을 가르키고 있는것을 확인할 수 있습니다. 

 

 


Reference

https://docs.docker.com/v17.09/engine/userguide/networking/

https://bluese05.tistory.com/15

 

Docker Network 구조(1) - docker0와 container network 구조

Docker Network 구조(1) - docker0와 container network 구조 [Contents] 1. Docker Network 구조(1) - docker0와 container network 구조 2. Docker Network 구조(2) - Container network 방식 4가지 3. Docker N..

bluese05.tistory.com