인프라 공부

[Infra] git clone의 문제점, 그리고 어떻게 하는 것이 좋을까?

장아장 2023. 12. 1. 11:33

이전에 git clone을 통해 프로젝트를 받는 방식을 알아보았다. 

이 방식의 문제가 무엇일까?

  1. 직접 npm install을 해주어야 한다. 
  2. nestjs : npm run start, java : java -jar의 방식으로 프로젝트를 실행시켜야 한다. 
  3. 하지만 실제 실행시에는, nestjs : js로 컴파일 후 dist를 실행, java : class 컴파일 후 실행을 한다. 

이런 문제를 해결하기 위한 방법은 무엇일까?

nestjs : dist디렉토리를 옮겨서 실행시키기

spring : build 디렉토리를 옮겨서 실행시키기

 

하지만 이런 방식은, 실제 프로젝트에서 일부 부분들을 매 순간마다 만들어서 ec2서버로 올린 후, 이를 실행시켜줘야 한다. 

 

근데, 이건...

겁나 귀찮다

 

너무 귀찮다...이 짓을 맨날 한다고?

그건 못참지...

부스트캠프에서 지금 진행중인 프로젝트에서도, 이런 손배포(직접 배포) 방식을 사용하다가, 귀찮음이 크다는 이슈가 있었다. 

git clone을 했을 때, gitignore한 .env나 secret.ts같은 파일들이 등록되지 않아 있기에 이걸 직접 옮기고, 수정사항을 직접 반영해야 한다. 

 

그래서, 우리는 도커를 써보기로 했다. (백엔드를 2년 가까이 공부했지만, 인프라 관련된 학습을 하지 않은 나의 첫 경험이었다....)

 

일단 도커를 설치하려면 어떻게 해야할까?

https://docs.docker.com/engine/install/ubuntu/

 

Install Docker Engine on Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

여기 가보니 설명이 하나씩 있었다. 

설명대로 도커를 설치했다. 내 컴퓨터에도 도커를 설치해줬다. (ubuntu, mac, window등을 찾아서 직접하자!!!)

이후에 업로드할 서버와, 내 로컬 컴퓨터에 모두 docker login을 해주자. (같은 계정으로 로그인해야 한다)

이후 sudo su 관리자 권한으로 동작들을 실행시키게 설정했다. 

이후, docker 에서 로그인을 요청해보자!!!

docker login -u ${username}

 

이런 명령어로 로그인을 수행하면 비밀번호를 입력하라고 한다. 

입력해주면? Login Succeeded라는 메시지가 나온다. 즉, 로그인에 성공했다는 뜻이다

(만약 실패했다면 sudo로 다시하거나, 다시 설치해보자!)

 

서버와 업로드할 컴퓨터에서 로그인이 끝났다면, 이제 해야할 과정들이 있다. 

sudo docker build -t ${username}/${repository name}:${tag} --platform linux/amd64 .
// 로컬 : 도커 이미지를 만들어준다. 

sudo docker push ${username}/${{repository name}:${tag}
// 로컬 : 도커 컨테이너를 이미지로 업로드(push) 한다. 

sudo docker pull ${username}/${repository name}:${tag}
// 서버 : 도커 이미지를 다운로드(pull) 한다.

docker run -d -p 80:8080 -e TZ=Asia/Seoul --name ${name} ${username}/${repository name}:${tag}
// 서버 : 도커 이미지를 컨테이너로 실행시킨다.

 

각자의 과정에 대해서 간단하게 정리해보자면, 

  • sudo docker build -t ${username}/${repo name}:${tag} --platform linux/arm64 .
    • -t : 정확한 태그까지 명시해서 이미지를 만들어준다. 
    • --platform : 실행시킬 백그라운드 플랫폼을 명시해준다. linux 프리티어에 동작시킬 수 있는 상태가 amd64/v3라서 이런 방식으로 설정했다. 
    • . : 루트 디렉토리를 명시했다. 
  • sudo docker push ${username}/${repo name}:${tag} 
    • 해당 이름으로 만들어진 이미지를 docker hub으로 푸쉬한다.
    • 깃허브에 리포지토리로 푸쉬한 것과 동일하다
    • 하지만, 도커는 이를 실행시킬 수 있는 독자적인 환경에 프로젝트를 둔다면, 깃허브는 프로젝트만을 올리는 방식이다. 
  • sudo docker pull ${username}/${repository name}:${tag}
    • 해당 이름의 이미지를 도커 허브에서 가져온다. 
  • docker run -d -p 80:8080 -e TZ=Asia/Seoul --name ${name} ${username}/${repository name}:${tag}
    • -d : 백그라운드에서 실행시킨다. 
    • -p 80:8080 : 포트를 설정해준다. 80포트로 외부 입력을 받으면, 내부적으로는 8080포트에 실행중인 애플리케이션에 연결해준다. 
    • -e TZ=Asia/Seoul : 환경 설정을 해준다. 타임존을 서울로 설정해준다. 
    • --name ${name} : 컨테이너를 해당 이름으로 실행시켜준다. 후에 정확한 이미지명이 아닌, 해당 name이나 기본적으로 주는 id로 접근할 수 있게 해준다.
    • 이렇게 설정된 컨테이너를 실행시켜준다. 

 

원격 서버에서 pull을 할 때, 그리고 Push를 할 때 tag가 명시되어있지 않다면, 보는 것과 같이 default태그로 latest로 받아진다. 

이후에 실행을 시켜줄 수 있다. 

 

docker run -d -p 80:8080 -e TZ=Asia/Seoul --name server teamndd/test

이런식으로 명령을 넣어주었고, 이후에 실행 상태는 docker logs server로 볼 수 있다. 

 

도커에 대한 더 깊은 이야기들은 현재 나도 docker 공식문서에서 훑는 중이다. 

우리 모두 다같이 공부합시다

 

그럼...twenty thousand...🔥