본문 바로가기
Development Tools/Docker

Docker Network 구성하기

by jjerryhan 2018. 1. 2.
반응형

Docker Network 구성하기

Microservice 의 근간은 여러 복수의 Micro Container 들을 이용한 Orchestration 입니다. 

한번 풀자면, 원본 서비스 이미지를 이용한 컨테이너 복사본들을 수십, 수백, 수천개 띄워서 확장성과 지속적인 변경 (C/I, C/D) 을 지원할 수 있게 한다는 거지요.

더 쉽게 풀자면, 서비스 초기 사용자가 1000 명이다 하면 http 서버, db 서버, was 또는 app 서버를 하나의 컨테이너에 얹어서 구동!

사용자가 10만이 되었더니 db 가 힘들어 하면 db 서버만 따로 별도 컨테이너로 분리해서 구동!

사용자가 50만이 되었더니 app 서버랑 db 서버가 힘들어 하면 http 서버 컨테이너 2개, app 서버 컨테이너 4개, db 서버 컨테이너 6개로 분리해서 구동!. 

이런식으로 컨테이너들을 분리해서 언제든 확장 가능하게 만드는 것이구요. db 서버중 일부분에만 패치, app 서버를 보다 더 작은 단위 (서비스 단위, 업무 단위, EndUser 플랫폼 단위 등등) 으로 더 쪼개서 컨테이너를 구성하고 서비스를 관리하는 것이죠. iOS 용 컨테이너 따로, Android 용 컨테이너 따로, Node 용 컨테이너 따로, Java 용 컨테이너 따로, Cache 용 컨테이너 따로 등 필요한 만큼 분리하고 쉽게 관리하기 위한 목적인 Docker 에 기반한 Microservice 의 근간입니다.  


뭐 암튼 이렇게 컨테이너를 분리하게 되면 각 컨테이너를 서로 바라봐야 할 텐데요. 당연히 network 로 구성해서 서로 바라보게 하면 되겠죠. 

간단히 이를 위한 Docker Network 구성방법을 알아 보겠습니다. 



사실 Docker 컨테이너들을 서로 연결시켜 주는 방법은 link 를 사용하는 방법과 network 를 사용하는 두 가지 방식이 있습니다. 

하지만 이 포스트는 그냥 제가 공부하고 있는 것들을 기록하기 위한 목적이기도 하고, 굳이 legacy 한 link 를 사용할 이유가 없어 link 는 상세히 기록하지 않을 예정입니다.  


Name 을 부여하여 Container 구동하기(Legacy)

docker run 을 수행할 때 --name  옵션을 부여하여 container 에 이름을 부여할 수 있습니다. 
docker run -d --name prod-mongo mongo

Name 을 이용하여 Container Link 하기(Legacy)

docker  run 을 수행할 때 부여된 name 을 이용하여 container 상호간에 link 를 시킬 수 있습니다. 

docker run -d --link prod-mongo:mongo jjerryhan/node

이렇게 하면 서로 link 되고 같은 범위의 네트워크로 구성되서 참조할 수 있습니다.  뭐 그렇습니다. 


Docker bridge network 생성하기

이런식의 link 방식의 가장 큰 문제점은 Compose 또는 Orchestration 에 많은 불이익이 발생한다는 점입니다.  Scale 관리 측면에서도 그렇구요. 

따라서 최근에는 link 방식이 아닌 bridge network 를 생성하여 network layer 로 서로 참조되도록하여 완벽한 분리 환경을 구성하는 방식으로 사용하고 있습니다. 


link 방식과 달리 우선 독립적인 bridge network 를 먼저 생성합니다.  

docker network create --driver bridge [network name]

생성된 network 현황은 network ls 명령으로 조회 가능합니다. 

docker network ls



생성된 network 상황 조회하기

네트워크에 대한 상세한 내용 확인은 inspect 명령어를 통해 가능합니다. 

docker network inspect [network id]

위에서 생성된 bb36a26d220e 네트워크를 조사해 볼까요? ID 중 두 글자(bb)만 입력해도 됩니다. 

isolated_network 는 subnet 172.18.0.0 대역을 갖고, gateway 172.18.0.1 을 갖는 것을 확인 할 수 있습니다.


생성된 network 에 join 하기

네트워크가 생성되면 이후 container 구동시에 대상 네트워크를 지정하여 생성된 network 에 컨테이너를 참여시킬 수 있습니다. 

docker run -d --net [조인할 network 이름] ...

아래 예제는 사전에 구성한 isolated_network 이름의 네트워크에 mongodb 컨테이너를 조인시키는 예시 입니다.


구동 후에 해당 네트워크를 다시 확인해 보면,


docker network inspect [network id] 

보이는 것 처럼, mongodb 컨테이너가 네트워크에 조인되었고, ip 를 172.18.0.2 로 배정되었음을 확인 할 수 있습니다. 

이후 다른 컨테이너 구동시에 동일네트워크 대역으로 join 하는 경우, mongodb 이름으로 db 서버를 사용하도록 구성하면 해당  컨테이너에 접속되어 사용하게 됩니다. 


Network 제거하기

사용이 완료된 모든 리소스는 제거해 주어야 겠죠?
컨테이너와 마찬가지로 network 도 사용이 완료되면 rm 명령어로 제거할 수 있습니다.
 docker network rm [삭제할 network 이름]



모든 리소스 제거하기

사용이 완료된 모든 리소스를 제거하기 위해 id 들을 list 하고 다시 모두 타이핑 하기 번거롭습니다. 

도커는 unix shell 과 같은 방식의 변수 참조를 지원하기 때문에 아래와 같이 모든 실행종료된 container 를 한번에 삭제할 수 있습니다. 

참조하세요. 

docker rm $(다른 도커 명령어)

아래 예제는 docker rm 명령어에 전달할 컨테이너 id 목록을 docker ps -a 명령어 결과로 전달한 예제입니다.



다음엔 network 를 구성하고 복수의 컨테이너들을 묶어서 관리하는 docker compose 에 대해 다뤄보도록 하습니다.

여기까지 읽어주셔서 감사합니다. 

이번 포스트는 여기까지 입니다.