다양한 레지스트리와 함께 Docker 를 구성하는 방법

DockerBeginner
지금 연습하기

소개

Docker 는 애플리케이션의 구축, 배포 및 관리 방식을 혁신한 강력한 컨테이너화 플랫폼입니다. Docker 생태계의 핵심 구성 요소 중 하나는 Docker 레지스트리로, Docker 이미지를 저장하고 배포하는 저장소 역할을 합니다. 이 튜토리얼에서는 개인 레지스트리와 공개 레지스트리를 포함한 다양한 레지스트리와 함께 Docker 를 구성하여 Docker 기반 애플리케이션을 효과적으로 관리하는 방법을 살펴볼 것입니다.

Docker 레지스트리 소개

Docker 레지스트리는 Docker 이미지를 저장하고 풀 (pull) 할 수 있는 중앙 저장소입니다. 개발자 및 조직이 Docker 이미지를 공유, 배포 및 관리할 수 있도록 Docker 생태계의 기반 역할을 합니다. 이 섹션에서는 Docker 레지스트리의 기본 개념, 목적 및 사용 가능한 레지스트리 유형을 살펴볼 것입니다.

Docker 레지스트리란 무엇인가요?

Docker 레지스트리는 Docker 이미지를 저장하고 배포하는 서비스입니다. Docker 이미지가 호스팅되고 다운로드할 수 있도록 중앙 위치 역할을 합니다. Docker 이미지를 빌드하면 레지스트리에 푸시 (push) 할 수 있으며, 다른 사용자 또는 시스템은 레지스트리에서 해당 이미지를 풀 (pull) 하여 사용할 수 있습니다.

Docker 레지스트리 유형

Docker 레지스트리에는 크게 두 가지 유형이 있습니다.

  1. 공개 레지스트리: 공개 레지스트리는 인터넷상의 누구나 접근할 수 있으며, 일반적으로 공개적으로 유지 관리되는 인기 Docker 이미지를 공유 및 배포하는 데 사용됩니다. 가장 잘 알려진 공개 레지스트리는 Docker 엔진에서 기본적으로 사용되는 Docker Hub 입니다.

  2. 개인 레지스트리: 개인 레지스트리는 조직 또는 개인이 소유 및 관리하며, 일반적으로 접근이 제한됩니다. 조직 내부 또는 폐쇄된 사용자 그룹에서 사용자 정의 및 독점적인 Docker 이미지를 저장하고 배포하는 데 사용됩니다.

Docker 레지스트리 접근

Docker 레지스트리와 상호 작용하려면 docker 명령줄 도구를 사용할 수 있습니다. 레지스트리 작업을 위한 기본 명령은 다음과 같습니다.

  • docker pull <이미지>: 레지스트리에서 Docker 이미지를 풀 (pull) 합니다.
  • docker push <이미지>: 레지스트리에 Docker 이미지를 푸시 (push) 합니다.
  • docker login <레지스트리>: Docker 레지스트리에 인증합니다.
sequenceDiagram participant 개발자 participant Docker 엔진 participant Docker 레지스트리 개발자->>Docker 엔진: docker build -t my-app . Docker 엔진->>Docker 레지스트리: docker push my-app:latest Docker 엔진->>Docker 레지스트리: docker pull my-app:latest

Docker 레지스트리의 기본 사항을 이해하면 Docker 이미지를 효과적으로 관리하고 배포하여 다양한 환경에서 일관되고 안정적인 배포를 보장할 수 있습니다.

여러 레지스트리에 대한 Docker 구성

Docker 기반 애플리케이션이 성장함에 따라 공개 및 개인 레지스트리를 포함한 여러 Docker 레지스트리와 작업해야 할 수 있습니다. 이 섹션에서는 Docker 를 다양한 레지스트리와 상호 작용하도록 구성하고 이러한 레지스트리에서 Docker 이미지를 관리하는 방법을 살펴봅니다.

Docker 데몬 구성

Docker 데몬은 여러 레지스트리와 함께 작동하도록 구성할 수 있습니다. 기본적으로 Docker 는 Docker Hub 레지스트리를 사용하지만 Docker 데몬 구성 파일을 수정하여 추가 레지스트리를 구성할 수 있습니다.

Ubuntu 22.04 에서 Docker 데몬 구성 파일은 /etc/docker/daemon.json에 있습니다. 이 파일을 편집하여 추가 레지스트리에 대한 필요한 구성을 추가할 수 있습니다.

예시 daemon.json 구성:

{
  "registry-mirrors": ["https://mirror.gcr.io", "https://registry.example.com"],
  "insecure-registries": ["registry.example.com"]
}

이 예제에서는 두 개의 레지스트리 미러 (registry-mirrors) 와 하나의 보안되지 않은 레지스트리 (insecure-registries) 를 추가했습니다. 구성 파일을 변경한 후 Docker 데몬을 다시 시작해야 변경 사항이 적용됩니다.

