⭐ 핵심 개념 정리
AKS(Azure Kubernetes Service)
AKS는 Azure에서 제공하는 관리형 Kubernetes 서비스다. Kubernetes를 직접 구성하고 운영하려면 상당한 전문 지식이 필요하지만, AKS를 사용하면 클러스터 관리의 복잡성과 운영 부담 대부분을 Azure가 대신 처리해준다.
아래와 같은 상황에 특히 적합하다.
- 고가용성, 확장성, 이식성이 필요한 컨테이너 애플리케이션을 배포·관리할 때
- 오픈 소스 도구를 활용하거나 기존 DevOps 도구와 통합해야 할 때
- 여러 지역에 걸쳐 애플리케이션을 배포해야 할 때

ACR(Azure Container Registry)
ACR은 오픈 소스 Docker Registry 2.0을 기반으로 하는 Azure의 관리형 프라이빗 Docker 레지스트리 서비스다. Docker Hub가 퍼블릭 이미지 저장소라면, ACR은 Azure에 호스팅된 프라이빗 저장소로 이해하면 된다.
ACR을 사용하면 모든 유형의 컨테이너 배포에 필요한 이미지를 빌드하고 저장하며 관리할 수 있다. AKS와 함께 사용하면 프라이빗 이미지를 안전하게 클러스터에 배포하는 구성을 만들 수 있다.
Azure CLI
Azure CLI(명령줄 인터페이스)는 Azure 리소스를 터미널에서 직접 관리할 수 있는 플랫폼 간 명령줄 도구다.
Azure Portal에 매번 접속하지 않고도 대부분의 관리 작업을 빠르고 정확하게 처리할 수 있다.
- Windows(
cmd.exe), Linux/macOS(Bash) 등 다양한 환경에서 사용 가능하다 - 반복 작업은 셸 스크립트로 자동화할 수 있다
- 로컬 설치 외에도 브라우저의 Azure Cloud Shell이나 Docker 컨테이너 내에서도 실행할 수 있다
Azure Web App for Containers
Azure Web App for Containers는 컨테이너화된 웹 애플리케이션을 쉽게 배포하고 실행할 수 있는 관리형 호스팅 플랫폼이다. Azure App Service의 일부로 제공되며, 인프라 관리 부담 없이 컨테이너 기반 앱을 운영할 수 있게 해준다.
아래와 같은 특징을 가지고 있다.
- 간편한 배포: Docker Hub 또는 ACR에서 컨테이너 이미지를 가져와 몇 초 안에 프로덕션 환경에 배포할 수 있다. OS 패치, 용량 프로비저닝, 로드 밸런싱은 플랫폼이 자동으로 처리한다.
- CI/CD 통합: Docker Hub, ACR, GitHub와의 통합을 통해 소스 코드가 변경될 때마다 자동으로 앱을 업데이트하는 CI/CD 파이프라인을 구성할 수 있다. 배포 슬롯을 활용하면 가동 중단 없이 스테이징에서 프로덕션으로 전환하거나 이전 버전으로 롤백할 수 있다.
- 자동 스케일링: 애플리케이션 요구에 따라 수평·수직으로 자동 스케일링이 가능하다. 트래픽이 몰리는 피크 시간에는 자동으로 확장하고, 사용량이 적은 시간에는 비용을 최소화한다.
- 보안 및 규정 준수: Microsoft의 엔터프라이즈급 보안 기준을 따르며, ISO, SOC2, PCI 등 다양한 보안 표준을 충족한다.
⭐ Azure CLI 설치하기
1) 패키지 목록을 업데이트하고 업그레이드한다.
sudo apt update
sudo apt-get upgrade
2) Azure CLI를 설치한다. 방법 1은 스크립트 한 줄로 한 번에 설치하는 가장 간단한 방법이고, 방법 2는 각 단계를 직접 수행하는 방식이다. 둘 중 하나만 하면 된다.
방법 1 : 한 줄 명령어로 설치
curl -fsSL 'https://azurecliprod.blob.core.windows.net/$root/deb_install.sh' | sudo bash
방법 2 : 단계별 설치
# 필요한 패키지 설치
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release
# Microsoft 서명 키 등록
sudo mkdir -p /etc/apt/keyrings
curl -sLS https://packages.microsoft.com/keys/microsoft.asc | \
gpg --dearmor | sudo tee /etc/apt/keyrings/microsoft.gpg > /dev/null
sudo chmod go+r /etc/apt/keyrings/microsoft.gpg
# Azure CLI 저장소 추가
AZ_DIST=$(lsb_release -cs)
echo "Types: deb
URIs: https://packages.microsoft.com/repos/azure-cli/
Suites: ${AZ_DIST}
Components: main
Architectures: $(dpkg --print-architecture)
Signed-by: /etc/apt/keyrings/microsoft.gpg" | sudo tee /etc/apt/sources.list.d/azure-cli.sources
# Azure CLI 설치
sudo apt-get update
sudo apt-get install azure-cli
3) 설치가 완료되었는지 확인한다. 명령어 목록이나 도움말이 출력되면 정상이다.
az
4) Azure 계정으로 로그인한다. 명령어 실행 후 출력되는 링크에 접속해 코드를 입력하고 로그인한 뒤, 사용할 구독을 선택한다.
az login
5) 리소스 그룹 목록을 조회하여 로그인과 구독 설정이 정상인지 확인한다.
az group list
⭐ Docker 샘플 프로젝트 준비하기
1) Docker와 Git이 설치되어 있는지 확인한다.
docker --version
git --version
2) Azure 샘플 Django 프로젝트를 클론하고 프로젝트 폴더로 이동한다.
git clone https://github.com/Azure-Samples/docker-django-webapp-linux --config core.autocrlf=input
cd docker-django-webapp-linux
3) Dockerfile을 열어 내용을 확인한다.
vi Dockerfile
이 프로젝트의 베이스 이미지(tiangolo/uwsgi-nginx-flask:python3.6)가 너무 오래된 환경을 기반으로 하여, 내부에서 참조하는 Debian buster 저장소가 현재 일반 저장소에서 더 이상 정상 조회되지 않는 문제가 있다. 아래와 같이 Dockerfile 상단에 저장소 주소를 archive 서버로 교체하는 코드를 추가한다.
FROM tiangolo/uwsgi-nginx-flask:python3.6
RUN sed -i 's|deb.debian.org/debian|archive.debian.org/debian|g' /etc/apt/sources.list && \
sed -i 's|security.debian.org/debian-security|archive.debian.org/debian-security|g' /etc/apt/sources.list && \
sed -i '/buster-updates/d' /etc/apt/sources.list && \
echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf.d/99no-check-valid-until
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt --no-cache-dir
ADD . /code/
# ssh
ENV SSH_PASSWD="root:Docker!"
RUN apt-get update \
&& apt-get install -y --no-install-recommends dialog \
&& apt-get update \
&& apt-get install -y --no-install-recommends openssh-server \
&& echo "$SSH_PASSWD" | chpasswd
COPY sshd_config /etc/ssh/
COPY init.sh /usr/local/bin/
RUN chmod u+x /usr/local/bin/init.sh
EXPOSE 8000 2222
ENTRYPOINT ["init.sh"]
수정 후 Esc → :wq로 저장한다.
4) Docker 이미지를 빌드하고 목록을 확인한다.
docker build --tag appsvc-tutorial-custom-image .
docker images

