Docker 이미지 배포 방식

QEMU, Docker, GHCR, OCIR, Nexus3

Docker 이미지, 레지스트리

  • Docker 이미지란, 애플리케이션을 실행하는 데 필요한 파일을 묶은 결과물
  • 이 ‘이미지’로 실행한 프로세스가 ‘컨테이너’
    • 이미지는 실행에 사용할 파일 묶음
    • 컨테이너는 그것을 실제로 실행한 상태
  • 빌드한 이미지를 실행할 서버로 전달하려면 저장할 장소 필요 — 컨테이너 레지스트리

QEMU

  • 다른 CPU 아키텍처용 프로그램을 실행할 수 있도록 해주는 에뮬레이터 — 다른 하드웨어의 동작을 소프트웨어로 재현하는 도구
    • 가령 GitHub Actions의 빌드 서버, 클라우드 인스턴스 서버의 CPU가 아래처럼 다를 수 있음
      구분CPU 아키텍처
      GitHub Actions Ubuntu 러너AMD64 (x86-64)
      클라우드 서버 인스턴스ARM64
      배포할 Docker 이미지ARM64
      • Docker 빌드는 파일을 묶는 과정만 있는 게 아니라, Dockerfile의 다음 명령처럼 이미지 안에서 프로그램을 실행하는 과정도 포함되어 있음
        RUN pnpm install --frozen-lockfile
        RUN pnpm --filter @foo/bar build
        • ARM64 이미지를 만들면, 그 안의 Node.js도 ARM64 전용
          • 그런데 빌드를 수행하는 GitHub Actions 러너는 AMD64용이므로 ARM64용 Node.js 실행 불가 — 이미지 빌드 중에도 프로그램을 실제로 실행해야 함
        • QEMU가 ARM64 프로그램의 명령을 AMD64 환경에서 실행할 수 있도록 처리해줌
  • 다만 실제 ARM64 CPU에서 실행하는 것보다 빌드가 느려질 수 있음
    • 다른 CPU의 동작을 재현하는 작업이 추가되기 때문
  • 사용 가능한 러너의 아키텍처와 빌드 타겟이 다르거나, 한 환경에서 여러 아키텍처의 이미지를 만들어야 할 때 유용
아키텍처대표적인 사용 환경
AMD64, 또는 x86-64Intel·AMD 기반 PC와 서버
ARM64Apple Silicon Mac, Oracle Ampere 인스턴스 등

GHCR(GitHub Container Registry)

  • GitHub에서 Docker 이미지를 저장할 수 있도록 제공하는 서비스
    • ghcr.io/사용자or조직/이미지이름:태그
  • GitHub Actions의 경우, 워크플로에서 사용하는 GITHUB_TOKEN이 있음
    • 필요한 권한을 설정하면 이 토큰으로 GHCR에 이미지 업로드 가능
  • 별도 서버에서 비공개 이미지를 다운로드할 때는 인증 필요
    • 패키지 접근 권한, read:packages 권한을 지닌 PAT classic 토큰 등
  • 현재는 컨테이너 이미지 저장 공간, 대역폭 무료
    • 오래된 이미지 버전을 얼마나 보관할 지는 별도로 규정해야 함

OCIR(Oracle Cloud Infrastructure Registry)

  • Oracle Cloud의 컨테이너 레지스트리
  • Oracle Cloud 안에서 권한, 리전, 네트워크, 이미지 관리를 함께 운영하고 싶을 때 유용
    • OCI의 IAM 정책 승계
    • 이미지 관리 정책도 서비스에서 설정 가능
  • OCI의 IAM 정책 승계
  • 이미지 관리 정책도 서비스에서 설정 가능
  • 레지스트리 서비스 자체에는 별도 요금 X
    • 이미지 저장 공간 등 사용한 자원에 과금하는 방식
    • 이미지는 기본적으로 모두 보관 — 일정 기간 사용하지 않은 이미지 등을 정리하는 정책 설정 가능
  • 이미지 저장 공간 등 사용한 자원에 과금하는 방식
  • 이미지는 기본적으로 모두 보관 — 일정 기간 사용하지 않은 이미지 등을 정리하는 정책 설정 가능

Nexus3(Sonatype Nexus Repository 3)

  • Docker 이미지뿐 아니라 npm, Maven, PyPl 등 여러 형식의 패키지를 관리할 수 있는 저장소 관리자
  • 외부 패키지 캐시도 가능 — Nexus가 패키지를 대신 받아 보관하고, 다음 요청에 재사용 → 여러 개발자나 빌드 서버가 같은 패키지를 반복해서 받을 때 유용
항목GHCROCIRDocker HubNexus Repository 3
운영 주체GitHubOracleDocker직접 설치하면 우리
주요 용도컨테이너 이미지 저장컨테이너 이미지 저장공개 이미지 유통과 자체 이미지 저장여러 종류의 패키지 저장·캐시
현재 비용 구조컨테이너 저장·대역폭 무료저장 공간 등 사용량 과금무료·유료 구독무료 CE·유료 Pro + 운영 인프라 비용
주요 제약패키지 권한과 이미지 정리 관리 OCI 권한·리전·사용량 관리무료 비공개 저장소 1개, 다운로드 제한CE 사용 한도, 서버 운영 부담
오래된 이미지 정리 별도 정리 방식 마련 서비스의 보관 정책 설정 가능UI·API 등을 통한 관리정리 정책과 서버 저장 공간 관리