AWS App2Container 생성 Docker 이미지 최적화 - AWS 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS App2Container 생성 Docker 이미지 최적화

작성자: Varun Sharma(AWS)

환경: PoC 또는 파일럿

기술: 컨테이너 및 마이크로서비스, 현대화, DevOps

AWS 서비스: Amazon ECS

요약

AWS App2Container는 코드 변경 없이 온프레미스 또는 가상 머신에서 실행되는 기존 애플리케이션을 컨테이너로 변환하는 데 도움이 되는 명령줄 도구입니다.

애플리케이션 유형에 따라 App2Container는 보수적인 접근 방식을 사용하여 종속성을 식별합니다. 프로세스 모드에서는 애플리케이션 서버의 모든 비시스템 파일이 컨테이너 이미지에 포함됩니다. 이 경우 상당히 큰 이미지가 생성될 수 있습니다.

이 패턴은 App2Container에서 생성된 컨테이너 이미지를 최적화하는 방법을 제공합니다. 이는 프로세스 모드에서 App2Container가 발견한 모든 Java 애플리케이션에 적용할 수 있습니다. 패턴에 정의된 워크플로는 애플리케이션 서버에서 실행되도록 설계되었습니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 AWS 계정

  • Linux 서버에서 애플리케이션 서버를 실행하는 Java 애플리케이션

  • Linux 서버에 App2Container 설치 및 설정, 모든 사전 조건 충족

아키텍처

소스 기술 스택  

  • Linux 서버에서 실행되는 Java 애플리케이션

대상 기술 스택  

  • App2Container 생성 도커 이미지

대상 아키텍처 흐름 

Diagram showing AWS App2Container process for containerizing Java app on Linux system.
  1. 애플리케이션 서버에서 실행 중인 애플리케이션을 찾고 애플리케이션을 분석합니다.

  2. 애플리케이션을 컨테이너화합니다.

  3. 도커 이미지의 크기를 평가합니다. 이미지가 너무 크면 4단계를 진행합니다.

  4. 쉘 스크립트(첨부됨)를 사용하여 대용량 파일을 식별하십시오.

  5. analysis.json 파일의 appExcludedFilesappSpecificFiles 목록을 업데이트하십시오.

도구

도구

  • AWS App2Container - AWS App2Container(A2C)는 온프레미스 데이터 센터 또는 가상 머신에서 실행되는 애플리케이션을 들어 올리고 전환하여 Amazon Elastic Container Service(Amazon ) 또는 Amazon Elastic Kubernetes Service(Amazon ECS)에서 관리하는 컨테이너에서 실행되도록 지원하는 명령줄 도구입니다EKS.

code

optimizeImage.sh 쉘 스크립트와 예제 analysis.json 파일이 첨부되어 있습니다.

optimizeImage.sh 파일은 App2Container 생성 파일 ContainerFiles.tar의 내용을 검토하기 위한 유틸리티 스크립트입니다. 검토에서는 크기가 커서 제외할 수 있는 파일 또는 하위 디렉터리를 식별합니다. 이 스크립트는 다음 tar 명령의 래퍼입니다.

tar -Ptvf <path>|tr -s ' '|cut -d ' ' -f3,6| awk '$2 ~/<filetype>$/'| awk '$2 ~/^<toplevel>/'| cut -f1-<depth> -d'/'|awk '{ if ($1>= <size>) arr[$2]+=$1 } END { for (key in arr) { if(<verbose>) printf("%-50s\t%-50s\n", key, arr[key]) else printf("%s,\n", key) } } '|sort -k2 -nr

tar 명령에서 스크립트는 다음 값을 사용합니다.

path

ContainerFiles.tar의 경로

filetype

일치시킬 파일 유형

toplevel

일치시킬 최상위 디렉터리

depth

절대 경로의 깊이

size

각 파일의 크기

스크립트는 다음 작업을 수행합니다.

  1. 파일을 추출하지 않고 나열하는 데 tar -Ptvf를 사용합니다.

  2. 최상위 디렉터리부터 시작하여 파일 유형별로 파일을 필터링합니다.

  3. 깊이에 따라 절대 경로를 색인으로 생성합니다.

  4. 색인 및 저장소를 기준으로 하위 디렉터리의 전체 크기를 제공합니다.

  5. 하위 디렉터리의 크기를 인쇄합니다.

tar 명령에서 값을 수동으로 바꿀 수도 있습니다.

에픽

작업설명필요한 기술
온프레미스 Java 애플리케이션을 찾아봅니다.

애플리케이션 서버에서 실행 중인 모든 애플리케이션을 검색하려면 다음 명령을 실행합니다.

sudo app2container inventory 
AWS DevOps
검색된 애플리케이션을 분석합니다.

인벤토리 단계에서 얻은 application-id를 사용하여 각 애플리케이션을 원격으로 분석하려면, 다음 명령을 실행합니다.

