Docker πŸ“˜

[Docker] 도컀 DNS와 μ»¨ν…Œμ΄λ„ˆ proxy(Nginx)

kreal 2023. 9. 10. 16:29

Docker DNS

  • Docker μ»¨ν…Œμ΄λ„ˆλŠ” IPλ₯Ό μ‚¬μš©μž μ •μ˜ λ„€νŠΈμ›Œν¬μ˜ μ»¨ν…Œμ΄λ„ˆ μ΄λ¦„μœΌλ‘œ μžλ™ ν™•μΈν•˜λŠ” DNS μ„œλ²„κ°€ Docker ν˜ΈμŠ€νŠΈμ— μƒμ„±λœλ‹€. 
  • 동일 λ„€νŠΈμ›Œν¬ alias 할당을 톡해 ν•˜λ‚˜μ˜ νƒ€κ²Ÿ 그룹을 λ§Œλ“€μ–΄ μš”μ²­μ„ Round Robin λ°©μ‹μœΌλ‘œ μ‘λ‹΅ν•œλ‹€.

 

예제둜 λ§Œλ‚˜λ³΄μž

 

  • μ‚¬μš©μž μ •μ˜ λ„€νŠΈμ›Œν¬ 생성
docker network create fc-net

 

  • ν•˜λ‚˜μ˜ fc-net λ„€νŠΈμ›Œν¬μ— ν¬ν•¨λœ μ»¨ν…Œμ΄λ„ˆ 2개 생성, 논리적인 νƒ€κ²Ÿ κ·Έλ£Ή 생성
docker run -d --name=es1 --net=fc-net --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=fc-net --net-alias=esnet-tg -p 9202:9200 -p 9302:9300 -e "discovery.type=single-node" elasticsearch:7.17.10

 

  • esnet-tg의 dnsλ₯Ό ν™•μΈν•˜κΈ° μœ„ν•΄ busyboxλ₯Ό μ‹€ν–‰ν•΄λ³΄μž
  • κ²°κ³ΌλŠ” μœ„μ—μ„œ λ“±λ‘ν•œ λ‘κ°œμ˜ μ»¨ν…Œμ΄λ„ˆκ°€ 뜰 것이닀.
docker run -it --rm --name=request-container --net=fc-net busybox nslookup esnet-tg

 

νƒ€κ²Ÿ 그룹을 μƒλŒ€λ‘œ μ—¬λŸ¬κ°œμ˜ μš”μ²­μ„ λ˜μ§€λ©΄ νƒ€κ²Ÿ κ·Έλ£Ή μ•ˆμ— μžˆλŠ” n개의 μ»¨ν…Œμ΄λ„ˆκ°€ R-Rν˜•μ‹μœΌλ‘œ μš”μ²­μ„ λ°›λŠ”λ‹€.

 

 

μ»¨ν…Œμ΄λ„ˆ Proxy

λ§Œμ•½ ν”„λ‘μ‹œκ°€ μ—†λ‹€λ©΄ (λ‘œλ“œλ°ΈλŸ°μ„œκ°€ μ—†λ‹€λ©΄)

  • ν”„λ‘μ‹œ ꡬ성이 μ—†μœΌλ©΄ μ‚¬μš©μžμ˜ μš”μ²­μ€ 직접 μ›Ή μ„œλ²„μ— μ „λ‹¬λ˜μ–΄ μ„œλ²„ 뢀담을 κ°€μ€‘ν•˜κ²Œ λœλ‹€.
  • 단일 μ›Ή μ„œλ²„ ꡬ성은 μž₯μ•  λ°œμƒ μ‹œ μ„œλΉ„μŠ€ κ°€μš©μ„±μ— 치λͺ…적이닀.
  • μ—¬λŸ¬ μ‚¬μš©μžμ˜ μš”μ²­μ„ λ™μ‹œμ— μ²˜λ¦¬ν•  κ²½μš°μ—λ„ μš”μ²­ν•œ λΆ€ν•˜λ₯Ό 적절히 λΆ„μ‚°μ‹œμΌœμ£Όμ§€ λͺ»ν•œλ‹€λ©΄ ν•œ μ„œλ²„μ— λΆ€ν•˜κ°€ λͺ°λ¦¬λŠ” Hotspot이 λ°œμƒν•˜λŠ” λ“±μ˜ λ¬Έμ œκ°€ μžˆλ‹€.
  • μ‚¬μš©μž κ΄€μ μ—μ„œ 응닡 μ‹œκ°„ λ§Œμ‘±λ„λ₯Ό μ–»κΈ° νž˜λ“¦

 

 Nginx

  • κΈ°λ³Έ ꡬ성 κ°’μœΌλ‘œ "μ›Ή μ„œλ²„"λ₯Ό μ‹€ν–‰ν•œλ‹€. 동일 계열 점유율이 κ°€μž₯ λ†’μŒ
  • μΆ”κ°€ κ΅¬μ„±μœΌλ‘œ "Reverse Proxy"κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜λ‹€.
  • API νŠΈλž˜ν”½ 처리λ₯Ό κ³ κΈ‰ HTTP 처리 κΈ°λŠ₯으둜 μ‚¬μš© κ°€λŠ₯ν•œ "API Gateway" ꡬ성이 κ°€λŠ₯ν•˜λ‹€.
  • MSA νŠΈλž˜ν”½ 처리λ₯Ό μœ„ν•œ MicroGateway둜 μ‚¬μš© κ°€λŠ₯
  • 섀정은 /etc/nginx ν•˜μœ„μ— nginx.conf 변경을 톡해 ꡬ성할 수 μžˆλ‹€.

 

  • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ 80포트둜 λ“€μ–΄μ˜€λ©΄ μ€€λΉ„ν•΄μš΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„œλ²„μ˜ μ£Όμ†Œλ‘œ 각 μ„œλ²„λ‘œ νŠΈλž˜ν”½μ„ λΆ„λ°°ν•œλ‹€.
  • κΈ°λ³Έ λΆ„λ°° 방식은 R-R(Round Robin)λ°©μ‹μœΌλ‘œ 처리

 

