본문 바로가기
개인 공부/rookies

docker 환경에서 load balancing 실습 - 2

by 아메리카노와떡볶이 2022. 10. 24.
728x90
docker 환경에서 load balancing 실습 - 2

이번 시간에는 docker 환경에서 load balancing 실습을 수행해보겠습니다.

 

구축환경

구축하고자 하는 환경은 위와 같습니다.

VM에서 칼리를 띄우고, 칼리에 nginx 서버를 구축합니다.

 

이때 외부에서 kali의 nginx 서버에 접속하면, nginx 컨테이너 1,2,3 에 차례로 할당되게 하면서

load balancing을 구현합니다.

 

실습

1. 칼리에 nginx 서버를 설치 후 start

┌──(kali㉿kali)-[~]
└─$ sudo service nginx start 

 

2. 칼리 ip인 192.168.5.130으로 접속하면 정상적으로 웹 서버가 동작하고 있는것을 확인할 수 있습니다.

 

3. 해당 서버에 로드밸런싱을 위한 컨테이너 3개를 생성합니다.

이때 볼륨을 설정해서 페이지 편집을 수월하게 설정합니다.

┌──(kali㉿kali)-[~]
└─$ sudo mkdir web01        
                                                                             
┌──(kali㉿kali)-[~]
└─$ sudo mkdir web02
                                                                             
┌──(kali㉿kali)-[~]
└─$ sudo mkdir web03
                                                                             
┌──(kali㉿kali)-[~]
└─$ sudo docker run -itd -p 5001:80 --name=nginx_web01 -v /home/kali/web01:/usr/share/nginx/html nginx
4a9cb7179a301b645cdef7294d686e30a45be813087206953a80c3a8446ac49f
                                                                             
┌──(kali㉿kali)-[~]
└─$ sudo docker run -itd -p 5002:80 --name=nginx_web02 -v /home/kali/web02:/usr/share/nginx/html nginx
76a0705439bd18318adf26b8e1a347a0242832dab52d3e7346ca0cb41c712d65
                                                                             
┌──(kali㉿kali)-[~]
└─$ sudo docker run -itd -p 5003:80 --name=nginx_web03 -v /home/kali/web03:/usr/share/nginx/html nginx
e1c17852048dc5c99fe5c1a5d6cd34d99957e6b05222cec1728f59c7f10b2713

해당 컨테이너가 잘생성되었는지 확인해봅시다.

┌──(kali㉿kali)-[~]
└─$ sudo docker ps
CONTAINER ID   IMAGE        COMMAND                  CREATED          STATUS             PORTS                                   NAMES
e1c17852048d   nginx        "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes       0.0.0.0:5003->80/tcp, :::5003->80/tcp   nginx_web03
76a0705439bd   nginx        "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes       0.0.0.0:5002->80/tcp, :::5002->80/tcp   nginx_web02
4a9cb7179a30   nginx        "/docker-entrypoint.…"   3 minutes ago    Up 3 minutes       0.0.0.0:5001->80/tcp, :::5001->80/tcp   nginx_web01

 

4. 각 컨테이너 웹서버를 구분할 수 있게 볼륨에서 편집합니다.

 

5. 포트를 통해 접속해봅시다 !

 

 

 

6. 칼리의 nginx 서버에 conf 파일을 통해 로드밸런싱

┌──(kali㉿kali)-[/etc/nginx]
└─$ cat nginx.conf
user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {

        worker_connections 768;
        # multi_accept on;
}

http {

        ##
        # Basic Settings
        ##
        upstream backend-lb {
                server 127.0.0.1:5001;
                server 127.0.0.1:5002;
                server 127.0.0.1:5003;
        }
        server {
               listen 80 default_server;
               listen [::]:80 default_server;
               
               location / {
                        proxy_pass http://backend-lb;
               }
        }       
        sendfile on;
        tcp_nopush on;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
        ssl_prefer_server_ciphers on;

        ##
        # Logging Settings
        ##

        access_log /var/log/nginx/access.log;
        error_log /var/log/nginx/error.log;

        ##
        # Gzip Settings
        ##

        gzip on;

        # gzip_vary on;
        # gzip_proxied any;
        # gzip_comp_level 6;
        # gzip_buffers 16 8k;
        # gzip_http_version 1.1;
        # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

        ##
        # Virtual Host Configs
        ##

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}


#mail {
#       # See sample authentication script at:
#       # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#       # auth_http localhost/auth.php;
#       # pop3_capabilities "TOP" "USER";
#       # imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#       server {
#               listen     localhost:110;
#               protocol   pop3;
#               proxy      on;
#       }
#
#       server {
#               listen     localhost:143;
#               protocol   imap;
#               proxy      on;
#       }
#}
     

여기서 로드밸런싱에 사용된 코드만 빼서보면

        upstream backend-lb {
                server 127.0.0.1:5001;
                server 127.0.0.1:5002;
                server 127.0.0.1:5003;
        }
        server {
               listen 80 default_server;
               listen [::]:80 default_server;
               
               location / {
                        proxy_pass http://backend-lb;
               }
        }      

proxy_pass를 이용해서 80번포트로 들어온 요청을 5001~5003 으로 넘기는 것이다.

 

로드밸런싱이 성공적으로 됐는지 실험해봅시다

 

성공!

728x90

댓글