로컬 Docker 레지스트리를 활용하는 것은 여러 가지 중요한 이점을 제공합니다. 첫째, 비용 절감입니다. 컨테이너 이미지 호스팅 비용을 절약하고 DockerHub와 같은 서비스에 대한 요금을 피할 수 있습니다. 둘째, 속도 향상입니다. 이미지를 로컬 레지스트리로 푸시하거나 풀하는 작업은 원격 제공자 레지스트리에 접근하는 것보다 훨씬 빠릅니다. 셋째, 보안 강화입니다. 이미지가 공용 인터넷에 노출될 위험을 최소화하여 환경 변수 및 소스 코드 유출 위험을 줄일 수 있습니다. 넷째, 단순성입니다. Kamal을 통한 자체 호스팅 초기 설정 단계를 줄여 하나의 비밀(secret)을 절약할 수 있습니다.
하지만 로컬 레지스트리는 Kamal 설치 환경에 로컬로 국한된다는 명확한 단점이 있습니다. 이는 노트북에서 로컬 레지스트리를 사용하는 경우 동료들과 쉽게 공유할 수 없음을 의미합니다.
Kamal에서 로컬 레지스트리 사용 방법
Kamal에서 로컬 Docker 레지스트리를 사용하려면 config/deploy.yml 파일에서 다음과 같이 localhost를 가리키도록 설정합니다:
yaml
# config/deploy.yml
registry:
server: "localhost:5555"
포트는 자유롭게 선택할 수 있으며, 지정하지 않으면 포트 80이 기본값으로 사용됩니다. KAMAL_REGISTRY_PASSWORD를 더 이상 제공할 필요가 없습니다. 이 기능은 로컬에서 발행된 포트가 루프백(loopback)뿐만 아니라 로컬 네트워크에서도 접근 가능하도록 하는 Docker 28.3.3 이상 버전과 함께 사용하는 것이 좋습니다.
작동 방식
Kamal은 외부 레지스트리에 로그인하는 대신, 지정된 포트에서 단순히 registry 이미지를 실행합니다. registry는 레지스트리를 실행하기 위한 공식 Docker 이미지입니다.
CLI의 로그인 액션은 이를 반영하여 변경되었습니다. 새로운 setup 액션은 로컬 레지스트리 설정 또는 외부 레지스트리 로그인 모두를 위한 것이며, logout 액션은 이제 remove 액션으로 통합되었습니다:
-
kamal registry login->kamal registry setup -
kamal registry logout->kamal registry remove
대안
로컬 레지스트리의 대안으로는 Kamal을 개발한 37signals처럼 완전한 Docker 레지스트리를 자체 호스팅하는 방법이 있습니다. 그들은 계약된 대역폭을 피하고, 비용을 절감하며, 자체 하드웨어에서 나머지 서비스를 자체 호스팅하면서 제어권을 확보하기 위해 이 방식을 선택했습니다. 결국 DockerHub를 사용한 후 Harbor를 선택하여 Docker 레지스트리를 배포했습니다.