HAproxyλ₯Ό ν™œμš©ν•˜μ—¬ proxyλ₯Ό κ΅¬ν˜„ν•  수 μžˆμ§€λ§Œ 이번 κΈ€μ—λŠ” Nginx만 닀루도둝 ν•˜κ² λ‹€.

 

 

μ‹€μŠ΅

  • nginx μ„€μΉ˜
~$ sudo apt update 
~$ sudo apt -y install nginx 
~$ sudo nginx -v 
nginx version: nginx/1.18.0 (Ubuntu)

 

  • running 쀑인지 확인 (active (running))
sudo systemctl status nginx.service

 

  • 3개의 μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰
docker run -it -d -e SERVER_PORT=5001 -p 5001:5001 -h alb-node01 -u root --name=albnode01 dbgurum/nginxlb:1.0
docker run -it -d -e SERVER_PORT=5002 -p 5002:5002 -h alb-node02 -u root --name=albnode02 dbgurum/nginxlb:1.0
docker run -it -d -e SERVER_PORT=5003 -p 5003:5003 -h alb-node03 -u root --name=albnode03 dbgurum/nginxlb:1.0

 

  • 잘 λ™μž‘ν•˜λŠ”μ§€ 확인
~$ sudo netstat -nlp | grep 5001 
~$ sudo netstat -nlp | grep 5002 
~$ sudo netstat -nlp | grep 5003

 

  • nginx의 μ„€μ •νŒŒμΌμ„ λ³€κ²½ν•˜μ—¬ 80포트둜 λ“€μ–΄μ˜¨ μš”μ²­μ„ 5001,5002,5003 포트둜 ν¬μ›Œλ”© μ‹œμΌœμ€„ 것이닀.
~$ sudo mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.org  //λ°±μ—…
~$ sudo vi /etc/nginx/nginx.conf

 

  • config 파일 (Round Robin ν˜•νƒœλ‘œ backend-alb에 ν¬μ›Œλ”©ν•œλ‹€.
events { worker_connections 1024; }
http {
	# List of application servers
	upstream backend-alb {
		server 127.0.0.1:5001;
		server 127.0.0.1:5002;
		server 127.0.0.1:5003;
    }	
  # Configuration for the server
  server {
        # Running port
        listen 80 default_server;
        # Proxying the connections
        location / {
        	proxy_pass http://backend-alb;
        }
  }
}

 

  • μ μš©μ„ μœ„ν•΄ nginx restart
~$ sudo systemctl restart nginx.service 
~$ sudo systemctl status nginx.servic

 

 

μœ„ μ‹€μŠ΅μ—μ„  Nginxλ₯Ό host에 μ„€μΉ˜ν–ˆμ—ˆλ‹€. Nginxλ˜ν•œ μ»¨ν…Œμ΄λ„ˆλ‘œ λ„μ›Œμ„œ reverse proxyλ₯Ό κ΅¬μ„±ν•΄λ³΄μž.

 

 

  • Nginx μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰ ν›„ config 파일 ꡬ성
~$ docker run -d -p 8001:80 --name=proxy-container nginx:1.25.0-alpine
~$ vi nginx.conf

 

  • κ°€μ€‘μΉ˜λ₯Ό λ‘” reverse proxy ꡬ성
http {
    upstream backend-alb {
        server 192.168.56.101:5001 weight=60;
        server 192.168.56.101:5002 weight=20;
        server 192.168.56.101:5003 weight=20;
    }
    server {
        listen 80 default_server;
        location / {
        	proxy_pass http://backend-alb;
        }
    }
}

 

  • μœ„μ—μ„œ λ§Œλ“  config νŒŒμΌμ„ Nginx μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€λ‘œ cp ν•œ λ‹€μŒ μ μš©μ„ μœ„ν•œ restart
~$ docker cp nginx.conf proxy-container:/etc/nginx/nginx.conf 
~$ docker restart proxy-container