사용자 지정 컨테이너 이미지를 사용하여 애플리케이션 배포

주의

이 문서에서는 EOL(수명 종료) 상태에 가까워진 Linux 배포판인 CentOS를 참조하세요. 이에 따라 사용 및 플랜을 고려하세요. 자세한 내용은 CentOS 수명 종료 지침을 참조하세요.

참고 항목

Azure Spring Apps는 Azure Spring Cloud 서비스의 새 이름입니다. 서비스에 새 이름이 지정되었지만, 자산을 업데이트하는 동안 스크린샷, 비디오, 다이어그램과 같은 일부 위치에서는 당분간 이전 이름이 표시됩니다.

이 문서 적용 대상: ✔️ 표준 ✔️ 엔터프라이즈

이 문서에서는 Azure Spring Apps에서 사용자 지정 컨테이너 이미지를 사용하여 Spring Boot 애플리케이션을 배포하는 방법을 설명합니다. 사용자 지정 컨테이너를 사용하여 애플리케이션을 배포하면 JAR 애플리케이션을 배포할 때처럼 대부분의 기능이 지원됩니다. 다른 Java 및 비 Java 애플리케이션도 컨테이너 이미지를 사용하여 배포할 수 있습니다.

필수 조건

  • 애플리케이션이 들어 있는 컨테이너 이미지.
  • 이미지는 이미지 레지스트리로 푸시됩니다. 자세한 내용은 Azure Container Registry를 참조하세요.

참고 항목

웹 애플리케이션은 1025 포트(표준 플랜의 경우) 및 8080 포트(엔터프라이즈 플랜의 경우)에서 수신 대기해야 합니다. 포트를 변경하는 방법은 애플리케이션의 프레임워크에 따라 달라집니다. 예를 들어 Spring Boot 애플리케이션은 SERVER_PORT=1025, ASP.NET Core 애플리케이션은 ASPNETCORE_URLS=http://+:1025/를 지정합니다. 포트에서 수신 대기하지 않는 애플리케이션에 대해 프로브를 사용하지 않도록 설정할 수 있습니다. 자세한 내용은 Azure Spring Apps에서 호스트되는 앱에 대한 상태 프로브 및 정상 종료 기간을 구성하는 방법을 참조하세요.

응용 프로그램 배포

사용자 지정 컨테이너 이미지에 애플리케이션을 배포하려면 다음 단계를 수행합니다.

컨테이너 이미지를 배포하려면 다음 명령 중 하나를 사용합니다.

  • 공용 Docker Hub 또는 앱에 컨테이너 이미지를 배포하려면 다음 명령을 사용합니다.

    az spring app deploy \
       --resource-group <your-resource-group> \
       --name <your-app-name> \
       --container-image <your-container-image> \
       --service <your-service-name>
    
  • ACR에서 앱으로 또는 다른 프라이빗 레지스트리에서 앱으로 컨테이너 이미지를 배포하려면 다음 명령을 사용합니다.

    az spring app deploy \
       --resource-group <your-resource-group> \
       --name <your-app-name> \
       --container-image <your-container-image> \
       --service <your-service-name>
       --container-registry <your-container-registry> \
       --registry-password <your-password> |
       --registry-username <your-username>
    

이미지의 진입점을 덮어쓰려면 위의 명령에 다음 두 인수를 추가합니다.

    --container-command "java" \
    --container-args "-jar /app.jar -Dkey=value"

웹 애플리케이션이 아닌 이미지의 포트에서 수신 대기를 사용하지 않도록 설정하려면 위의 명령에 다음 인수를 추가합니다.

    --disable-probe true

기능 지원 표

다음 표는 각 애플리케이션 유형에서 지원되는 기능을 보여줍니다.

