[Docker] ๋„์ปค DNS์™€ ์ปจํ…Œ์ด๋„ˆ proxy(Nginx)

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