Azure와 함께 하는 DevOps

50. 컨테이너용 Azure Web App에 도커로 된 JAVA 앱 배포하기

zerobig-k8s 2020. 9. 21. 07:43

<참조> https://azuredevopslabs.com/labs/vstsextend/dockerjava/

 

 

 

 

 

개요

컨테이너용 Azure Web App을 이용하면 컨테이너 기반 웹 앱을 쉽게 배포할 수 있다. Docker Hub 또는 개인 Azure Container Registry에서 컨테이너 이미지를 추출하여 프로덕션에 선호하는 종속성이 있는 컨테이너화 된 앱을 몇 초 만에 배포할 수 있다.

 

 

 

 

이 랩에서 다루는 것들

이 랩에서는 컨테이너 용 Azure 웹앱에 컨테이너 기반 Java 웹 애플리케이션을 배포하기 위해 Azure Pipelines를 사용하여 지속적 통합(CI) 및 지속적 배포(CD) 파이프라인을 설정하는 방법을 알아본다.

 

이 랩은 다음의 내용을 수행하는 방법을 보여 줄 것이다.

  • 컨테이너를 사용하여 새 Azure App Service를 만들고 Apache Tomcat을 사용하도록 구성
  • 새 MySQL 데이터베이스 생성
  • Azure App Service Task를 사용하여 WAR 파일 배포

 

추가 학습을 원한다면 Microsoft Learn에서 Azure Pipelines 모듈을 사용하여 Java 컨테이너 배포 자동화를 확인한다.

 

 

 

 

시작하기 전에

1. 실습을 시작하기 전에 시작하기 페이지를 참조한다.

 

2. Azure DevOps 데모 생성기를 사용하여 Azure DevOps 조직에서 프로젝트를 프로비전 한다. MyShuttle 템플릿을 사용한다.

참고 : 
Jenkins, Azure DevOps 및 Azure와 함께 작업하여 이 랩을 따라하는 경우 다음 실습은 건너뛰고 배포로 이동한다.

 

실습 1: 도커 이미지 빌드 및 게시를 위한 CI 파이프라인 구성하기

이 태스크에서는 이미지를 빌드하고 Azure Container Registry에 푸시하는 CI 파이프라인을 구성한다. 

1. Azure Portal을 연다.

 

2. + Create a resource를 선택하고 Container Registry를 검색한다. Create를 선택한다. Create Container Registry 대화 상자에서 서비스 이름을 입력하고 리소스 그룹, 위치를 선택한 다음 Review + Create를 누른다.  유효성 검사가 성공했으면 Create를 클릭한다.

 

 

3. 리소스가 프로비저닝되면 리소스로 이동하여 Container Registry에 대한 관리자를 사용 설정다.

 

 

4. Azure DevOps 프로젝트로 이동하고 Pipelines에서 Pipelines을 선택한다. MyShuttleDockerBuild를 선택하고 Edit을 클릭한다.

 

5. 빌드 정의에 사용된 태스크를 살펴 ​​보겠다. 

 

6. Maven 태스크을 선택한다. 이 태스크는 pom.xml 파일을 빌드하는 데 사용된다. Maven 태스크는 다음 추가 설정으로 업데이트된다.

Paremeter Value Notes
Code Coverage Tool JaCoCo 커버리지 도구로 JaCoCo를 선택한다.
Options -DskipITs --settings ./maven/settings.xml 빌드 중 통합 테스트를 건너 뛴다.
Source Files Directory src/main JaCoCo의 소스 파일 디렉토리를 설정한다.

 

 

7. 그런 다음 Copy 태스크가 있다. 소스 디렉토리의 WAR 파일을 스테이징 폴더로 복사한다. (기본 설정이 이미 되어있다.)

Paremeter Value Notes
Source Folder $(build.sourcesdirectory) 소스 폴더에서 복사한다.
Contents target/myshuttledev*.war, *.sql MyShuttle WAR 파일을 복사한다.
Target Folder $(build.artifactstagingdirectory) 기본 스테이징 폴더에 복사한다.

 

 

8. 다음으로 Azure Pipelines에 빌드 아티팩트를 게시하는 Publish 태스크가 있다. (기본 설정이 이미 되어있다.)

Paremeter Value Notes
Path to publish $(build.artifactstagingdirectory) 스테이징 폴더에서 컨텐츠를 복사한다.
Artifact name drop 아티팩트 폴더의 이름을 제공한다.
Artifact publish location Azure Pipelines Azure 파이프라인에 게시한다.

 

 

