본문 바로가기
Coding

여러 Docker 컨테이너를 대규모로 관리하는 방법

by Emily Blunt 2022. 5. 8.
반응형

여러 Docker 컨테이너를 대규모로 관리하는 방법

 

개발, 지속적 통합, 환경 프로모션, DevSecOps를 포함한 대규모 Docker 컨테이너 관리 가이드

크레딧: docker.com

컨테이너 및 컨테이너 오케스트레이터의 등장으로 Docker는 모든 현대 프로그래머에게 필수 기술이 되었습니다. 이 기사는 Kubernetes를 컨테이너 오케스트레이터로 사용하든 베어메탈 서버로 사용하든 애플리케이션 코드에서 사용자 정의 컨테이너 이미지를 빌드하는 모든 사람을 위한 것입니다.

여기에서는 전체 개발 및 릴리스 주기에서 얼마나 많은 다양한 컨테이너 이미지를 관리할 수 있는지에 중점을 둘 것입니다. 우리는 다음을 다룰 것입니다:

  • 한 번에 여러 이미지 만들기
  • 테스트 목적으로 이미지 세트 실행
  • 여러 이미지에서 명령을 실행합니다. 이미지 스캐닝과 같은 DevSecOps 프로세스에 이것이 어떻게 사용될 수 있는지 보여드리겠습니다.
  • 릴리스 프로세스 동안 한 레지스트리에서 다른 레지스트리로 이미지 승격

Docker 및 Docker Compose에 대한 지식이 있다고 가정합니다.

좋은 내용으로 바로 이동하려는 경우 이 기사에서 설명하는 기술에 대한 참조 GitHub 리포지토리가 있습니다.

시작하기 전에 이 기사에서 달성하고자 하는 몇 가지 목표와 원칙은 다음과 같습니다.

완전 자동화

컨테이너 이미지를 관리하는 프로세스는 완전히 자동화되어야 합니다.

유연한

컨테이너의 장점은 다양한 호스팅 환경에서 실행할 수 있다는 것입니다. 이미지 관리 프로세스는 CI/CD에 어떤 기술을 사용하든 적용할 수 있어야 합니다.

이상적으로는 솔루션에 새로운 이미지/서비스를 추가할 때 스크립트와 인프라/코드로서의 파이프라인을 가능한 한 적게 변경하는 것이 좋습니다.

한 번 빌드

컨테이너의 가장 중요한 이점 중 하나는 다양한 호스팅 환경에서 일관되게 실행된다는 것입니다. 이미지를 한 번만 빌드하고 릴리스할 때 각 환경을 통해 해당 이미지를 홍보하여 ​​이점을 최대한 활용해야 합니다. 이렇게 하면 모든 하위 환경에서 이미 테스트된 동일한 이미지가 프로덕션에 배포됩니다.

컨테이너 이미지 홍보

이 문서의 일부 기술을 시연하는 데 도움이 되는 샘플 프로젝트가 제공됩니다. 프로젝트는 다음 애플리케이션으로 구성됩니다.

  • .NET Blazor 웹 어셈블리 웹 애플리케이션
  • .NET 작업자 에이전트 콘솔 애플리케이션
  • SQL 서버 데이터베이스

이 응용 프로그램은 SQL Server 데이터베이스에서 임의의 일기 예보를 검색하기 위한 간단한 웹 UI로 구성됩니다. 에이전트 서비스는 10초마다 예측을 업데이트하고 시작 시 초기 데이터베이스 스키마 마이그레이션을 수행합니다.

샘플 Azure DevOps 파이프라인이 제공됩니다. 그러나 이러한 기술은 모두 명령줄 기반이므로 모든 CI/CD 프로세스에 사용할 수 있습니다.

우리 팀은 다음을 발견했습니다. docker-compose.yml 파일은 이미지에 대한 추가 및 변경 사항을 선언하기에 완벽한 장소입니다. Docker Desktop 및 Podman, Docker Engine과 같은 많은 컨테이너 관리 도구에서 잘 이해되고 사용할 수 있습니다.

완전히 자동화된 CI/CD 프로세스가 있는 경우에도 새 서비스 및 관련 이미지 이름을 어딘가에 지정해야 하며 프로젝트의 docker-compose.yml이 이에 적합한 위치입니다.