sudo systemctl restart docker

여러 레지스트리에 대한 인증

개인 레지스트리에 액세스하려면 해당 레지스트리에 인증해야 합니다. docker login 명령을 사용하여 레지스트리 URL 을 지정하여 수행할 수 있습니다.

docker login registry.example.com

이렇게 하면 지정된 레지스트리의 사용자 이름과 비밀번호를 입력하라는 메시지가 표시됩니다.

또는 Docker 인증 저장소에 레지스트리 자격 증명을 저장할 수 있습니다. 이렇게 하면 매번 자격 증명을 입력하지 않고 여러 레지스트리에 인증할 수 있습니다.

docker login -u myusername -p mypassword registry.example.com

여러 레지스트리에서 이미지 관리

Docker 를 여러 레지스트리와 함께 작동하도록 구성한 후에는 이러한 레지스트리에서 Docker 이미지를 관리할 수 있습니다. 서로 다른 레지스트리의 이미지를 다루는 기본 명령은 다음과 같습니다.

  • docker pull <레지스트리>/<이미지>:<태그>: 특정 레지스트리에서 이미지를 풀 (pull) 합니다.
  • docker push <레지스트리>/<이미지>:<태그>: 특정 레지스트리에 이미지를 푸시 (push) 합니다.

여러 레지스트리에 대한 Docker 구성 및 이러한 레지스트리에서 Docker 이미지를 관리하는 방법을 이해하면 복잡한 환경에서 Docker 기반 애플리케이션을 효과적으로 구성하고 배포할 수 있습니다.

실제 레지스트리 관리 시나리오

이 섹션에서는 조직 내 Docker 레지스트리를 관리하는 실제 시나리오와 최선의 방법을 살펴봅니다.

시나리오 1: 공개 레지스트리 미러링

많은 조직은 Docker Hub 와 같은 공개 레지스트리를 미러링하여 다운로드 속도를 높이고 인터넷 대역폭 사용량을 줄이는 것을 선호합니다. 이는 로컬 레지스트리를 설정하고 미러로 구성하여 달성할 수 있습니다.

## 로컬 레지스트리 실행
docker run -d -p 5000:5000 --restart=always --name registry registry:2

## Docker 데몬을 구성하여 로컬 레지스트리를 미러로 사용
echo '{"registry-mirrors": ["http://localhost:5000"]}' | sudo tee /etc/docker/daemon.json
sudo systemctl restart docker

이제 이미지를 풀 (pull) 할 때 Docker 는 공개 레지스트리에서 가져오기 전에 먼저 로컬 레지스트리 미러를 확인합니다.

시나리오 2: 레지스트리 간 이미지 프로모션

애플리케이션이 진화함에 따라 개발 레지스트리에서 프로덕션 레지스트리와 같은 다른 레지스트리 간에 Docker 이미지를 프로모션해야 할 수 있습니다. docker pulldocker push 명령을 사용하여 이를 달성할 수 있습니다.

## 개발 레지스트리에서 이미지 풀(pull)
docker pull dev-registry.example.com/my-app:v1

## 프로덕션 레지스트리용 이미지 태그 지정
docker tag dev-registry.example.com/my-app:v1 prod-registry.example.com/my-app:v1

## 프로덕션 레지스트리에 이미지 푸시(push)
docker push prod-registry.example.com/my-app:v1

이 워크플로는 서로 다른 환경 및 레지스트리에서 Docker 이미지의 수명주기를 관리할 수 있도록 합니다.

시나리오 3: 개인 레지스트리 보안

개인 레지스트리와 작업할 때는 액세스가 적절히 보안되어 있는지 확인하는 것이 중요합니다. 역할 기반 액세스 제어 (RBAC) 및 이미지 취약점 스캐닝과 같은 기능을 사용하여 개인 레지스트리의 보안을 강화할 수 있습니다.

graph LR 개발자 -- docker login --> 개인 레지스트리 개인 레지스트리 -- RBAC --> 개발자 개인 레지스트리 -- 취약점 스캐닝 --> 개발자

이러한 실제 레지스트리 관리 시나리오를 이해하고 구현함으로써 조직 내 Docker 이미지를 효과적으로 구성, 배포 및 보호할 수 있습니다.

요약

이 튜토리얼을 마치면 Docker 를 여러 레지스트리와 함께 작동하도록 구성하는 방법에 대한 확실한 이해를 얻게 되어, 서로 다른 환경에서 Docker 기반 애플리케이션을 효과적으로 관리하고 배포할 수 있게 됩니다. 실제 레지스트리 관리 시나리오와 강력하고 안전한 Docker 인프라를 유지 관리하기 위한 최선의 방법을 배울 것입니다.