기능 Spring Boot 앱 - 컨테이너 배포 Polyglot 앱 - 컨테이너 배포 주의
앱 수명 주기 관리 ✔️ ✔️
컨테이너 레지스트리를 지원합니다. ✔️ ✔️
엔드포인트 할당 ✔️ ✔️
Azure Monitor ✔️ ✔️
APM 통합 ✔️ ✔️ 수동 설치가 지원됩니다.
파란색/녹색 배포 ✔️ ✔️
사용자 지정 도메인 ✔️ ✔️
크기 조정 - 자동 크기 조정 ✔️ ✔️
스케일링 - 수동 스케일링(인/아웃, 업/다운) ✔️ ✔️
관리 ID ✔️ ✔️
Spring Cloud Eureka 및 Config Server ✔️
VMware Tanzu용 API 포털 ✔️ ✔️ 엔터프라이즈 플랜만 해당
Spring Cloud Gateway for VMware Tanzu ✔️ ✔️ 엔터프라이즈 플랜만 해당
Application Configuration Service for VMware Tanzu ✔️ 엔터프라이즈 플랜만 해당
VMware Tanzu용 애플리케이션 라이브 뷰 ✔️ 엔터프라이즈 플랜만 해당
VMware Tanzu 서비스 레지스트리 ✔️ 엔터프라이즈 플랜만 해당
VNET ✔️ ✔️ NSG 또는 Azure Firewall 허용 목록에 레지스트리 추가
발신 IP 주소 ✔️ ✔️
E2E TLS ✔️ ✔️ 자체 서명된 CA를 신뢰합니다.
활동성 및 준비성 설정 ✔️ ✔️
고급 문제 해결 - 스레드/힙/JFR 덤프 ✔️ 이미지에는 PATH가 지정된 Bash 및 JDK가 포함되어야 합니다.
사용자 고유의 스토리지 가져오기 ✔️ ✔️
리소스 커넥터와 서비스 바인딩 통합 ✔️
가용성 영역 ✔️ ✔️
앱 수명 주기 이벤트 ✔️ ✔️
감소된 앱 크기 - 0.5 vCPU 및 512MB ✔️ ✔️
Terraform을 사용하여 앱 배포 자동화 ✔️ ✔️
일시 삭제 ✔️ ✔️
대화형 진단 환경(AppLens 기반) ✔️ ✔️
SLA ✔️ ✔️

참고 항목

Polyglot 앱에는 비 Spring Boot Java, NodeJS, AngularJS, Python 및 .NET 앱이 포함됩니다.

사용자 지정 컨테이너를 사용하여 배포할 때 알아야 할 공통 사항

다음 사항은 사용자 지정 이미지를 사용하여 배포할 때 일반적인 상황을 해결하는 데 도움이 됩니다.

인증 기관 신뢰

인증 기관을 신뢰하는 두 가지 옵션이 있습니다.

옵션 1: Azure Spring Apps를 통해 업로드

앱에 CA 인증서를 로드하려면 Azure Spring Apps의 애플리케이션에서 TLS/SSL 인증서 사용을 참조하세요. 그런 다음 인증서가 /etc/azure-spring-cloud/certs/public/ 위치에 탑재됩니다.

옵션 2: 이미지에서 수동 설치

이미지의 CA를 신뢰하려면 환경에 따라 다음 변수를 설정합니다.

  • Dockerfile에 다음 줄을 추가하여 Java 애플리케이션을 트러스트 저장소로 가져와야 합니다.

    ADD EnterpriseRootCA.crt /opt/
    RUN keytool -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias EnterpriseRootCA -file /opt/EnterpriseRootCA.crt
    
  • Node.js 애플리케이션의 경우 NODE_EXTRA_CA_CERTS 환경 변수를 설정합니다.

    ADD EnterpriseRootCA.crt /opt/
    ENV NODE_EXTRA_CA_CERTS="/opt/EnterpriseRootCA.crt"
    
  • Python 또는 시스템 CA 저장소를 사용하는 다른 언어의 경우 Debian 또는 Ubuntu 이미지에서 다음 환경 변수를 추가합니다.

    ADD EnterpriseRootCA.crt /usr/local/share/ca-certificates/
    RUN /usr/sbin/update-ca-certificates
    
  • Python 또는 시스템 CA 저장소를 사용하는 다른 언어의 경우 CentOS 또는 Fedora 기반 이미지에서 다음 환경 변수를 추가합니다.

    ADD EnterpriseRootCA.crt /etc/pki/ca-trust/source/anchors/
    RUN /usr/bin/update-ca-trust
    

