Post

도커 레지스트리와 이미지 관리

도커 이미지 참조 체계, 레지스트리 운영, 이미지 태깅과 배포 전략

도커 레지스트리와 이미지 관리

1. 레지스트리, 리포지터리, 이미지 태그

  • 로컬 컴퓨터에 없는 이미지를 내려받으려 할 때 가장 먼저 찾아보는 곳이 도커 허브
  • 도커 이미지 참조
    1
    
    docker.io/diamol/golang:latest
    
    • docker.io: 이미지가 저장된 레지스트리의 도메인. 기본값은 도커 허브
    • diamol: 이미지 작성자의 계정 이름. 개인 혹은 단체의 이름에 해당
    • golang: 이미지 레포지토리 이름. 일반적으로 애플리케이션의 이름에 해당한다. 하나의 레포지토리는 여러 버전의 이미지를 담을 수 있다
    • latest: 이미지 태그. 애플리케이션의 버전 혹은 변종을 나타낸다. 기본값은 latest
  • 이미지 참조는 레지스트리에서 특정한 이미지를 식별하는 식별자 역할을 한다.
  • 이미지는 여러 개의 참조를 가질 수 있다.
  • 이미지 참조 목록 확인
    1
    
    docker image ls --filter reference=image-gallery --filter reference='*/image-gallery'
    
    • 출력 결과 리스트에서 이미지 ID가 같다면 두 이미지 참조가 같은 이미지를 가리키는 것이다.
  • 레지스트리의 기본값은 도커 허브
    • 자사 도커 레지스트리를 꾸리는 경우 이미지 참조의 첫 부분에 인하우스 레지스트리의 도메인을 기재하면 도커는 도커 허브 대신 해당 레지스트리를 찾아간다.
  • diamol는 공개 레퍼지토리이므로 누구든지 이미지를 내려받을 수 있지만 diamol 단체의 소속원만이 레퍼지토리에 이미지를 푸시할 수 있다.
  • 태그의 기본값은 latest
    • 레지스트리에 이미지를 푸시할 때는 항상 명시적으로 태그를 부여해야 한다.



2. 도커 허브에 직접 빌드한 이미지 푸시

  • 레지스트리에 이미지 푸시 (1) 도커 CLI를 통해 레지스트리에 로그인. 이 로그인을 통해 레지스트리에 이미지를 푸시할 권한이 부여 (2) 이미지에 푸시 권한을 가진 계정명을 포함하는 이미지 참조 붙이기 (3) 로컬 이미지 레이어를 레지스트리로 푸시
  • 도커 허브 로그인
    1
    
    docker login --username $dockerId
    
    • 도커 허브는 기본 레지스트리이므로 도메인 이름을 지정할 필요가 없다.
  • 이미지 참조 부여
    1
    
    docker image tag image-gallery $dockerId/image-gallery:v1
    
  • 로컬 컴퓨터에 저장된 이미지 레이어를 원격 레지스트리에 푸시
    1
    
    docker image push $dockerId/image-gallery:v1
    
  • 레지스트리에서도 캐시상에 레이어 해시와 일치하는 레이어가 없을 경우에만 실제로 업로드가 이뤄진다. 도커 엔진의 레이어 캐시와 완전히 같은 방식이지만, 레지스트리상의 전체 이미지를 대상으로 한다는 점이 다르다.



3. 나만의 도커 레지스트리 운영

  • 도커 코어 레지스트리 서버
    • 깃허브 저장소 docker/distribution에서 개발이 진행된다.
    • 코어 레지스트리 서버는 도커 허브와 동일한 레이어 캐시 시스템을 통해 이미지를 내려받고 푸시하는 기본적인 기능을 제공한다. 도커 허브에서 볼 수 있는 웹 기반 UI 등의 기능은 빠져 있다.
  • diamol 계정에 패키징한 이미지를 사용해 컨테이너 형태로 도커 레지스트리 실행
    1
    
    docker container run -d -p 5000:5000 --restart always diamol/registry
    
    • –restart 플래그를 부여하면 도커를 재시작했을 때 해당 컨테이너도 자동으로 재시작된다.
    • 레지스트리의 도메인 주소를 사용해 이미지에 태그를 부여하면 새로운 레지스트리에 이미지를 푸시할 수 있다.
  • 도커의 기본 설정에서는 HTTP 프로토콜이 적용된 레지스트리를 사용할 수 없게 돼 있다. 비보안 레지스트리를 사용하려면 로컬 컴퓨터의 레지스트리를 비보안 레지스트리 허용 목록에 추가해야 한다.
    • 이미지 레이어의 저장 경로, 도커 API가 주시하는 포트 번호, 허용된 비보안 레지스트리 목록 등 도커 엔진의 모든 설정은 daemon.json이라는 이름의 JSON 포맷으로 된 설정 파일에 들어 있다.
    • daemon.json 설정 파일의 경우 윈도우에서는 C:\Program Data\docker\config, 리눅스에서는 /etc/docker에 위치한다.
    • daemon.json 파일에 아래 설정을 추가한다.
      1
      2
      3
      
      {
        "insecure-registries" : ["registry.local:5000"]
      }
      
    • 그 다음 도커 엔진을 재시작한다. 윈도우의 경우 Restart-Service docker, 리눅스의 경우 service docker restart 명령을 사용한다.



4. 이미지 태그의 효율적 사용

  • pull 명령이나 FROM 인스트럭션에서 특정한 패치 버전을 콕 집어 사용하면서 항상 같은 버전을 보장받을 수 있다.
  • 패치 업데이트를 자동으로 전달받고 싶다면 [major].[minor] 태그를 사용하고, 마이너 업데이트까지 전달받고 싶다면 [major] 태그를 사용한다.
  • 직접 작성한 Dockerfile 스크립트의 기반 이미지는 가능한 한 정확한 버전을 지정하여 개발 팀과 동일한 도구로 빌드하고 동일한 런타임을 사용해 실행하는 것이 좋다.



5. 공식 이미지에서 골든 이미지로 전환

  • verified publisher
    • 도커 허브를 통해 이미지를 배포하는 단체들 중에서도 마이크로소프트, 오라클, IBM과 같은 신뢰할 수 있는 기업을 verified publisher로 지정한다.
    • 이들이 배포하는 이미지는 취약점 탐지 등의 승인 절차를 거쳐 공개된다.
  • official image
    • official image로 배포되는 소프트웨어는 주로 오픈 소스 소프트웨어로, 해당 프로젝트 개발 팀과 도커가 함께 이미지를 관리한다.
    • official image 역시 취약점 탐색을 거치고 주기적으로 업데이트되며, 잘 최적화된 Dockerfile 스크립트로 구성된다.
  • golden image
    • golden image는 official image를 기반으로 삼아 인증서나 환경 설정값 등 자신이 필요한 설정을 추가한 것이다.
    • 골든 이미지는 도커 허브의 기업 레퍼지토리나 자체 레퍼지토리에서 관리된다.
This post is licensed under CC BY 4.0 by the author.