sudo app2container analyze --application-id <java-app-id>
AWS DevOps
분석된 애플리케이션을 컨테이너화합니다.

애플리케이션을 컨테이너화하려면 다음 명령을 실행합니다.

sudo app2container containerize --application-id <application-id>

이 명령은 작업 공간 위치에 tar 번들과 함께 도커 이미지를 생성합니다.

도커 이미지가 너무 크면 다음 단계로 진행합니다.

AWS DevOps
작업설명필요한 기술
아티팩트 tar 파일 크기를 식별하십시오.

{workspace}/{java-app-id}/Artifacts에서 ContainerFiles.tar 파일을 식별하며, 여기서 workspace는 App2Container 작업 영역이고 java-app-id는 애플리케이션 ID입니다. 

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 0 -t / -v

이것은 최적화 후 tar 파일의 총 크기입니다.

AWS DevOps
/ 디렉터리 아래의 하위 디렉터리와 해당 크기를 나열합니다.

/ 최상위 디렉터리에 있는 주요 하위 디렉터리의 크기를 확인하려면 다음 명령을 실행합니다.

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 1 -t / -s 1000000 -v /var                         554144711 /usr 2097300819 /tmp 18579660 /root 43645397 /opt 222320534 /home 65212518 /etc 11357677                                    
AWS DevOps
/ 디렉터리 아래에 있는 대규모 하위 디렉터리를 식별하십시오.

이전 명령에 나열된 각 주요 하위 디렉터리에 대해 해당 하위 디렉터리의 크기를 식별하십시오. -d를 사용하여 깊이를 높이고 -t를 사용하여 최상위 디렉터리를 나타냅니다.

예를 들어, /var를 최상위 디렉터리로 사용하십시오. /var 아래에서 모든 대형 하위 디렉토리와 그 크기를 식별하십시오.

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 2 -t /var -s 1000000 -v

이전 단계에 나열된 각 하위 디렉터리(예를 들어 /usr, /tmp, /opt/home)에 대해 이 프로세스를 반복합니다.

AWS DevOps
/ 디렉터리 아래의 각 하위 디렉터리에 있는 대형 폴더를 분석합니다.

이전 단계에 나열된 각 하위 디렉터리에 대해 애플리케이션을 실행하는 데 필요한 폴더를 식별하십시오.

예를 들어, 이전 단계의 하위 디렉터리를 사용하여 /var 디렉터리의 모든 하위 디렉터리와 해당 크기를 나열합니다. 애플리케이션에 필요한 모든 하위 디렉터리를 식별하십시오.

/var/tmp                        237285851 /var/lib 24489984 /var/cache                      237285851

애플리케이션에 필요하지 않은 하위 디렉터리를 제외하려면 analysis.json 파일에서 해당 하위 디렉터리를 containerParameters 아래 appExcludedFiles 섹션에 추가합니다.

예제 analysis.json 파일이 첨부되어 있습니다.

AWS DevOps
appExcludes 목록에서 필요한 파일을 식별합니다.

appExcludes 목록에 추가되는 각 하위 디렉터리에 대해 애플리케이션에 필요한 해당 하위 디렉터리의 파일을 식별합니다. analysis.json 파일에서, containerParameters 아래 appSpecificFiles 섹션의 특정 파일 또는 하위 디렉터리를 추가합니다. 

예를 들어 /usr/lib 디렉터리가 제외 목록에 추가되었지만 /usr/lib/jvm이 애플리케이션에 필요한 경우 /usr/lib/jvmappSpecificFiles섹션에 추가하십시오.

AWS DevOps
작업설명필요한 기술
분석된 애플리케이션을 컨테이너화합니다.

애플리케이션을 컨테이너화하려면 다음 명령을 실행합니다.

sudo app2container containerize --application-id <application-id>

이 명령은 작업 공간 위치에 tar 번들과 함께 도커 이미지를 생성합니다.

AWS DevOps
아티팩트 tar 파일 크기를 식별하십시오.

{workspace}/{java-app-id}/Artifacts에서 ContainerFiles.tar 파일을 식별하며, 여기서  workspace는 App2Container 작업 영역이고  java-app-id는 애플리케이션 ID입니다. 

./optimizeImage.sh -p /{workspace}/{java-app-id}/Artifacts/ContainerFiles.tar -d 0 -t / -v

이것은 최적화 후 tar 파일의 총 크기입니다. 

AWS DevOps
도커 이미지를 실행합니다.

이미지가 오류 없이 시작되는지 확인하려면 다음 명령을 사용하여 로컬에서도커 이미지를 실행합니다.

컨테이너의  imageId를 식별하려면 docker images |grep java-app-id를 사용하십시오.

컨테이너를 실행하려면 docker run -d <image id>를 사용하십시오.

AWS DevOps

관련 리소스

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.