5) 컨테이너를 실행한다. Azure Portal에서 8000 포트의 인바운드·아웃바운드 보안 규칙을 추가한 뒤, 브라우저에서 가상머신IP:8000으로 접속하면 앱이 정상 실행되는 것을 확인할 수 있다.
docker run -it -p 8000:8000 appsvc-tutorial-custom-image


⭐ ACR에 이미지 푸시하기
실습에서 사용한 변수 값
아래 코드는 개인적으로 설정한 값을 기준으로 작성된 것이다.
직접 실습할 때는 아래 표를 참고해서 본인의 값으로 바꿔서 입력해야 한다.
| 항목 | 사용한 값 | 설명 |
| 리소스 그룹 | AppDev | Azure 리소스를 묶어서 관리하는 그룹 이름 |
| 위치 | japaneast | 리소스를 생성할 Azure 데이터센터 위치 |
| ACR 이름 | tanacr123 | 컨테이너 이미지를 저장할 레지스트리 이름 (전 세계에서 중복 불가) |
| Docker 이미지 이름 | appsvc-tutorial-custom-image | 빌드한 Docker 이미지에 붙인 태그 이름 |
| 관리 ID 이름 | myID | 웹앱이 ACR에 접근할 때 사용할 관리 ID 이름 |
| App Service 요금제 | tan-webplan | 웹앱이 사용할 App Service 요금제 이름 |
| 웹앱 이름 | tan-web | 생성할 Azure Web App 이름 (도메인 주소에 사용됨) |
1) 리소스 그룹을 생성하고, ACR(컨테이너 레지스트리)을 만든다.
* ACR 이름은 전 세계에서 중복되면 안 된다.
az group create --name AppDev --location japaneast
az acr create --name tanacr123 --resource-group AppDev --sku Basic --admin-enabled true

