Skip to main content

24. [BackEnd] 도커와 AWS 배포 - 1 ( Dockerfile 작성 및 실행 )

Git 브랜치 사용


Github를 사용할 때 master나 main에 바로 commit push하는 것이 아니라 테스트 브랜치에서 충분히 테스트 후 merge하는게 좋다고 합니다.

(그런데 불편함도 있어서 회사에서는 다양한 전략을 사용합니다.)

브랜치 생성 명령어

git checkout -b <브랜치명>

[여담] 만약 Golang 버전이 업데이트 됐다면

  1. go.mod에서 go version 변경

  2. ci.yml 파일에서 go-version 변경

Git commit 후 push

git add .
git commit -m "커밋메시지"
git push origin <브랜치명>

나오는 링크로 가서 pull request를 할 수 있습니다.

Pull request란

pull request는 main으로 합치기 위한 과정입니다. merge가 main으로 합치는 것이라면 pull request는 merge전 심사입니다.

Git Desktop

그런데 위 과정을 GUI로 할 수 있는 어플리케이션이 있는데 바로 Git Desktop입니다.

Dockerfile 작성하기


base image 다운로드

예를 들어 golang으로 개발한 어플을 배포하려면 go 이미지가 필요합니다.

이곳에서 검색할 수 있습니다.

작성

FROM golang:1.21-alpine3.18
WORKDIR /app
COPY . .
RUN go build -o main main.go

EXPOSE 8080
CMD ["/app/main"]

FROM 은 위에서 찾은 기본 이미지 버전을 설정합니다.

WORKDIR 은 도커 내부의 현재 작업 디렉토리를 선언합니다.

COPY 명령어를 사용해서 필요한 모든 파일을 복사합니다. 첫 번째 값은 현재 폴더에 대한 값이고 .을 입력한다면 현재 root에서 시작하기 때문에 모든 하위 항목들을 복사합니다. 두 번째 값은 파일과 폴더가 복사되는 이미지 내부의 현재 작업 디렉토리 입니다. WORKDIR에서 설정한 값입니다.

다시 정리하면 COPT 복사대상 복사위치 입니다.

RUN은 뒤에 작성한 명령어를 실행하는건데 지금 예시는 golang 파일을 바이너리로 만들어주는 명령어 입니다.

EXPOSE 포트 번호 지정할 수 있습니다. 근데 기능적인 지정은 아니고 그냥 이렇게 열린다는 알림만 하는 문서적인 역할만 합니다.

CMD 컨테이너가 시작할 때 실행할 기본 명령어

빌드


docker build -t simplebank:latest .

이름과 태그를 정해서 만들 수 있습니다. 이름:태그 입니다.

docker images

를 통해서 만들어진 이미지를 확인할 수 있습니다.

Alt text

그런데 이미지 크기가 너무 큽니다.

그러면 multistage로 빌드할 수 있습니다.

multistage 빌드

# Build stage
FROM golang:1.21-alpine3.18 AS builder
WORKDIR /app
COPY . .
RUN go build -o main main.go

# Run stage
FROM alpine:3.18
WORKDIR /app
COPY --from=builder /app/main .
COPY app.env .

EXPOSE 8080
CMD ["/app/main"]

기존에 FROM한 이미지 이름을 지정해주고

Run stage를 만드는데 이 때 FROM은 build stage에서 사용한 리눅스 이미지를 사용해야 한다.

그리고 run stage에서 copy는 위에서 만든 ./app/main이라는 바이너리만 사용할 것이기에 저렇게 설정해 줍니다.

다시 위에서 했던 docker build하면 잘 생성이 됩니다.

그리고 COPY app.env .를 하는 이유는 환경변수를 가져오기 위해서 입니다.

이미지 지우는 방법

docker rmi <이미지 아이디>

같은 이름으로 또 생성하면 기존에 있던 이미지는 <none>으로 바뀝니다 그래서 지울 필요가 있습니다

도커 실행하기


docker run --name simplebank -p 8080:8080 simplebank:latest

위 명령어로 실행했습니다.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)

실행하면 위와 같은 경고가 나오는데 수정하면 잘 될것입니다.

방법은

  1. 기존 컨테이너 rm
docker rm 컨테이너
  1. docker run 할 때 환경변수 추가
docker run --name simplebank -p 8080:8080 -e GIN_MODE=release simplebank:latest

이렇게 릴리즈 모드로 실행하면 아무런 디버그 로그가 안나옵니다.