Docker Compose 프로필은 상대적으로 새로 추가되어 개발 주기의 각 지점에서 다양한 구성으로 작업하기가 훨씬 쉽습니다. Docker Compose를 통해 docker build, run 및 pull/push 명령을 실행하는 것은 상당히 잘 알려져 있습니다. 그러나 docker-compose.yml 파일 및 관련 프로필을 사용하여 사용자 지정 bash 스크립트를 사용하여 추가 작업을 실행할 수도 있습니다.

샘플 프로젝트에는 다양한 활동을 빠르게 실행하는 데 사용할 수 있는 다음 프로필이 있습니다.

  • dev: 지역개발에 사용합니다. 데이터베이스 또는 메시지 버스와 같은 로컬 리소스는 빠르게 회전할 수 있습니다.
  • test: 프로젝트에 대한 모든 서비스를 함께 테스트합니다.
  • ci: 지속적 통합 프로세스에서 애플리케이션 코드에서 사용자 정의 이미지를 빌드하고 푸시하는 데 사용됩니다. 여러 작업에서 빌드를 병렬로 실행하려는 경우 더 세분화된 프로필로 분할할 수 있습니다.

프로필을 사용하여 프로젝트에 사용할 이미지를 선택할 수 있습니다. 다음 명령은 다음을 위한 모든 서비스를 빌드합니다. ci 프로필:

docker-compose --profile ci build

이것은 CI(지속적 통합) 프로세스에서 모든 이미지를 빌드하는 데 사용할 수 있습니다. 서비스가 추가됨에 따라 docker-compose.yml 파일에 저장하면 CI 코드를 변경할 필요 없이 CI 빌드에서 자동으로 선택됩니다.

장기 실행 이미지 빌드를 다른 서비스와 분리하는 데 유용한 Docker Compose 프로필을 찾았습니다. 일반적으로 자바스크립트 npm 라이브러리를 많이 사용하는 웹 애플리케이션 이미지 빌드는 시간이 오래 걸릴 수 있으므로 병렬로 실행하기 위해 별도의 프로필을 만드는 것이 가장 좋습니다.

지속적 통합 프로세스에서 병렬로 프로필 작성

프로필을 사용하여 프로젝트에 대한 서비스 선택을 실행할 수도 있습니다. 다음 명령은 다음을 사용하여 로컬에서 샘플 애플리케이션을 테스트하는 데 필요한 모든 서비스를 실행합니다. test 프로필:

docker-compose --profile test up

다음을 실행하여 서비스를 중지하고 컨테이너를 제거할 수 있습니다.

docker-compose --profile test down

지역개발

코드를 개발하려면 다른 서비스 세트가 필요할 수 있습니다. 나는 종종 그것이 유용하다고 생각합니다. dev 데이터베이스 또는 메시지 버스와 같은 로컬 리소스를 실행하기 위한 프로필입니다. 다음 명령은 로컬 개발용 데이터베이스만 실행합니다.

docker-compose --profile dev up

데이터 지속성

그만큼 docker-compose.yml 제공된 파일은 데이터베이스 컨테이너가 중지 및 삭제될 때 데이터베이스의 데이터가 유지되도록 볼륨을 생성합니다. 데이터베이스를 중지하고 데이터 볼륨을 삭제하려면 다음을 사용할 수 있습니다.

docker-compose --profile test down -v

이제 우리의 서비스가 이미 우리의 docker-compose.yml 파일에서 관련 이미지에 대해 사용자 지정 작업을 실행하여 더 나아갈 수 있습니다.

그만큼 docker-compose-extract.sh 스크립트를 사용하여 프로필 또는 이미지 필터를 기반으로 Docker Compose 파일에서 이미지 이름을 추출할 수 있습니다. 다음 명령은 다음에서 이미지 이름을 인쇄합니다. ci 프로필:

./pipelines/scripts/docker-compose-extract.sh -p ci

참고: docker-compose 파일에는 제공된 bash 스크립트와 함께 작동하도록 Unix 줄 끝이 있어야 합니다. 필요한 경우 VS Code 또는 dos2unix를 사용하여 Windows에서 Unix 줄 끝으로 변환합니다. 스크립트는 Windows를 사용하는 경우 bash 터미널에서 실행해야 합니다. GitBash를 사용해 보세요.

위 명령의 출력과 추출되는 이미지를 필터링하기 위한 추가 옵션은 다음과 같습니다.

docker-compose-extract.sh의 주요 로직은 아래와 같습니다. 이미지 및 관련 프로필에 대해 두 개의 어레이가 생성됩니다. 제공된 매개변수를 기반으로 이미지 이름과 프로필에 대해 몇 가지 다른 필터가 실행됩니다.

