1. 도커 DNS
1) 개념
- 사용자 정의 네트워크 내부 컨테이너의 이름을 자동으로 확인하도록 도커 호스트에 생성
- 127.0.0.11 대역 활용
- docker0에는 작동하지 않음
- 동일 network alias 할당을 통해 round robin 방식으로 응답 → 로드밸런서처럼 사용할 수 있음
- 컨테이너 생성 시 호스트 시스템에서 다음 세 파일을 복사하여 컨테이너 내부에 적용 → 컨테이너간 이름 조회 가능
① /etc/hostname
② /etc/hosts
③ /etc/resolv.conf
2) DNS 조회 방식
- 도커 DNS는 libnetwork라는 sandbox의 구현체에 구현
- 핵심 네트워킹 및 서비스 검색 기능 제공 → 등록된 모든 컨테이너를 이름으로 찾게 도와줌
- --name 혹은 --net-alias에 명칭을 적으면 DNS에 등록되는 방식
① ping 컨테이너명 입력
② DNS resolver를 이용하여 컨테이너 내부에 등록된 이름인지 검색
③ 컨테이너 내부에 등록된 이름이 아니라면 도커엔진 내의 DNS 서버에 질의
④ 질의한 타겟에게 결과를 전달
⑤ 최종적으로 전달된 내역을 토대로 연결
2. 도커 DNS 실습
먼저, dnsnet이라는 네트워크를 생성해준다.
route 명령어로 확인해보면 172.19 대역에 배정되어 있는 것을 확인할 수 있다.
$ docker run -d --name=es1 --net=dnsnet --net-alias=esnet-tg \
-p 9201:9200 -p 9301:9300 -e "discovery.type=single-node" elasticsearch:7.17.10
$ docker run -d --name=es2 --net=dnsnet --net-alias=esnet-tg \
-p 9202:9200 -p 9302:9300 -e "discovery.type=single-node" elasticsearch:7.17.10
위와 같이 elasticsearch를 이용하여 컨테이너 2개를 실행해준다.
이때 --net-alias 옵션을 통해 esnet-tg이라는 타겟 그룹을 생성해줬고, 이를 통해 현재 그룹은 1개인데 컨테이너는 2개가 된 상태이다.
조회해보면 위와 같이 컨테이너 2개가 잘 돌아가고 있는 것을 확인할 수 있다.
위와 같이 inspect 명령어로 조회하여 해당 컨테이너들의 IP를 기억해두고 진행한다.
$ docker run -it --rm --name=request-container --net=dnsnet busybox nslookup esnet-tg
사용자 정의 네트워크에 DNS 기능이 자동으로 활성화되는지 확인해보기 위해 busybox라는 이미지의 컨테이너를 실행한 후 busybox의 nslookup 기능을 이용하여 esnet-tg을 조회해보면 DNS 관련 정보를 확인할 수 있다.
위와 같이 해당 서버 IP 주소로 조회해보면 각 컨테이너가 등록된 DNS 서버의 이름이 정확하게 나오는 것을 확인할 수 있다.
es3이라는 컨테이너를 띄워준 후 다시 조회해보면 마찬가지로 잘 등록되어 있고,
elasticsearch의 특성 상 9200번 포트를 모두 열어야 하므로 같은 네트워크를 사용하는 centos를 활용해 조회해보도록 한다.
centos:8 버전의 컨테이너를 띄운 후 bash로 진입하여 alias로 설정했던 esnet-tg 그룹에서 9200번 포트를 사용하는 모든 요소를 검색해보면 위와 같은 정보를 확인할 수 있고, 해당 name을 기억한 후 같은 명령을 다시 내려본다.
위와 같이 name 부분이 계속 달라지는 것을 볼 수 있고, 이는 라운드로빈 형태로 최대한 순회하여 컨테이너 접속을 하고 있는 것을 의미한다.
$ docker inspect 컨테이너명
컨테이너에서 alias에 대한 정보는 위와 같이 inspect 명령어로 확인할 수 있다.
3. 도커 DNS로 Load Balancing 구현하기
먼저, lbdns라는 새로운 네트워크를 생성해주었고, route 명령어로 조회해보면 172.20 대역을 사용하고 있는 것을 확인할 수 있다.
위 명령어를 이용하여 lbdns 네트워크를 이용하고 nnet-tg이라는 별명을 가진 nlb1과 nlb2 컨테이너를 실행해주었다.
위와 같이 해당 컨테이너의 IP 주소를 알 수 있다.
등록된 DNS를 확인하기 위해 dnsutil을 설치해주었고, dig [타겟그룹명] 명령어를 사용하여 조회할 수 있다.
dns를 이용한 로드밸런싱을 확인하기 위해 nnet-request라는 컨테이너를 생성 및 실행했다.
bash로 접속 후 위와 같이 ping 명령어를 날려보면 nnet-tg이라는 그룹에 들어오는 요청을 nnet-tg에 속한 IP들로 랜덤하게 배분하는 것을 확인할 수 있다.
'네트워크캠퍼스 > DOCKER' 카테고리의 다른 글
컨테이너 프록시 (0) | 2024.02.08 |
---|---|
사용자 정의 네트워크 실습 (0) | 2024.02.07 |
도커 사용자 정의 네트워크 구성 (0) | 2024.02.06 |
도커 네트워크 (0) | 2024.02.05 |
아틸러리를 활용한 스트레스 테스트 (0) | 2024.02.05 |