Docker Hub 라이브러리 미러링하기
Docker Hub 라이브러리 미러링하기
여러 Docker 데몬이 있는 환경에서 로컬 레지스트리 미러를 풀스루 캐시(pull-through cache)로 실행해 이미지 풀을 오프로드하는 방법을 알아봐요.
출처: 문서
본문
사용 사례(Use-case)
환경에 여러 Docker 인스턴스가 있는 경우(예: 모두 Docker를 실행하는 여러 물리·가상 머신), 각 데몬이 인터넷으로 나가 로컬에 없는 이미지를 Docker 저장소에서 가져와요. 로컬 레지스트리 미러를 실행하고 모든 데몬을 그곳으로 지정하면 이 추가 인터넷 트래픽을 피할 수 있어요.
[!NOTE]
Docker Official Images는 Docker의 지적 재산이에요.
대안(Alternatives)
또는 사용 중인 이미지 집합이 잘 한정되어 있다면 수동으로 풀해 간단한 로컬 프라이빗 레지스트리로 푸시할 수 있어요.
또한 모든 이미지를 사내에서 빌드한다면 Hub를 전혀 사용하지 않고 전적으로 로컬 레지스트리에 의존하는 것이 가장 단순한 시나리오예요.
함정(Gotcha)
현재 다른 프라이빗 레지스트리는 미러링할 수 없어요. 중앙 Hub만 미러링할 수 있어요.
[!NOTE]
Docker Hub의 미러는 여전히 Docker의 fair use policy 대상이에요.
해결책(Solution)
레지스트리를 풀스루 캐시로 구성할 수 있어요. 이 모드에서 레지스트리는 모든 일반 docker pull 요청에 응답하지만 모든 콘텐츠를 로컬에 저장해요.
RAM(Registry Access Management)을 레지스트리 미러와 함께 사용
Docker Hub 접근이 RAM 구성으로 제한된다면 이미지가 레지스트리 미러에 있더라도 Docker Hub에서 기원한 이미지를 풀할 수 없어요.
다음 오류를 만나게 됩니다.
Error response from daemon: Access to docker.io has been restricted by your administrators.
Docker Hub 접근을 허용할 수 없다면 레지스트리 미러에서 수동으로 풀하고 선택적으로 이미지를 재태그할 수 있어요. 예를 들면:
docker pull <your-registry-mirror>[:<port>]/library/busybox
docker tag <your-registry-mirror>[:<port>]/library/busybox:latest busybox:latest
어떻게 동작하나요?
로컬 레지스트리 미러에서 이미지를 처음 요청하면 공개 Docker 레지스트리에서 이미지를 풀해 반환하기 전에 로컬에 저장해요. 이후 요청에서는 로컬 레지스트리 미러가 자체 저장소에서 이미지를 제공할 수 있어요.
Hub의 콘텐츠가 변경되면 어떻게 되나요?
태그로 풀을 시도하면 레지스트리가 원격을 확인해 요청된 콘텐츠의 최신 버전이 있는지 확인해요. 그렇지 않으면 최신 콘텐츠를 가져와 캐시해요.
디스크는 어떻게 되나요?
교체율(churn rate)이 높은 환경에서는 캐시에 오래된 데이터가 쌓일 수 있어요. 풀스루 캐시로 실행할 때 레지스트리는 디스크 공간을 절약하기 위해 주기적으로 오래된 콘텐츠를 제거해요. 제거된 콘텐츠에 대한 이후 요청은 원격 가져오기와 로컬 재캐싱을 유발해요.
최상의 성능을 보장하고 정확성을 보장하려면 레지스트리 캐시를 스토리지에 filesystem 드라이버로 구성해야 해요.
레지스트리를 풀스루 캐시로 실행
Docker 데몬 구성
dockerd를 수동으로 시작할 때 --registry-mirror 옵션을 전달하거나, /etc/docker/daemon.json을 편집하고 registry-mirrors 키와 값을 추가해 변경 사항을 영구화할 수 있어요.
{
"registry-mirrors": ["https://<my-docker-mirror-host>"]
}
파일을 저장하고 Docker를 다시 로드해 변경 사항을 적용해요.
[!NOTE]
오류처럼 보이는 일부 로그 메시지는 실제로는 정보 메시지예요.
메시지가 오류에 대해 경고하는 것인지 정보를 제공하는 것인지 판단하려면
level필드를 확인하세요. 예를 들어 이 로그 메시지는 정보성 메시지예요.time="2017-06-02T15:47:37Z" level=info msg="error statting local store, serving from upstream: unknown blob" go.version=go1.7.4파일이 아직 로컬 캐시에 없어 업스트림에서 가져오고 있다는 뜻이에요.