[docker] 도커 네트워크

pipi·2023년 7월 23일
1

인프라

목록 보기
8/12

k8s 네트워크를 공부하기전, docker에 대해 먼저 알아보자.
docker에서 각 컨테이너 ip는 어떤 원리로 할당되는 걸까?

1. 격리된 환경

docker는 컨테이너 각각의 격리된 환경을 제공해준다.
이를 위해 linux 격리 기술인 namespace를 사용한다.
이는 네임스페이스라는 격리된 공간에, 커널 리소스(자원)를 격리하는건데, 이때 네트워크도 격리가 가능하다.
네트워크 네임스페이스를 NET namespace라고 하는데, 이를 통해 컨테이너는 각자만의 격리된 network 공간을 할당받는다.

그렇다면, 격리된 공간끼리 어떻게 통신을 할까?
공간이 격리되어있다고 해도, 아무 설정도 하지 않으면 격리로 끝날 뿐, 연결은 따로 해줘야 한다.

2. 호스트 <-> 컨테이너 통신

먼저, 호스트와 컨테이너(격리된 네임스페이스)를 연결하기 위해선, 가상 인터페이스인 veth를 생성한다

veth 는 2개의 인터페이스가 쌍으로 동작하는데, 예를들어 인터페이스 한쪽에 패킷이 들어오면, 다른 한쪽으로 나간다.
그렇기에, 하나는 namespace(컨테이너)에, 한쪽은 외부(호스트)에 생성하면, 호스트와 컨테이너가 통신이 가능해진다.

즉, 컨테이너가 증가할때마다 각 컨테이너에는 veth 인터페이스가 존재하며, 이와함께 host에도 veth 인터페이스가 똑같이 생성된다.

즉, 호스트와 컨테이너는 veth 쌍을 통해 통신한다.
(참고로 veth인터페이스는 컨테이너가 생성될때 도커엔진이 자동으로 생성해준다.

어떤 자료에서는 컨테이너 입장에서는 가상의 veth가 eth0가 마찬가지이므로(현재 host도 가상머신이라 따지고보면 veth인데 eth0으로 표현해준것) 이와같이 표시한 경우도 있다.

그러면 컨테이머너와 호스트 사이 통신은 해결되었는데
아직 host의 eth과 연결되지 않았기에, 외부로도 통신이 안되고, 컨테이너끼리도 통신이 안되는 상태다.

2. 외부 + 컨테이너 끼리 통신

이제 외부와 통신하거나, 컨테이너끼리 통신하기 위해, 새로운 네트워크 인터페이스를 도입해야 한다.

기본적으로 bridge 방식을 사용하는데, 이는 중간에 gateway를 두어, 동일한 네트워크에 둠으로써 컨테이너끼리 통신을 가능하게 한다.
또한 해당 bridge는 host ethernet 인터페이스와 연결되어있기에, 외부로 통신도 가능해진다.

컨테이너와 호스트 사이에 위치하며, host eth0와 직접적으로 연결되기에, 외부와 통신이 가능해진다.

실제 ip가 배정된 사진이다.
기본적으로 설정된 subnet은 다음과 같기때문에, 컨테이너는 172.17.x.x으로 ip를 할당받게 되고, 동일한 네트워크안에서 통신이 가능해진다.


참고로, 도커에서 기본 subnet은 172.17.0.0/16이며, 조정 가능하다. 잠시 쿠버네티스로 넘어가자면, node가 여러개면 각 node의 pod(컨테이너)에 다 동일한 ip가 할당될 것이다.(조정을 하지 않을 경우)
pod는 다 고유 ip가 있다고 들었는데, 이는 어떻게 되는 걸까? 이건 다음 포스팅에서 소개하겠다..! 사실 쿠버네티스를 위한 포스팅이었다!

https://speakerdeck.com/devinjeon/kubernetes-neteuweokeu-ihaehagi-1-keonteineo-neteuweokeubuteo-cniggaji?slide=17
해당 자료를 참고했으며, 중간에 제 지식이 부족했던 부분은 여러 블로그를 참고했습니다. 그렇기에 오류가 많을 수 있어, 많은 피드백 부탁드립니다!

1개의 댓글

comment-user-thumbnail
2023년 7월 23일

오호~ 역시 인프라에 있어서 docker는 중요한 것 같습니다! 굿굿

답글 달기

관련 채용 정보