2 분 소요

서론

해당 글은 짱구가 작성했습니다.

자주 보는 유튜브 채널인 개발바닥의 호돌맨님께서 “localhost:8080의 세상에서 벗어나야 한다”고 말씀해 주셨습니다. 또, BDD의 명예회원인 미니언 선배님께서 “작은 서비스들의 배포와 CICD는 인프라 담당자가 하지 않고, 백엔드 개발자가 해서 공부하시면 좋을 것 같아요”라고 말씀해 주셨습니다.

이 말을 듣고 인프라에 관심을 가졌고, Doore 프로젝트를 직접 배포해 보고 싶어졌습니다. 그래서 이번 doo-re 프로젝트에서는 백엔드가 아니라 인프라로 지원하게 되었습니다. 아래에서 doo-re 프로젝트를 배포하기까지의 과정을 아주 가볍게 살펴보도록 하겠습니다.

도커

도커는 컨테이너 기반의 가상화 플랫폼입니다. 여기서 “컨테이너 기반”과 “가상화”라는 두 단어가 무엇인지 알아야 합니다.

가상화 기술은 하나의 실물 컴퓨팅 자원을 가상으로 여러 개로 쪼개 효율적으로 자원을 관리할 때 사용하는 기술입니다. 과거에는 아래의 사진처럼 하나의 물리적인 서버에 하나의 서비스만 돌렸습니다.

이렇게 할 경우 한 개의 OS위에 하나의 테스트만 수행하기 때문에 안정적이고 관리하기 쉽습니다. 하지만 각 서비스가 컴퓨팅 파워의 30% 밖에 사용하지 않은 작은 서비스라면 나머지 70%의 자원을 낭비하게 됩니다.

회사는 어떻게든 지출을 줄이고 수입은 최대한으로 만들어야 하기 때문에 가상화 기술을 사용해서 아래의 사진처럼 되기를 원할 것 입니다.

컨테이너는 격리된 공간에서 프로세스가 동작하는 기술입니다. 기존의 가상화 소프트웨어는 OS를 가상화하여 사용했지만 컨테이너 기반의 가상화는 프로세스만을 가상화하기 때문에 훨씬 가볍고 빠릅니다.

OS를 격리하는 방식과 프로세스를 격리시키는 컨테이너 기술의 성능 비교는 아래의 글에서 확인하실 수 있습니다.

[ Docker # 03 알아보기] - VM vs Docker 성능 비교

EC2 인스턴스의 Spring boot 어플리케이션 접근

Spring Boot를 사용하고 있는 개발자들은 로컬 환경에서 자신이 만든 API가 잘 동작하는지 확인하기 위해서 localhost:8080에 접근합니다. 여기서 왜 localhost:8080으로 접근하는지에 대해서 정말 간단하게 알아보도록 하겠습니다.

보통 CS 전공 수업시간에 IP Address와 Port에 대한 개념을 배웁니다. IP Address 주소를 바탕으로 컴퓨터에 접근하게 되고, Port를 바탕으로 컴퓨터에서 돌아가는 여러개의 프로세스 중 특정 프로세스에 접근할 수 있다고 배웁니다. “localhost:8080”에서 IP는 localhost이고, 8080이 Port에 해당하게 됩니다. 로컬에서 동작 중인 Spring 어플리케이션에 접근하기 위해서는 내 컴퓨터의 IP주소(localhost)에 Port(8080)로 접근하면 됩니다(Spring boot가 내장 톰캣을 8080포트로 열기 때문입니다.)

그렇다면 EC2 인스턴스에서 동작하고 있는 Spring 기반의 웹 어플리케이션에 접근하기 위해서는 어떻게 하면 될까요? EC2 인스턴스의 IP 주소와 Spring 웹 어플리케이션 컨테이너의 Port 번호로 접근하면 될 것 같습니다. EC2 인스턴스의 IP 주소가 43.200.142.22라고 가정한다면 “43.200.142.22:8080”으로 접근하면 doo-re의 spring 웹 어플리케이션에 접근할 수 있을 것 같습니다.

하지만 예상과는 다르게 response 시간이 너무 오래 걸린다고 합니다. 이를 해결하려면 보안 그룹을 수정해야 합니다.

  1. 인바운드 보안 그룹 규칙에 8080포트를 추가한다.

EC2 인스턴스를 처음 만들 때 22번 포트밖에 열어두지 않습니다. Spring boot는 8080포트를 사용하고 있기 때문에 인바운드 규칙에 8080 포트를 열어두면 접근할 수 있습니다.

  1. 인바운드 보안 그룹 규칙에 80포트와 443포트를 추가하고 Nginx의 Reverse Proxy를 사용한다.

아래는 Nginx의 config 설정 파일입니다. 아래의 설정 파일을 살펴보면 80번 포트로 들어오면 443 포트로 리다이렉트 시키고, /docs라는 경로로 들어왔을 때 8080포트로 트래픽을 흘려주고 있습니다.

upstream spring {
    server app:8080;
}

server {
    listen 80;
    listen [::]:80;
    return 301 https://$host$request_uri; //443 포트로 리다이렉트
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  localhost;

    location /docs {
        proxy_pass http://spring;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        add_header 'Access-Control-Allow-Origin' '*';
    }
}

결론

도커는 컨테이너 기반의 가상화 기술입니다. OS를 가상화 하는 것이 아니라 프로세스만을 격리시키기 때문에 가볍고 빠릅니다. 서버의 IP 주소와 Spring 웹 어플리케이션이 돌아가는 Port 정보만 안다면 백엔드 API를 사용할 수 있습니다. 하지만 대부분 웹 사이트는 80포트와 443 포트만 사용하는데 Nginx의 reverse_proxy를 사용해서 특정 경로로 들어오는 request를 8080포트로 흘려줄 수 있습니다. 백엔드 서버 뿐만 아니라 프론트 서버도 이와 같은 방식으로 동작하고 있습니다.

카테고리:

업데이트: