AWS ECR Docker Image Push 하기

Jaewoong2·2024년 10월 12일
post-thumbnail

Docker란?

Docker는 소프트웨어를 컨테이너라는 표준화된 유닛에 어플리케이션을 패키징하여 배포하고 실행할 수 있도록 도와주는 엔진입니다.

Docker는 Host OS 위에서 컨테이너들을 관리하고 실행시키는 엔진 입니다. 즉 도커가 컨테이너인 것이 아니라,

실행시키는 엔진이라고 생각 하시면 됩니다.

Docker Image와 Container

  • Docker Image는 컨테이너 실행에 필요한 코드, 라이브러리, 환경 설정 등을 포함하는 읽기 전용 템플릿입니다. 이미지를 기반으로 컨테이너가 생성됩니다.
  • Docker Container는 이미지를 기반으로 실제로 실행되는 독립적인 환경입니다. 컨테이너는 호스트 시스템의 자원을 공유하면서도 다른 컨테이너들과 격리된 상태로 동작합니다.

Docker Image 로 부터 Docker Container 를 만들 수 있습니다. Container는 Image 없이 생성이 안되며, Docker Hub 및 이번 실습에 사용 할 ECR (Elastic Container Registry) 와 같은 Registry 등에서 이미지를 가져오고, Container를 만들 수 있습니다.

실습

순서는 아래와 같습니다

  • AWS ECR Private Repository 생성하기
  • Dockerfile 작성하기
  • AWS ECR Repository에 Dockerfile Push 하기
  • AWS CLI 설정

ECR 프라이빗 리포지토리 생성하기

ECR 프라이빗 리포지토리 생성하기

ECR 프라이빗 리포지토리 생성하기

먼저, AWS ECR 콘솔 로 접속하여, 리포지토리 생성 버튼을 누르고 my-app 으로 Pirvate Repository 를 생성 하도록 하겠습니다.

NextJS Dockerfile 작성법

Docker 이미지를 만들려면 Dockerfile이라는 파일을 사용하여 이미지를 빌드합니다.

Dockerfile은 일련의 명령어를 통해 이미지 생성 과정을 정의하는 파일입니다.

  1. Dockerfile 을 통해 도커 이미지를 만들고
  2. 만든 도커 이미지를 통해서 컨테이너를 생성 & 실행 합니다.

아래는 NextJS를 위한 Dockerfile 작성 예제입니다. (공식문서 참고)

// next.config.mjs

/** @type {import('next').NextConfig} */
const nextConfig = {
  output: "standalone",
};

export default nextConfig;
  • Standalone 옵션 을 활성화 해줍니다.
    • NextJSStandalone 은  서버를 실행하는데 필요한 코드만을 사용할 수 있도록 빌드 해주는 옵션이라고 생각하면 됩니다.
FROM node:18-alpine AS base

# Install dependencies only when needed
FROM base AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /usr/src/app

# Install dependencies based on the preferred package manager
COPY package.json ./
RUN yarn --production;
RUN rm -rf ./.next/cache

# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /usr/src/app
COPY --from=deps /usr/src/app/node_modules ./node_modules
COPY . .
RUN yarn build

# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /usr/src/app

ENV NODE_ENV=production

RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs

COPY --from=builder /usr/src/app/public ./public
COPY --from=builder --chown=nextjs:nodejs /usr/src/app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /usr/src/app/.next/static ./.next/static

USER nextjs

EXPOSE 3000

ENV PORT 3000

CMD ["node", "server.js"]

Dockerfile 주요 명령어

  • FROM: 베이스 이미지(기반 이미지)를 설정합니다.
  • WORKDIR: 컨테이너 내에서 작업할 디렉토리를 설정합니다.
  • COPY: 파일이나 디렉토리를 컨테이너로 복사합니다.
  • RUN: 명령어를 실행하여 이미지를 빌드할 때 필요한 작업을 수행합니다.
  • EXPOSE: 컨테이너가 외부에 노출할 포트를 지정합니다.
  • CMD: 컨테이너가 실행될 때 기본적으로 실행할 명령을 설정합니다.

Dockerfile을 작성한 후, docker build 명령어를 통해 이미지를 생성할 수 있습니다.

AWS CLI 설정

AWS CLI는 공식문서 를 통해 설치 및 설정 합니다.

ECR Private 리포지토리로 Docker Image Push 하기

ECR에 이미지를 저장할 리포지토리를 생성합니다.

ECR 리포지토리에서 푸시 명령 보기 를 누르면 아래와 같이 나올 것 입니다.

해당 푸시명령 대로 Docker Image 를 Build 하고, ECR 에 푸시할 수 있습니다.

Docker 로그인

AWS CLI로 ECR에 Docker 로그인을 합니다.

aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com

Docker 이미지 빌드 및 태그

Docker 이미지를 빌드한 후, ECR로 푸시할 수 있도록 태깅합니다.

docker build -t my-app .
docker tag my-app:latest <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-repo:latest

Docker 이미지 업로드

이미지를 ECR에 푸시합니다.

docker push <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-repo:latest

Push 명령어를 하고 이미지와 같이 결과 화면이 나오면 성공 입니다.

Docker를 활용한 실제 운영

Docker와 AWS ECR을 활용하면 컨테이너 이미지를 AWS에 저장하고,

이를 이용해 Elastic Container Service(ECS) 또는 Kubernetes 등의 플랫폼에서 애플리케이션을 쉽게 배포할 수 있습니다.

이러한 방식으로 운영 환경에서 CI/CD 파이프라인을 구축하면 애플리케이션 배포 속도를 높이고, 일관된 환경에서 서비스가 실행될 수 있도록 할 수 있습니다.

profile
DFF (Development For Fun)

0개의 댓글