Skip to content

nCloud, Docker를 활용해 수동 배포해보기

nowChae edited this page Dec 1, 2024 · 3 revisions

노션 링크

🚀 도전 목표

  1. nCloud와 Docker를 활용한 배포 경험 쌓기

    nCloud와 Docker를 활용하여 배포를 경험하고, 이를 통해 클라우드 환경에서의 배포와 컨테이너 기반 환경에 대한 이해를 높이는 것을 목표로 삼았습니다.

  2. 수동 배포 프로세스 실습 및 배포 과정 자동화 준비

    CI/CD 파이프라인 구축 이전에 수동 배포 과정을 직접 경험해 배포 과정에서 발생할 수 있는 이슈들을 파악하고, 자동화 이전의 기반 지식을 확립하려고 했습니다.


💡 핵심 과정 및 결과


nCloud, Docker를 사용한 수동 배포 과정

  1. nCloud에서 서버 생성

    nCloud 환경에서 서버를 생성하면서 네트워크 구성에 대한 기초를 다졌습니다. VPC에 대해 학습하며, 배포를 진행할 Public Instance를 생성했습니다. 이를 통해 외부와 연결된 서버 환경을 구축했습니다.

    VPC 학습 노션 페이지


  1. 서버에 Docker 설치

    Docker 공식 문서를 참고하여 1에서 생성한 서버에 Docker를 설치해주었습니다.

    Docker 공식 페이지

    수동배포 1

  1. Docker 이미지 준비

    배포할 애플리케이션에 대해서 Docker 이미지를 생성하고 Docker Hub에 해당 이미지를 push 해두었습니다. 생성한 서버에서 필요한 Docker 이미지를 pull 해옵니다.

    수동배포 2

  1. Docker 컨테이너 실행

    pull 해온 이미지를 run 해서 실행합니다. docker run 명령어를 통해 이미지를 실행시킬 때 호스트와 컨테이너 간의 포트 매핑을 설정할 수 있습니다. -p 80:3000 옵션을 사용하여 포트를 매핑하게 되면 호스트의 80번 포트로 들어온 트래픽을 docker 컨테이너 내부에서 3000번 포트로 전달하게 됩니다. 이를 통해 외부에서 접근하는 80번 포트를 통해 컨테이너 내부에서 실행 중인 애플리케이션에 접속할 수 있습니다.


  1. http://호스트IP로 접속 시도

    서버의 외부 IP 주소를 이용해, 브라우저에서 http://<호스트IP>로 접속하여 애플리케이션이 정상적으로 실행되는지 확인합니다.

    수동 배포 3



배포 중 생긴 문제 상황 및 해결 과정

  1. 서버 생성 후 보안 문제 발생

    서버 생성 후 public 서버에 ssh로 접속하기 위해서 Public Subnet에 NACL 규칙을 추가해주었습니다.

    내 IP에서만 ssh로 접속할 수 있도록 허용하는 규칙을 추가해주었고, 이 후 ssh를 통한 접속이 가능하다는 것을 확인하여 제대로 규칙을 추가한 것이라고 판단하였습니다.

    수동배포 문제 1 blur

    갑자기 nCloud와 연결된 개인 메일로 아래와 같은 보안 이벤트 알림 메일을 받게 되었습니다. 해당 메일은 SSH Bruteforce 공격이 발생했다는 내용을 담고 있었습니다. 여러 IP에서 내 서버에 SSH 접속을 시도해서 발생한 문제라고 판단하였습니다.

    수동 배포 문제

    해당 문제를 해결하기 위해서 우선 모든 포트 SSH 접근 차단 인바운드 규칙을 추가해주었습니다. 인바운드 룰이 적용되는 우선 순위가 존재하기 때문에, 내 IP에서의 접근 허용이 우선적으로 적용되고, 그 이후에 다른 모든 IP에 대해서는 접근이 불가능하도록 만들어 외부 IP들의 SSH 접근을 차단했습니다.

    수동 배포 문제 3 blur


  1. ACG, ACL 규칙 관련 문제

    Public Subnet을 생성하면서 22, 80, 443 port에 대해서 접속을 허용하도록 인바운드 규칙을 추가해주었습니다. 규칙 세팅 후 Docker Hub에서 pull해온 이미지를 실행하면 테스트 프로젝트에 제대로 접속할 수 있을 것이라고 판단했습니다. 하지만 서버에 연결이 되지 않는 문제가 발생했습니다.

    수동 배포 문제 4 blur

    • sudo ufw allow port_number

      ACL 설정만으로는 서버 내부의 포트가 자동으로 열리지 않기 때문에 서버 내부에서도 포트를 허용해주어야 한다는 것을 알았습니다. 그래서 sudo ufw status 명령어를 통해 현재 허용된 포트들을 확인하고 추가가 필요한 포트들을 세팅해주었습니다.

      22, 80, 443 포트들에 대해서 public instance에서 허용하도록 설정해주었습니다. 이렇게 세팅을 하고 나서는 제대로 서버에 들어갈 수 있을 것이라고 판단하였는데, 서버에 접속할 수 없었습니다.

    수동 배포 문제 5
    • ACG 세팅 추가

      ACL, ufw 설정이 완료되었는데도 서버에 들어가지지 않아서 어디서 막히고 있는 것인지 찾아보다가 ACG 세팅을 확인해보았습니다. 서버를 생성할 때 NIC 세팅에서 ACG를 default-acg만 세팅해주었기에 default-acg의 인바운드 규칙을 확인해주었습니다.

    수동 배포 문제 6 blur

    defauls-acg 규칙을 확인해보니, 80, 443 port에 대한 접속이 허용되지 않고 있었습니다. 그래서 80, 443 port에 대한 접속 허용을 위해서 public-acg를 생성해준 후, public-acg를 추가해주었습니다.

    수동 배포 문제 7 수동 배포 문제 8 수동 배포 문제 9

    위의 과정들을 통해서 서버에 성공적으로 접속할 수 있었습니다.

    • 먼저 ACG 규칙이 적용되어 인스턴스에 대한 접근이 필터링 됨
    • 그 후 서브넷에서 ACL 규칙이 추가로 적용되어 서브넷 레벨에서의 전체적인 접근 제한이 이루어짐



🔎 개선 사항

  1. Docker Hub 보안

    Docker Hub에 이미지를 push 하는 과정에서 보안 위험이 존재할 수 있습니다. 이를 개선하기 위한 방안들을 학습하고 적용해보면 좋을 것 같습니다.

  2. Docker를 사용한 서버 확장 및 부하 분산

    현재는 하나의 컨테이너만 실행시키고 있는데, docker를 사용한 서버 확장 및 부하 분산에 대해서 학습해보면 좋을 것 같습니다.

  3. CI/CD 파이프라인 구현

    수동으로 배포하는 과정을 알아보았기 때문에, 배포 자동화와 더불어 CI/CD 파이프라인을 구축하면 효율성을 극대화할 수 있을 것 같습니다. 또한 다음 목표가 CI/CD 파이프라인 구축이기때문에 가장 먼저 고려해보면 좋을 사항 같습니다.

Clone this wiki locally