728x90
반응형

안녕하세요. R-son입니다.

오늘 알아볼 내용은 바로 도커 네트워크입니다.

도커(Docker)는 다들 한 번쯤 들어보셨죠?!

 

도커(Docker)의 정의에 대해서 잠깐 집고 갈까요?


도커는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

도커는 호스트 서버 위에 도커 엔진을 설치하고 그 엔진 위에 컨테이너(격리된 프로세스 공간)를 실행한다.

잠깐 VMWare와 비교 설명을 해드리겠습니다.

, VMwareVirtual Machine은 호스트 서버 위에 게스트 서버를 두는 구조이지만

도커는 호스트 서버 위에 도커 엔진이라는 친구를 둡니다. 그리고 도커 엔진 위에서는 이미지가 담긴 컨테이너(독립적인 프로세스 공간)들을 올리는 구조입니다.

[여기서 이미지란 프로그램이나 환경설정 등의 정보가 담긴 그릇이라고 생각하면 됩니다.]

 

그럼 도커에 대해서는 간략히 설명하고 본론인 도커 네트워크에 대해서 살펴볼까합니다.

오늘은 3가지(브릿지 네트워크, 오버레이 네트웤, macvlan) 중에서 하나인 브릿지 네트워크를 알아보려고 합니다.

 

도커 브릿지 네트워크는 하나의 서버 머신 환경에서 여러 개의 컨테이너를 연결할 때 사용하는 네트워크를 의미하는데 리눅스의 네트워크 브릿지의 개념을 적용한 네트워크 방식입니다.


리눅스 네트워크 브릿지를 잠깐 설명드리면, 브릿지 안에는 여러 개의 포트들이 있고 그 포트들에 NIC들이 아래와 같이 연결되어있습니다., 브릿지는 각 포트에 대한 NICMAC주소를 테이블에 저장하고 있습니다.(1 참고)

1

PORT-1

a0:8e:17:45:11:3e

PORT-2

a0:8e:17:50:2b:6c

PORT-3

 

PORT-4

a0:8e:17:45:45:6a

 

이와 더불어 필요한 것이 MAC주소와 IP를 매핑하는 arp 테이블이 필요합니다. 예를 들어서 NIC-2의 컴퓨터 OS는 아래와 같은 arp 테이블 정보를 가지고 있습니다.(2 참고). 

2

IP 주소

MAC Address

172.17.0.3

a0:8e:17:50:2b:6c

172.17.0.4

a0:8e:17:45:45:6a

 

, NIC-1에서 172.17.03으로 패킷을 보내면 ARP테이블에서 MAC주소를 찾고 이를 OS에서 패킷에 MAC주소를 설정해서 브릿지에 보냅니다. 그러면 브릿지의 테이블(1)에서 MAC주소를 찾아 해당 포트로 패킷을 보내는 구조입니다. 조금 복잡하지만 하나씩 천천히 읽어보면 리눅스 브릿지 네트워크를 이해할 수 있을 겁니다.



 

도커의 브릿지 네트워크는 위에서 배운 리눅스 브릿지 네트워크를 활용합니다.

NIC가 도커에서는 컨테이너가 되구요~


 

. 그럼 다시 도커로 돌아와서, 도커의 브릿지 네트워크를 보겠습니다.

도커를 실행해서 #ifconfig docker0을 입력하면 브릿지 인터페이스를 확인 할 수 있는데요Docker0이 위에서 봤던 브릿지입니다.

여기서 컨테이너를 만들면 가상 인터페이스가 docker0에 연결됩니다.




연결 정보는 아래의 명령어를 통해서 확인할 수 있습니다. 저는 3개를 만들었어요~ 

※ interfaces 아래에 보시면 3개의 veth들이 보이는데, veth는 하나를 브릿지에 연결하고 다른 하나를 컨테이너에 연결합니다.

Brctl-utils를 이용해서도 확인할 수 있습니다.

#Brctl show docker0



그럼 연결된 정보를 상세히 보려면 #ifconfig 명령어를 통해서 볼 수 있습니다.

veth1~~, veth5~~, veth9~~ 보이시죠?!




컨테이너와 브릿지가 서로 연결되었네요

그럼 컨테이너들은 어떻게 외부와 통신할 수 있을까요?

그건 바로 IP 마스커레이드(Masquerade)가 가능하기 때문입니다. 마스커레이드는 NAT(네트워크 주소 변환)이라고도 불립니다

, 패킷 출발지 IP(Private IP)iptables를 이용해서 호스트가 가진 Public IP로 변환한 다음에 외부로 보냅니다.

Ex) 컨테이너 내 IP가 172.17.0.2에서 외부로 패킷이 나갈 때, iptables에서 공인IP(XXX.XXX.XXX.XXX)로 나갑니다.


Iptables –t nat –L을 통해 마스커레이드 설정을 확인할 수 있습니다.

#iptables –t nat –L

아래 이미지에서 MASQUERADE(마스커레이드) 설정을 확인할 수 있습니다. 


반대로 외부에서 내부 컨테이너로 어떻게 통신이 될 수 있을까요?

포트 포워딩(Port forwarding)이 있어 가능합니다!. 포트 포워딩이란 외부에서 공인IP의 특정 포트로 들어오는 패킷을 내부 네트워크로 보내는 기능입니다.


예를 들어, 공인IP(XXX.XXX.XXX.XXX:8000)으로 들어올 경우, iptables에서 8000을 내부 컨테이너 IP 172.17.0.3:80로 포워딩시켜줄 수 있습니다.

아래 이미지에서 DNAT(Destination NAT) 설정을 확인할 수 있습니다. DNAT는 포트포워딩이라고 보셔도 무방합니다.



도커에서는 -p 옵션을 사용하여 포트포워딩을 설정해줄 수 있습니다.

예시) #docker run -p 8000:80 -it ubuntu /bin/bash


기타 궁금하신 점은 댓글 부탁드려요~





728x90
반응형

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

도커 허브에 이미지 푸시 방법  (0) 2019.04.03
Docker 명령어 정리(기초편)  (0) 2019.03.11

+ Recent posts