docker-compose-extract.sh의 메인 로직

이제 특정 프로필로 이미지를 검색하는 좋은 방법이 있으므로 이를 추가 스크립트에 연결할 수 있습니다.

이전 스크립트는 처음 두 가지 목표를 달성하는 데 도움이 됩니다. 이 다음 스크립트를 사용하면 이미지를 한 번 빌드하고 릴리스할 때 다른 환경을 통해 해당 이미지를 홍보할 수 있습니다.

각 환경에 코드를 배포하기 전에 다음 프로세스를 수행합니다.

  • 이전 환경에서 홍보할 이미지 가져오기
  • Docker 태그를 사용하여 이미지의 레지스트리 이름을 프로모션 레지스트리로 변경하십시오.
  • 승격된 이미지를 현재 환경 레지스트리로 푸시

그만큼 docker-compose-promote.sh 스크립트는 docker-compose-extract.sh 스크립트를 사용하여 승격에 필요한 이미지를 추출한 다음 Docker 태그를 사용하여 이미지의 레지스트리 이름을 로컬로 변경합니다. 다음 명령은 다음에서 이미지를 승격합니다. ci 프로필 1.0.0 이미지 태그 및 레지스트리 이름 변경 devregistry.io 에게 qaregistry.io:

./pipelines/scripts/docker-compose-promote.sh -p ci -t 1.0.0 -r devregistry.io -u qaregistry.io

이 스크립트는 아래와 같이 CD(지속적 배포) 프로세스에서 사용할 수 있습니다.

연속 배포 프로세스에서 배포할 때 이미지 승격

docker-compose-promote.sh의 주요 로직은 아래와 같습니다. 에서 추출한 이미지 docker-compose.yml 파일이 반복되고 레지스트리 이름과 태그가 필요한 값으로 바뀝니다.

docker-compose-promote.sh의 메인 로직

이제 프로젝트의 이미지 그룹을 추출하는 좋은 방법이 있으므로 DevSecOps와 같은 프로세스에 대해 이미지 그룹에 대해 사용자 지정 명령을 실행할 수 있습니다. 일반적으로 대부분의 보안 및 자동화 도구는 CLI 기반이므로 쉽게 연결할 수 있습니다. docker-compose-extract.sh 스크립트.

그만큼 docker-compose-command.sh 스크립트를 사용하여 추출된 이미지에 대해 사용자 지정 명령을 실행할 수 있습니다. docker-compose.yml 파일. 제공된 명령에는 다음이 포함되어야 합니다. (AT)image이것은 추출된 이미지의 이름으로 대체됩니다.

다음 명령은 Dive를 사용하여 컨테이너 스캔을 실행하는 예를 보여줍니다. ci 프로필 devregistry.io 레지스트리 1.0.0 꼬리표. Dive는 이미지에서 낭비되는 공간을 스캔하는 데 사용됩니다. 그러나 이것은 다른 컨테이너 스캔 또는 자동화 도구로 교체될 수 있습니다.

./pipelines/scripts/docker-compose-command.sh -r devregistry.io -p ci -t 1.0.0 -c "dive (AT)image"

연속 통합 프로세스에서 다이브 스캔의 출력은 다음과 같습니다.

지속적 통합 프로세스에서 이미지 스캔 실행

docker-compose-command.sh의 주요 로직은 아래와 같습니다. docker-compose.yml 파일에서 추출된 이미지가 반복되고 제공된 명령이 각각에 대해 실행됩니다.

docker-compose-command.sh의 메인 로직

제공된 스크립트는 명령줄 기반이므로 모든 CI/CD 프로세스에서 사용할 수 있습니다. Azure DevOps CI/CD 파이프라인의 예는 다음에서 찾을 수 있습니다. azure-pipelines.yml.

샘플 Azure DevOps CI/CD 파이프라인

빌드 단계는 이미지 빌드, 스캔 및 푸시를 담당합니다. 이미지는 원래 개발 레지스트리에 푸시되고 다음 배포 아티팩트가 생성됩니다.

배포 아티팩트

제공된 스크립트 및 docker-compose.yml 파일은 배포 단계에서 이미지를 승격 및 릴리스하는 데 사용됩니다. Kubernetes와 같은 컨테이너 오케스트레이터를 사용하는 경우 배포 매니페스트 파일 또는 Helm 차트도 배포 아티팩트에 추가해야 합니다.

반응형

댓글