Azure와 Docker를 사용한 서버 구축 및 배포 CI/CD

장유림·2025년 4월 12일

jz_project

목록 보기
5/7

사진 데이터를 많이 사용하기 때문에 Azure Blob Stroge를 사용한다.
AWS S3 → Azure Blob Storage

ChatGPT와의 대화

백엔드 배포를 위한 전체 로드맵 (NestJS + MySQL 기준)

  1. 리소스 그룹 생성 완료

  2. Dockerfile 작성 및 로컬 테스트

  3. ACR 생성
    Docker 이미지 저장소 만들기 (Azure CLI)

  4. Docker 이미지 빌드 & ACR에 push
    로컬에서 도커 이미지 올리기

  5. CI/CD 구성 (GitHub Actions)
    push 시 자동으로 Docker build + ACR push

📦 (병행) Blob Storage 생성

  • 사용자 업로드 이미지 저장 공간 만들기
  • .env에 Azure Storage 연결 정보 추가

2. Dockerfile 작성 및 로컬 테스트

루트에 생성

1) Dockerfile

# Stage 1: 빌드 단계
FROM node:18 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# Stage 2: 실행 단계
FROM node:18-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY .env .env

EXPOSE 3000
CMD ["node", "--experimental-global-webcrypto", "dist/main"]

2) .dockerignore

node_modules
dist

3) 테스트 빌드

docker build -t my-backend-app .
docker run --env-file .env -p 3000:3000 my-backend-app

여기서 중간에 데이터베이스 연결 오류가 있었고,
1. DATABASE_로 .env 파일 변수명을 바꾸다
2. DATABASE_HOST = host.docker.internal로 바꾸다
3.

docker rm -f test-backend
docker build -t my-backend-app .
docker run --env-file .env -p 3000:3000 my-backend-app

실행하다

의 단계를 거쳐 해결했다.

3, 4. ACR 생성 - Docker 이미지 저장소 만들기 (Azure CLI)

https://learn.microsoft.com/ko-kr/cli/azure/install-azure-cli-windows?pivots=winget

1) 위 링크의 방법으로 AzureCLI를 설치

winget install --exact --id Microsoft.AzureCLI

4/13 이어서

2) Azure 로그인

az login

3) Azure Resource Group
리소스 그룹 생성하기

az group create --name project-rg --location koreacentral

3) ACR 생성하기

az acr create --name projectname --resource-group project-rg --sku Basic --location koreacentral
  1. Docker 이미지 빌드 & ACR에 push

3) 도커 로컬 이미지를 ACR 이미지 태깅하기

docker tag my-backend-app projectname.azurecr.io/my-backend-app:dev

4) 태그한 이미지 도커에 push하기

docker push projectname.azurecr.io/my-backend-app:dev

5. CI/CD 구성 (GitHub Actions)

push 시 자동으로 Docker build + ACR push

1) docker-build.yaml(.github/workflows/.) 작성

name: Build and Push to ACR

on:
  push:
    branches:
      - dev # 개발 중

jobs:
  build-and-push:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: log in to Azure
        uses: azure/login@v1
        with:
          cred: ${{ secret.AZURE_CREDENTIALS }}

      - name: Azure ACR login
        run: az acr login --name projectname

      - name: Build and push Docker image
        run: |
          docker build -t project.azurecr.io/projectname:dev
          docker push project.azurecr.io/projectname:dev
  • dev 태그 하나만 계속 덮어쓰기 → 용량 증가 거의 없음 → 💰 문제 없음 ✅

  • ${{ github.sha }}로 push할 때마다 새 이미지 생성 → 용량 증가 → 💰 비용 발생 가능 ⚠️

    아직 개발 중이기 때문에 전자의 방식을 택했다.

2) GitHub에 필요한 Secret: AZURE_CREDENTIALS

  • Azure에서 서비스 주체 만들기:
az ad sp create-for-rbac --name "github-acr" --role contributor \
  --scopes /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/project-rg \
  --sdk-auth
  • subscription-id 알아내기
az account show --query id --output tsv
  • 출력된 JSON을 GitHub 리포지토리 → Settings → Secrets and Variables → Actions
    Repository Secrets에 AZURE_CREDENTIALS 이름으로 저장

진행 중 .env 에러가 발생해서


      - name: Create .env file from secret
        run: echo "${{ secrets.ENV_FILE }}" > .env
      

을 docker-build.yml에 추가했다.

이때, .env의 내용을 Repository Secrets에 ENV_FILE 이름으로 저장해야 한다.

profile
환영합니다

0개의 댓글