Docker Image CI/CD with Docker Hub, Azure Container App

heering·2024년 1월 28일
0

Azure

목록 보기
3/4

준비물

  • Azure Container App
  • Docker Hub
  • GitHub

개요

Microsoft Student Ambassador가 되고 나서 Alpha 마일스톤으로 승급했다. 덕분에 Azure $150를 매달 지원받는데, 안 쓰면 아깝다. 기존에 University Student로서 지원받았던 계정에는 대략 5만원이 남았다. 빨리 해치우고 엠버서더 계정으로 갈아타야지! 하는 생각에 이 CI/CD 여정이 시작되었다.

구조

  1. GitHub Repository의 특정 폴더 안에서, 혹은 특정 브랜치에서 커밋 push가 일어날 때마다 Dockerfile을 빌드하고 이미지를 Docker Hub에 올린다.
  2. Docker Hub에 이미지가 update될 때마다 Azure Container App에서 pull 하고, run한다.
    (주기적으로 Container App에서 이미지 변경을 확인하려면, Container App Job을 만들어서 Cron 식을 입력해 일정 시간동안 트리거해야하는 것 같다.)

상세 설명

먼저 GitHub repository 안에 아래처럼 .github/workflows/ci.yml이라는 파일을 만들었다고 가정하자.

name: Docker Image CI

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:

  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v3
    - name: docker login
      env:
        DOCKER_USER: ${{secrets.DOCKER_USER}}
        DOCKER_PASSWORD: ${{secrets.DOCKER_PASSWORD}}
      run: |
        docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
    - name: Build the Docker image
      run: docker build --tag ${{secrets.DOCKER_USER}}/scraper:latest -f my_server/Dockerfile .
    - name: docker push
      run: docker push ${{secrets.DOCKER_USER}}/scraper:latest

여기서 이미지 이름은 scraper이고, 태그 이름은 latest이다. 그리고 Dockerfile이 있는 폴더명은 GitHub repository 루트로부터 my_server/Dockerfile이다.
Dockerfile이 루트 디렉토리에 있는 게 아니라면 Dockerfile 내에서도 COPY할 때 신경 써야 한다. COPY . .라고 하던 거를 COPY /my_server/. . 해야 함.

Secret 값들은 GitHub Settings에서 미리 넣어두어야 한다.

위처럼 workflow를 만들어주면 변경사항이 있을 때마다 Docker Hub에 올려주는 CI가 된다.

그리고 이제 Azure Container App을 하나 만든다.

연결 대상을 이처럼 Docker Hub로 설정하고, 이미지 이름과 태그에 {유저명}/{이미지명}:{태그명}으로 입력하여 연결하면 된다.

여기서 잠깐. 나는 Dockerfile에서 EXPOSE 8000을 하였다. 그런데 Azure Container App에서는 어떻게 접속하면 될까?

이렇게 수신 탭에 들어가서 HTTP 포트를 뚫어준다. 사진에는 잘렸지만 수신 트래픽도 '어디서나 트래픽 허용'으로 선택해야 한다. 그러면 엔드포인트로 들어갈 시 정상적으로 배포된 모습을 확인할 수 있다. 이렇게 CD도 완료.

0개의 댓글