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

Docker는 Host OS 위에서 컨테이너들을 관리하고 실행시키는 엔진 입니다. 즉 도커가 컨테이너인 것이 아니라,
실행시키는 엔진이라고 생각 하시면 됩니다.
Docker Image 로 부터 Docker Container 를 만들 수 있습니다. Container는 Image 없이 생성이 안되며, Docker Hub 및 이번 실습에 사용 할 ECR (Elastic Container Registry) 와 같은 Registry 등에서 이미지를 가져오고, Container를 만들 수 있습니다.
순서는 아래와 같습니다


먼저, AWS ECR 콘솔 로 접속하여, 리포지토리 생성 버튼을 누르고 my-app 으로 Pirvate Repository 를 생성 하도록 하겠습니다.
Docker 이미지를 만들려면 Dockerfile이라는 파일을 사용하여 이미지를 빌드합니다.
Dockerfile은 일련의 명령어를 통해 이미지 생성 과정을 정의하는 파일입니다.
아래는 NextJS를 위한 Dockerfile 작성 예제입니다. (공식문서 참고)
// next.config.mjs
/** @type {import('next').NextConfig} */
const nextConfig = {
output: "standalone",
};
export default nextConfig;
Standalone 옵션 을 활성화 해줍니다.NextJS의 Standalone 은 서버를 실행하는데 필요한 코드만을 사용할 수 있도록 빌드 해주는 옵션이라고 생각하면 됩니다.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"]
FROM: 베이스 이미지(기반 이미지)를 설정합니다.WORKDIR: 컨테이너 내에서 작업할 디렉토리를 설정합니다.COPY: 파일이나 디렉토리를 컨테이너로 복사합니다.RUN: 명령어를 실행하여 이미지를 빌드할 때 필요한 작업을 수행합니다.EXPOSE: 컨테이너가 외부에 노출할 포트를 지정합니다.CMD: 컨테이너가 실행될 때 기본적으로 실행할 명령을 설정합니다.Dockerfile을 작성한 후, docker build 명령어를 통해 이미지를 생성할 수 있습니다.
AWS CLI는 공식문서 를 통해 설치 및 설정 합니다.

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

해당 푸시명령 대로 Docker Image 를 Build 하고, ECR 에 푸시할 수 있습니다.
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 이미지를 빌드한 후, ECR로 푸시할 수 있도록 태깅합니다.
docker build -t my-app .
docker tag my-app:latest <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-repo:latest
이미지를 ECR에 푸시합니다.
docker push <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-repo:latest

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

Docker와 AWS ECR을 활용하면 컨테이너 이미지를 AWS에 저장하고,
이를 이용해 Elastic Container Service(ECS) 또는 Kubernetes 등의 플랫폼에서 애플리케이션을 쉽게 배포할 수 있습니다.
이러한 방식으로 운영 환경에서 CI/CD 파이프라인을 구축하면 애플리케이션 배포 속도를 높이고, 일관된 환경에서 서비스가 실행될 수 있도록 할 수 있습니다.