2) ACR에 로그인하고, 로컬 이미지에 ACR 주소를 태그로 붙인 뒤 푸시한다. 로그인 비밀번호는 위 az acr create 결과에서 출력된 password 값을 복붙한다.
docker login tanacr123.azurecr.io --username tanacr123
docker tag appsvc-tutorial-custom-image tanacr123.azurecr.io/appsvc-tutorial-custom-image
docker push tanacr123.azurecr.io/appsvc-tutorial-custom-image:latest
⭐ Azure Web App 생성 및 배포하기
1) 관리 ID에 ACR에서 이미지를 가져올 수 있는 권한(AcrPull)을 부여한다.
principalId=$(az identity show --resource-group AppDev --name myID --query principalId --output tsv)
registryId=$(az acr show --resource-group AppDev --name tanacr123 --query id --output tsv)
az role assignment create --assignee $principalId --scope $registryId --role "AcrPull"
2) App Service 요금제와 웹앱을 생성한다.
az appservice plan create --name tan-webplan --resource-group AppDev --is-linux
az webapp create --resource-group AppDev --plan tan-webplan --name tan-web \
--deployment-container-image-name tanacr123.azurecr.io/appsvc-tutorial-custom-image:latest
3) 웹앱을 구성한다. 포트 설정, 관리 ID 연결, CI/CD 활성화 순서로 진행한다.
# 포트 설정
az webapp config appsettings set --resource-group AppDev --name tan-web --settings WEBSITES_PORT=8000
# 관리 ID 연결
id=$(az identity show --resource-group AppDev --name myID --query id --output tsv)
az webapp identity assign --resource-group AppDev --name tan-web --identities $id
# ACR 관리 ID 인증 활성화
appConfig=$(az webapp config show --resource-group AppDev --name tan-web --query id --output tsv)
az resource update --ids $appConfig --set properties.acrUseManagedIdentityCreds=True
clientId=$(az identity show --resource-group AppDev --name myID --query clientId --output tsv)
az resource update --ids $appConfig --set properties.AcrUserManagedIdentityID=$clientId
# CI/CD 활성화
cicdUrl=$(az webapp deployment container config --enable-cd true \
--name tan-web --resource-group AppDev --query CI_CD_URL --output tsv)
위 설정이 완료되면 ACR에 새 이미지를 푸시할 때마다 웹앱이 자동으로 최신 이미지를 가져와 배포된다. CI/CD를 설정하지 않으면 웹앱을 수동으로 재시작해야 이미지가 반영된다.
4) 모든 설정이 완료되면 Azure Portal에서 웹앱의 기본 도메인을 확인한다. Portal에서 App Service → App Service → 개요로 이동하면 기본 도메인이 표시된다. 해당 주소로 접속하면 배포한 Django 앱이 정상적으로 실행되는 것을 확인할 수 있다.


'클라우드응용SW개발' 카테고리의 다른 글
| [Cloud] 14주차. Azure AI 서비스, Azure Language Service 실습 (0) | 2026.06.04 |
|---|---|
| [Cloud] 12주차-3. Kubernetes Deployment 실습 (0) | 2026.06.04 |
| [Cloud] 12주차-2. Minikube + kubectl 실습 (0) | 2026.06.04 |
| [Cloud] 12주차-1. 쿠버네티스와 Minikube (0) | 2026.06.04 |
| [Cloud] 11주차-2. Docker 설치 및 이미지 빌드 실습 (0) | 2026.06.03 |