2019.04.16 - docker에서 실행한 컨테이너가 제대로 돌고 있을까? DNS RoundRobin check를 통해 컨테이너가 제대로 실행되는지 확인하기

어제 배운 Docker이 네트워크 컨셉을 recap하자면,

Host 위에서 기본적으로 컨테이너를 돌릴 수도 있지만 새로운 network bridge를 생성하고 그 위에서 컨테이너를 실행할 수 있다는 것이었다.

그리고 그 네트워크 브릿지 위에서 돌아가는 컨테이너들은 서로 간에 통신이 가능하다는 것이었다.

일단 네트워크를 새로 생성하고 (docker network create helloworld) 준비시킨다.

그리고 이제 새로운 컨테이너는 저 네트워크 위에서 run 시키는데 이 때 그냥 run을 하면 host의 네트워크에서 돌아가므로 옵션에 network명과 network-alias를 같이 주도록 한다.

(docker container run --rm -d --network dude --network-alias nginx --name nginx nginx)
* --rm : container가 stop되면 바로 지워버린다.
* -d : detached, 백그라운드에서 실행.
* --network-alias: 네트워크의 알리아스로 아이피주소나 아이디 값 없이 curl을 날리거나 할 수 있다.

자 이렇게 되면 내가 새롭게 생성한 network bridge(dude)에서 nginx가 돌아가고 있는 상태이다.

똑같은 녀석을 하나 더 만들자. 단 이름은 겹치지 않아야 하니 --name nginx2로 바꿔준다.
(네트워크 알리아스, 이름은 모두 다 nginx일 필요가 없다. 마지막에 이미지명만 nginx이면 되는데 그냥 헷갈리지 않게 통일했다.)

자 그럼 이제 2개의 nginx가 dude network에서 돌아가고 있다.

이 친구들한테 curl을 날려보고 응답을 받아보자.
이론 상으로는 nginx가 2개이므로 round robin 패턴에 따라 두 개의 id가 로테이션을 돌아야 한다. (100% 라운드로빈은 아니고 그냥 왔다갔다 하나보다)

그럴려면 curl 명령어를 사용하거나 (centos에서) 혹은 nslookup을 사용해야하는데 (alpine) 얘네들도 컨테이너로 돌려야 한다.

컨테이너로 돌리면서 추가 인자로 실행할 command만 주면 해당 컨테이너에서 커맨드를 실행하고, 우리는 해당 커맨드에 대한 리턴값을 받을 수 있다.

주의할 것은, 우리는 지금 dude라는 네트워크에서 컨테이너를 돌리고 있으니 당연히 curl이나 nslookup을 실행하는 컨테이너도 해당 네트워크 위에서 실행시켜야 한다.

명령어는 :

docker container run --net NETWORK_BRIDGE_NAME --rm alpine nslookup NETWORK_ALIAS
-> result show up

docker container run --net NETWORK_BRG_NAME --rm centos curl -s NETWORK_ALIAS:PORT
-> result show up
-> round robin check possible by checking its name (엘라스틱 서치는 자동으로 이름을 만들어주기 때문에 명령어를 칠 때마다 나오는 이름을 보고 라운드 로빈으로 도는지 알 수 있다.)

댓글

이 블로그의 인기 게시물

로컬 Tomcat 서버 실행속도 개선

2019.05.23 - SQLAlchemy 의 객체 상태 관리 (expire, refresh, flush, commit) 에 관한 이해

2020.02.17 Python의 multiprocessing 중 Pool.map(), chunksize에 관한 내용