Dockerized 애플리케이션 GCP에 배포하기

LJH·2021년 5월 24일
1

DevOps 강의 (feat. Foo)

목록 보기
5/16
post-custom-banner

해당 내용은 Class101의 현직 대기업 개발자 푸와 함께하는 진짜 백엔드 시스템 실무! 강의를 기반으로 작성했습니다.

Docker를 잘 모른다면 이전 글을 참고하자.

😀 목표

  • CPU bound 애플리케이션을 도커 이미지로 만들어서 GCP 인스턴스에 배포하기

1. 배포 과정

  • 복잡해보이지만 알고나면 굉장히 간단하다.
  1. dockerfile을 작성하고 build하면 docker image가 만들어진다.

  2. 생성한 docker image를 docker hub에 push한다.(github에 push 하는걸 생각하면 된다.)

  3. GCP 인스턴스에 접속해 docker image를 pull 한다.

  4. docker image를 실행시켜 docker Conatiner를 만든다.
    docker Container에서 애플리케이션이 돌아간다.


2. Docker Hub 가입 및 리포지토리 생성

  • Docker Hub는 이미 가입되어 있으니 과정은 생략한다.
  • 새로운 리포지토리를 하나 만들어준다.

  • 리포지토리 이름, 설명만 적어주고 public 선택 후 create 해주면 끝난다.

3. 로컬에서 Docker Container 띄우기

  • 공식 레퍼런스에 친절하게 과정이 설명되어 있다.
  • Docker Desktop을 실행 후 진행해야 한다.

3-1. Dockerfile 생성

  • 명령어에 대한 설명도 공식 레퍼런스에 자세히 나와있다.

  • FROM : 생성할 이미지의 기본 이미지를 명시한다.

    • Dockerfile은 무조건 FROM 명령어로 시작하며 명시된 이미지는 Docker Hub에서 자동으로 가져온다.

    • 이후 도커 컨테이너에서 자바를 설치하지 않아도 애플레케이션이 돌아가는 이유이다.

  • ARG : 변수를 생성한다.

    • target/*.jar 라는 값을 가진 JAR_FILE 변수를 선언했다.

    • target/*jar는 Maven 빌드 환경에서 빌드된 JAR 파일이 저장되는 디렉토리이다.

  • COPY : 복사할 파일의 경로와 컨테이너에 복사할 경로를 지정

    • COPY (복사할 파일의 경로) (복사판 파일을 저장할 컨테이너 내의 경로)

    • JAR_FILE 변수에 저장된 jar 파일을, 컨테이너 생성 후 컨테이너의 app.jar 경로에다가 복사하겠다 라는 의미이다.

  • ENTRYPOINT : 컨테이너가 시작될 때 자동으로 수행할 명령 지정

    • run명령어로 컨테이너를 생성 후 시작하게 되면 java -jar /app.jar 명령어가 입력된다.

    • 컨테이너만 띄우면 저절로 애플리케이션이 돌아가는 이유이다.

3-2. Docker image 생성

docker build -t [생성할 이미지 이름] [dockerfile 경로]

  • -t 옵션은 이미지에 태그를 추가한다. 이미지 : tag
    태그를 생략할 경우 자동으로 latest 가 태그가 된다.

  • Docker Desktop으로 보면 이미지가 생성된 걸 확인할 수 있다.

3-3. Docker Container 생성 및 실행

docker run -p [로컬 포트]:[컨테이너 포트] [이미지]

  • run 명령어는 이미지를 기반으로 컨테이너를 생성 + 실행 한다.

  • 컨테이너를 생성하는 create 명령어와, 컨테너를 실행시키는 start 명령어가 따로 있다.

  • 포트를 위해 쉽게 설명하면 내 컴퓨터안에 도커 컨테이너라는 작은 컴퓨터가 있다고 생각하자. 그러면 내 컴퓨터로 접근하기위한 포트와, 내 컴퓨터에서 도커 컨테이너로 접근하기 위한 포트라고 생각하면 된다.

  • run 명령어에 의해 docker Conatiner가 생성되고 실행됬으며
    dockerfile에 있는 명령어에 의해 자동으로 java가 설치되고,
    jar파일을 실행하는 명령어가 입력되어 애플리케이션이 돌아가는 것이다.


4. Docker Hub에 이미지 업로드(push)

  • 먼저 docker hub에 로그인 해야한다.

    docker login
  • 이후 이미지를 push 한다.

    docker push [이미지 이름]
    • 원래는 이미지 뒤에 태그를 붙여야하지만 태그가 lastest인경우 생략 가능하다.

  • 저장소에서 확인해보면 잘 push된걸 볼 수 있다.

5. GCP 인스턴스에서 Docker Conatiner 띄우기

  • 이전에 비용이 비싼 인스턴스는 삭제했기 때문에 새로운 인스턴스를 만들어야한다.
    이미 많이 했던 것이기 때문에 과정은 생략한다.

  • 인스턴스에 접속해서 docker 설치 + docker 실행 + docker image pull + docker 컨테이너 실행을 진행한다.

    sudo yum install docker // 도커설치
    sudo systemctl start docker // 도커 실행
    sudo docker pull [이미지] // 도커 허브에서 이미지 다운로드
    sudo docker run -p 80:80 [이미지] // 도커 컨테이너 생성 및 실행


6. Artillery로 스트레스 테스트

  • 이전에 작성한 스크립트를 그대로 사용한다. 단 target에 인스턴스의 ip를 입력해줘야 한다. 근데 사실 인스턴스를 삭제하고 다시 만들어도 계속 똑같은 ip가 할당된다.
    이유는 잘모른다..


7. 마치며..

이전에 사이드프로젝트를 배포해보면서 진행해봤던 과정인데, 개인적으로 dockerfile에 대해 좀 더 자세히 조사하면서 알게되어 좋았고 무엇보다 docker desktop이 정말 편했다.

이전에는 jar파일을 추출해서 VM으로 파일을 옮기고 VM에서 빌드하고 도커허브에
푸쉬하는 과정을 반복했는데 wsl2가 백그라운드로 돌아가면서 인텔리 터미널에서 docker 명령어를 바로 사용할 수 있어서 간편했다.

사이드 프로젝트를 배포 후에 계속 수정하면서 위 과정을 반복했는데 항상 똑같다.
jar파일 추출 → build로 이미지 생성 → docker hub에 push → 인스턴스에서 pull → run으로 컨테이너 생성 및 실행 굉장히 반복적인 일을 수행하는데 다음 강의에서 이 과정을 jenkins를 통해 자동화한다. 너무 기대된다..!

post-custom-banner

0개의 댓글