이미지가 변경될 때 예기치 않은 동작 방지

애플리케이션을 다시 시작하거나 스케일 아웃할 때 항상 최신 이미지를 끌어옵니다. 이미지가 변경되면 새로 시작된 애플리케이션 인스턴스는 새 이미지를 사용하고 이전 인스턴스는 이전 이미지를 계속 사용합니다.

참고 항목

예기치 않은 애플리케이션 동작을 방지하려면 latest 태그를 사용하거나 태그 변경 없이 이미지를 덮어쓰지 마세요.

VNet에서 컨테이너 레지스트리에 연결할 수 없는 상황이 발생하지 않도록 방지

인스턴스를 VNet에 배포한 경우 NSG 또는 Azure Firewall(사용되는 경우)에서 컨테이너 레지스트리에 대한 네트워크 트래픽을 허용해야 합니다. 자세한 내용은 필요한 보안 규칙을 추가하는 방법에 대한 VNet에서 실행하기 위한 고객의 책임을 참조하세요.

수동으로 이미지에 APM 설치

설치 단계는 APM(애플리케이션 성능 모니터) 및 언어에 따라 다릅니다. 다음은 Java 애플리케이션을 사용하는 New Relic의 설치 단계입니다. 다음 단계에 따라 Dockerfile을 수정해야 합니다.

  1. Dockerfile에 다음을 추가하여 에이전트 파일을 다운로드하고 이미지에 설치합니다.

    ADD newrelic-agent.jar /opt/agents/newrelic/java/newrelic-agent.jar
    
  2. 다음과 같이 APM에 필요한 환경 변수를 추가합니다.

    ENV NEW_RELIC_APP_NAME=appName
    ENV NEW_RELIC_LICENSE_KEY=newRelicLicenseKey
    
  3. java -javaagent:/opt/agents/newrelic/java/newrelic-agent.jar을 추가하여 이미지 진입점을 수정합니다.

다른 언어의 에이전트를 설치하려면 다른 에이전트에 대한 공식 설명서를 참조하세요.

New Relic:

Dynatrace:

AppDynamics:

컨테이너 로그 보기

컨테이너 애플리케이션의 콘솔 로그를 보려면 다음 CLI 명령을 사용합니다.

az spring app logs \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --service <your-service-name> \
    --instance <your-instance-name>

Azure Monitor에서 컨테이너 이벤트 로그를 보려면 다음 쿼리를 입력합니다.

AppPlatformContainerEventLogs
| where App == "hw-20220317-1b"

컨테이너 이벤트 로그를 보여 주는 Azure Monitor 스크린샷.

이미지 취약성 검사

이미지가 취약해지는 것을 방지하기 위해 클라우드용 Microsoft Defender를 ACR과 함께 사용하는 것이 좋습니다. 자세한 내용은 클라우드용 Microsoft Defender를 참조하세요.

JAR 배포와 컨테이너 배포 간 전환

다음 명령을 사용하여 다시 배포하면 배포 유형을 JAR 배포에서 컨테이너 배포로 직접 바꿀 수 있습니다.

az spring app deploy \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --container-image <your-container-image> \
    --service <your-service-name>

또는 반대로:

az spring app deploy \
    --resource-group <your-resource-group> \
    --name <your-app-name> \
    --artifact-path <your-jar-file> \
    --service <your-service-name>

기존 JAR 배포를 사용하여 다른 배포 만들기

다음 명령을 통해 기존 JAR 배포를 사용하여 다른 배포를 만들 수 있습니다.

az spring app deployment create \
    --resource-group <your-resource-group> \
    --name <your-deployment-name> \
    --app <your-app-name> \
    --container-image <your-container-image> \
    --service <your-service-name>

CI/CD

Azure Pipelines 작업 또는 GitHub Actions를 사용한 배포 자동화가 이제 지원됩니다. 자세한 내용은 Azure Spring Apps에 대한 애플리케이션 배포 자동화GitHub Actions로 Azure Spring Apps CI/CD 사용을 참조하세요.

다음 단계