9. 다음으로 이미지를 빌드하고 게시하는 두 가지 Docker 태스크가 있다. 첫 번째 Docker 태스크를 선택하고 Command Build로 설정되어 있는지 확인한다. Docker compose 태스크의 다른 설정은 다음과 같다.

Paremeter Value Notes
Azure Subscription Authorize your Azure subscription 레지스트리가 포함 된 구독 (설정필요)
Container Registry Type Azure Container Registry 이전에 만든 Azure Container Registry에 연결하기 위한 것이다. 
Azure Container Registry Your registry 이전에 만든 Azure Container 레지스트리를 선택한한다. (설정필요)
Command build Docker 명령
Dockerfile src/Dockerfile Docker 파일의 src 폴더를 가리킨다.
Use default build context Uncheck this option  
Build context . (dot representing the root folder) 빌드 컨텍스트는 루트 폴더 여야 한다.
Image name Web:$(Build.BuildNumber) 빌드의 각 인스턴스에 대해 고유한 이름을 설정한다.
Qualify image name Check (set to true)  
Include Latest Tag Check (set to true) 이 빌드에서 생성된 이미지에 최신 태그를 추가한다.

 

 

10. 거의 동일한 설정을 가진 두 번째 Docker 태스크가 있다. 유일한 변경 사항은 명령이 푸시로 설정되고 이미지 이름이 Web:$(Build.BuildNumber)로 설정된다는 것이다. 이 태스크는 웹 이미지를 컨테이너 레지스트리로 푸시하도록 작업에 지시한다. (기본 설정이 이미 되어있다.)

 

 

11. 이 빌드를 저장하고 대기열에 넣으려면 Save and Queue 버튼을 클릭한다. Hosted Ubuntu 1604 빌드 에이전트를 사용하고 있는지 확인한다.

 

 

12. 빌드가 완료 될 때까지 기다린다. 성공하면 Azure Portal로 이동하여 이미지가 성공적으로 푸시되었는지 확인할 수 있다.

 

 

13. Eclipse 랩에서 이 과정을 따라가는 경우 Azure Explorer 보기에서 이미지가 제대로 푸시되었는지도 확인할 수 있다. Azure에 로그인하고 Azure Container Registry를 새로 고친다. 마우스 오른쪽 버튼을 클릭하고 컨테이너 레지스트리 탐색을 선택한다. 빌드 번호로 태그가 지정된 이미지를 확인한다.

 

 

실습 2: 컨테이너용 Azure 웹앱에 배포하기

이 실습에서는 웹 애플리케이션을 Azure 웹앱에 배포하는 릴리즈 파이프라인을 설정한다. 먼저 MYSQL로 컨테이너 용 웹 앱을 만들어 보겠다. 

1. Azure Portal로 다시 이동한다.

 

2. Azure Portal에서 + Create a resource를 선택하고 Web App을 검색 한 다음 Create를 선택하고 클릭한다.

 

3. 다음 세부 정보를 제공하고 Next를 클릭한다.

  • 새 웹앱의 이름을 입력한다.
  • Azure 구독을 선택한다.
  • 웹앱에 대한 기존 리소스 그룹을 선택하거나 새 리소스 그룹을 만든다.
  • App Service 계획/위치를 그대로 둔다.

 

 

4. Docker 탭에서 Azure Container Registry를 이미지 원본으로 선택한다. 각 드롭 다운에서 레지스트리, 이미지  태그를 선택하고 Review + create를 클릭한 다음 Create를 클릭한다.

 

 

5. 프로비저닝이 완료되면 웹앱 개요 페이지로 이동하고 URL을 선택하여 웹앱을 탐색한다. 기본 Tomcat 페이지가 표시되어야 한다.

 

 

6. /myshuttledev를 URL의 웹 애플리케이션 컨텍스트 경로에 추가하여 MyShuttle 로그인 페이지로 이동한다. 예를 들어 웹앱 URL이 https://myshuttle-azure.azurewebsites.net/ 이면 로그인 페이지에 대한 URL은 https://myshuttle-azure.azurewebsites.net/myshuttledev/ 이다.

새로운 이미지가 Azure 포털 자체 내에서 레지스트리에 푸시될 때 웹 앱을 배포하도록 지속적인 배포(Continuous Deployment)를 구성할 수 있다. 그러나 Azure Pipeline을 설치하면 애플리케이션 배포를 위한 더 많은 유연성과 추가 제어(승인, 릴리즈 게이트 등)를 제공할 것이다.

 

 

7. MySQL을 위한 Azure Database도 만들어야 한다. + Create a resource를 선택하고 Azure Database for MySQL(Single)를 검색한 다음 Create를 선택하고 누른다. 필요한 모든 필수 정보를 제공하고 메모장에 Password를 적어 둔다. 나중에 배포 파이프라인에서 그것을 사용할 것이다. Review + create를 누른 후 Create를 누른다.

 

 

8. 프로비저닝 된 MySQL 용 Azure Database 서버로 이동한다. Server name  Server admin login name을 메모장에 저장한다.

 

 

9. Connection security를 선택한다. Allow access to Azure services를 활성화하고 변경 사항을 Save한다. 이는 MySQL 서버의 모든 데이터베이스에 대한 Azure 서비스에 대한 액세스를 제공한다.

 

 

10. Azure DevOps 계정으로 돌아가 Pipelines 허브에서 Releases를 선택한다. 릴리즈 정의-MyShuttleDockerRelease를 선택하고 Edit을 클릭한다.

 

 

 

11. Tasks 탭으로 이동하여 Azure-Dev를 선택한다. 환경을 아래와 같이 구성한다.

  • Azure 구독을 선택한다.
  • 생성한 App Service를 입력한다.

 

 

12. Execute Azure MYSQL:SqlTaskFile 태스크를 선택하고 Azure 구독을 선택한 다음 데이터베이스 서버를 만드는 동안 이전에 기록해 둔 DB 세부 정보를 제공한다.

  • 드롭 다운에서 호스트 이름을 선택한다.
  • 서버 관리자 로그인 -  Variables 섹션으로 이동하여 변수 값 - $(DBUSER)를 입력한다.
  • 비밀번호를 입력한다. Azure Portal에서 MYSQL 데이터베이스를 만드는 동안 제공되는 암호이다. Variables 섹션으로 이동하여 변수 값 ($(DBPASSWORD))을 입력한다. lock 아이콘을 클릭하여 더미 값을 해독한 다음 암호를 입력한다.

  • 버전이 제어되고 데이터베이스, 테이블을 생성하고 레코드를 채우는 여기에 제공된 MYSQL script

 

 

13. Azure App Service 배포 태스크를 선택하고 다음 값이 제공되었는지 확인한다. 이 태스크를 사용하면 가져올 태그를 지정할 수 있다. 이를 통해 각 배포에 대해 빌드 별 태그를 사용하여 코드에서 배포까지 종단 간 추적 성을 달성 할 수 있다. 예를 들어 Docker 빌드 태스크를 사용하면 각 배포에 대해 Build.Number로 이미지에 태그를 지정할 수 있다.

  • 레지스트리 또는 네임 스페이스 - 생성 된 Container Registry의 로그인 서버 값을 제공한다. 개요 섹션에서 찾을 수 있다.
  • 이미지 - 값을 웹으로 제공한다. 빌드 후 컨테이너 이미지가 저장되는 위치이다.
  • 태그 - 값을 $(Build.BuildNumber)로 제공한다.

 

 

14. Save 선택한 다음 Create Release를 클릭한다.

 

15. 사용할 아티팩트 버전을 확인한 다음 Create를 선택한다.

 

 

16. 릴리즈가 완료 될 때까지 기다린 다음 URL http://{your web app name}.azurewebsites.net/myshuttledev로 이동한다. 로그인 페이지를 볼 수 있어야 한다.

 

 

실습 3:  웹앱에서 MySQL 연결 문자열 구성하기

1. 생성한 웹앱으로 이동한다. Configuration을 클릭하고 Application Settings을 선택한다. Connection Strings 섹션까지 아래로 스크롤한다.

 

2. 이름이 MyShuttleDb 인 새 MySQL 연결 문자열과 다음 문자열을 추가한다. 

jdbc:mysql://{MySQL Server Name}.mysql.database.azure.com:3306/alm?useSSL=true&requireSSL=false&autoReconnect=true&user={your user name}@{MySQL Server Name}&password={your password}.

각자에 맞게 다음과 같이 적어 둔 값으로 바꾼다.

  • MySQL 서버 이름 - MySQL 서버 개요 페이지의 Server Name
  • 사용자 이름 - MySQL Server 개요 페이지의 SERVER ADMIN LOGIN NAME
  • 암호 - Azure에서 MYSQL 서버를 만드는 동안 제공한 Password 

 

 

3. Save 클릭하여 연결 문자열을 저장한다.

 

4. 지금 애플리케이션에 로그인 할 수 있다. 웹 애플리케이션으로 돌아가서 아래 사용자 이름/비밀번호 조합을 사용하여 로그인 해본다.

  • fred/fredpassword
  • wilma/wilmapassword
  • betty/bettypassword