ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker Registry
    Container 2016. 3. 14. 09:00
    반응형
    dockerhub를 이용해서 자신이 만든 docker 이미지를 저장하고 배포할 수 있지만, 필요에 따라 docker 이미지를 저장할 수 있는 저장소를 직접 구축해야할 수도 있다. 이런경우를 위해서 dockerdistribution이라는 사설 docker 이미지 저장소 소스를 배포하고 있다. distribution은 원래 docker registry라는 저장소 기능만을 제공하는 프로젝트에 추가로 이미지를 만들고 저장해서 배포하는 기능까지 가지게 되었다.
    distribution을 사용하려면 docker 버전이 1.6.0 이상이 되어야 한다.
     
    우선 간단하게 registry를 실행해 보자. docker registrydocker 이미지를 제공하기 때문에 쉽게 테스트 해볼 수 있다. 아래처럼 간단한 docker 명령으로 실행가능하다.
    docker run -d -p 5000:5000 --name registry registry:2
     
    이제 이 저장소에 docker 이미지를 저장해 보도록 하자. 아래 명령을 이용해서 Ubuntu 이미지를 가져와서 태그를 변경한 다음에 방금 실행한 docker registry에 저장할 수 있다.
    docker pull ubuntu
    docker tag ubuntu localhost:5000/myfirstimage
    docker push localhost:5000/myfirstimage
     
    이제 등록되있던 이미지를 지우고 docker registry에 저장되어 있던 이미지를 가져와 보자.
    docker rmi localhost:5000/myfirstimage
    docker rmi ubuntu
    docker pull localhost:5000/myfirstimage
     
    이제 registry를 멈추고 registry가 사용하던 볼륨을 삭제하자.
    docker stop registry && docker rm -v registry
     
    여기까지 간단하게 docker registry를 실행해 봤다.
    실제로 docker 이미지 저장소를 운영하려면 신경써야 할 것들이 더 있다. 이미지를 여러개 저장하려면 충분한 크기의 스토리지가 있어야 한다. 테스트용으로야 간단하게 하드디스크를 사용하면 되겠지만 실제 운영을 하기 위해서는 용량이 크고 안정적인 스토리지가 있어야 한다. registry에서는 다양한 스토리지를 선택해서 사용할 수 있게 해주고 있다. 그리고 방금 예제에서는 이미지를 등록하고 다운받는데 아무런 인증 과정이 없었다. 아무나 docker이미지를 등록, 변경, 삭제할 수 있다면 여러가지 문제가 발생할 수 있다. 이런 일을 방지하기 위해서 docker registryTLS인증과 basic authentiation을 지원한다.
     
    docker registry는 사용할 스토리지에 대한 드라이버를 변경하는 방식으로 스토리지를 변경할 수 있다. Docker registry가 제공하는 스토리지 드라이버에는 파일시스템, AWS S3, 마이크로소프트 애저, Ceph Rados, 오픈스택 스위프트, Aliyun OSS등이 있다. 각 드라이버마다 설정해줘야 하는 인자값이 다른데, https://docs.docker.com/registry/storagedrivers/에서 드라이버별 인자를 확인할 수 있다. 사용자가 원하면 직접 스토리지 API를 구현해서 사용할 수도 있다.
     
    Docker registryYAML파일을 이용해서 설정을 할 수 있다. YAML 형식으로 원하는 옵션을 설정하고 docker run 할때 -v 옵션으로 설정파일을 마운트해서 적용할 수 있다. 아래 같은 방법으로 config.yml 파일을 registry의 설정파일로 지정하면 된다.
    docker run -d -p 5000:5000 --restart=always --name registry \
      -v `pwd`/config.yml:/etc/docker/registry/config.yml \
      registry:2
     
    설정파일에 쓰이는 옵션에는 다음과 같은 것들이 있다.
    version
    version: 0.1
    version은 필수 옵션이다. 설정의 버전을 명시한다.
     
    log
    log는 하위 항목들을 이용해서 로그 시스템을 설정한다.
    log:
      level: debug
      formatter: text
      fields:
        service: registry
        environment: staging
     
    이런 형식으로 로그를 설정할 수 있고 각 세부 항목의 내용은
    level : error, warn, info, debug등을 지정할 수 있다. 기본값은 info.
    formatter : 로그 출력 형식을 지정한다. text, json, logstash등을 선택할 수 있고 text가 기본값이다.
    fields : 로그의 모든 행에 추가되는 값들이다. 다른 로그들과 함께 혼재되어 있을때 구분해서 보기 편하게 해준다.
     
    hooks
    로그 훅이 어떤 걸 할지를 지정한다. Loglevel 따라 다음처럼 지정된 메일로 메일을 보낼 수 있다.
    hooks:
      - type: mail
        levels:
          - panic
        options:
          smtp:
            addr: smtp.sendhost.com:25
            username: sendername
            password: password
            insecure: true
          from: name@sendhost.com
          to:
            - name@receivehost.com


    loglevel
    error, warn, info, debug등의 값을 지정할 수 있고, 기본값은 info이다. 더 자세한 로그 설정은 log를 이용해서 할 수 있다.
     
    storage
    이미지 저장소로 어떤 스토리지를 사용할지 지정하는 옵션이고, 필수 옵션이다. 스토리지 종류는 하나만 선택할 수 있다. 스토리지 종류별로 설정해 주어야 하는 옵션 항목들은 아래와 같다. 최근에는 s3swift API를 지원하는 스토리지나 데이터베이스가 많이 있어서 s2, swiftAPI가 호환 가능한 다양한 스토리지를 사용할 수 있다.
    storage:
      filesystem:
        rootdirectory: /var/lib/registry
      azure:
        accountname: accountname
        accountkey: base64encodedaccountkey
        container: containername
      s3:
        accesskey: awsaccesskey
        secretkey: awssecretkey
        region: us-west-1
        bucket: bucketname
        encrypt: true
        secure: true
        v4auth: true
        chunksize: 5242880
        rootdirectory: /s3/object/name/prefix
      rados:
        poolname: radospool
        username: radosuser
        chunksize: 4194304
      swift:
        username: username
        password: password
        tenant: tenantname
        tenantid: tenantid
        domain: domain name for Openstack Identity v3 API
        domainid: domain id for Openstack Identity v3 API
        insecureskipverify: true
        region: fr
        container: containername
        rootdirectory: /swift/object/name/prefix
      cache:
        blobdescriptor: inmemory
      maintenance:
        uploadpurging:
          enabled: true
          age: 168h
          interval: 24h
          dryrun: false
      redirect:
        disable: false

     
    cache
    스토리지 벡엔드에 접근하는 데이터를 캐싱할 수 있다. 주로 레이어 메타데이터를 빠르게 접근할 수 있게 한다. Blobdescriptor 필드에 redisinmemory를 지정해서 사용할수 있다.
     
    redirect
    콘텐츠 벡엔드에서 리다이렉트하는걸 관리하는 설정이다. 기본값은 redirect를 사용하는 것이다. 사용하지 않으려면 아래처럼 disabletrue로 설정하면 된다.
    redirect:
      disable: true
     
    filesystem
    filesystem은 이미지 파일을 보관하는 스토리지로 로컬 디스크를 사용한다. 개발용이나 규모가 작은 애플리케이션에 적합하다. rootdirectory 매개변수만 있으면 된다. 여기에 사용하는 경로명은 절대경로여야 한다.
     
    azure
    마이크로 소프트의 애저 Blob 스토리지를 사용한다.
    사용하는 매개변수는 아래와 같다.
    매개변수
    필수여부
    설명
    accountname
    애저 계정명
    accountkey
    에저 계정 키
    container
    데이터를 저장하는데 사용하려는 애저 컨테이너의 이름
    realm
    아니오
    스토리지 서비스 API 엔드포인트에 대한 도메인명 접미사. 기본값은 core.windows.net이다.
     
    rados
    Ceph 오브젝트스토리지를 사용한다.
    매개변수
    필수여부
    설명
    poolname
    Ceph pool 이름
    username
    아니오
    Ceph 클러스터에 접속하기 위한 사용자 이름
    chunksize
    아니오
    데이터로 씌여지는 RADOS 객체의 크기. 기본값은 4MB(419304)
     
    S3
    아마존 웹서비스의 S3(Simple Storage Service) 를 스토리지로 사용한다.
    매개변수
    필수여부
    설명
    accesskey
    AWS Access
    secretkey
    AWS Secret
    region
    사용하려는AWS 리전
    bucket
    Registry 데이터를 저장할 버킷 이름
    encrypt
    아니오
    데이터를 암호화해서 저장할 것인지 여부. 기본값은 false이다.
    secure
    아니오
    HTTP대신 HTTPS를 사용할 것인지 설정. 기본값은 false 이다.
    v4auth
    아니오
    버전 4AWS 인증을 사용할 것인지 설정. 기본값은 false이다.
    chunksize
    아니오
    S3 API에서 멀티파트 업로드를 하기위해 필요한 청크 크기. 5MB이상이어야 한다.
    rootdirectory
    아니오
    데이터 저장에 사용할 접두어.
     
    Maintenance
    운영용 함수. 지금은 Upload purging 하나만 지원한다.
     
    Upload purging
    업로드 디렉토리에서 주기적으로 고아 파일들을 제거한다. 기본적으로 enabled되어 있고, 사용할 수 있는 옵션들은 다음과 같다.
    매개변수
    필수여부
    설명
    enabled
    Upload purging을 활성화 한다. 기본값은 true이다.
    age
    업로드 디렉토리에 있는 것중 이 시간보다 왤된 파일들은 삭제한다. 기본값은 168h (1주일)이다.
    Interval
    업로드 디렉토리를 지우는 간격. 기본값은 24h이다.
    dryrun
    어떤 디렉토리들이 지워질지 테스트해본다. 기본값은 false이다.
     
    Openstack swift
    오픈스택 스위프트를 스토리지로 사용한다.
    매개변수
    필수여부
    설명
    authurl
    인증 토큰을 얻기위한 인증용 URL.
    username
    오픈스택 사용자 이름
    password
    오픈스택 비밀번호
    region
    아니오
    오픈스택 리전
    container
    Registry 데이터를 저장할 스위트프 컨테이너 이름
    tenant
    아니오
    오픈스택 테넌트 이름
    tenantid
    아니오
    오픈스택 테넌트 아이디
    domain
    아니오
    V3 API용 오픈스택 도메인 이름
    domainid
    아니오
    V3 API용 오픈스택 도메인 아이디
    insecureskipverify
    아니오
    TLS 검증을 건너뛰게한다. 기본값은 false이다.
    chunksize
    아니오
    스위프트 에서 사용하는 데이터 청크의 크기. 기본값은 5M 이다.
    rootdirectory
    아니오
    스위프트에 저장할때 사용할 접두어.
     
    auth
    인증이 필수는 아니지만 인증 방식으로 silly, token, htpasswd 등의 3가지 중 하나를 선택할 수 있다. 동시에 여러가지를 사용할 수는 없고, 1가지만 사용가능하다.
     
    silly
    개발용으로 사용하는 인증방식이다. 기존 HTTP 요청에 Authorization 헤더가 있는지만 확인한다. 헤더에 어떤 값이 있는지는 확인하지 않는다. 헤더가 없으면 realm, service 옵션에 있는 값을 이용해서 응답하고, 접근을 거부한다.
    매개변수
    필수여부
    설명
    realm
    Registry 서버가 인증하려는 범위
    service
    인증중인 서비스
     
    token
    토큰 인증을 사용하면 registry와 인증 시스템을 분리할 수 있다.
    매개변수
    필수여부
    설명
    realm
    Registry 서버가 인증하려는 범위
    service
    인증중인 서비스
    issuer
    토큰 발행자의 이름. 토큰 발행자가 이 값을 토큰에 넣어서 설정된 값과 일치하는지 확인한다.
    rootcertbundle
    루트 인증서 번들의 절대경로. 이 번들은 인증서의 공용 부분을 가지고 있어서 인증토큰에 사인하는데 사용된다.
     
    htpasswd
    아파치 HTPasswd 파일을 이용한 basic auth 방식의 설정을 할 수 있다. bcrypt 방식의 비밀번호만 지원한다. Htpasswd파일은 시작할때만 읽어온다. 파일이 유효하지 않으면 registry는 에러를 내고 시작되지 않는다.
    매개변수
    필수여부
    설명
    realm
    Registry 서버가 인증하려는 범위
    path
    시작할때 읽어오려는 htpasswd파일의 경로
     
    middleware
    지정된 훅 지점에 미들웨어를 넣는다. Registry 미들웨어는 distribution.Namespace인터페이스와 distribution.Repository 인터페이스를 구현해야 한다. 스토리지 미들웨어는 driver.StorageDriver를 구현해야 한다. 현재는 스토리지 미들웨어로 cloudfront만 있다.
     
    middleware:
      registry:
        - name: ARegistryMiddleware
          options:
            foo: bar
      repository:
        - name: ARepositoryMiddleware
          options:
            foo: bar
      storage:
        - name: cloudfront
          options:
            baseurl: https://my.cloudfronted.domain.com/
            privatekey: /path/to/pem
            keypairid: cloudfrontkeypairid
            duration: 3000


    미들웨어는 nameoptions 키워드를 가지고 있다. Name은 미들웨어의 이름을 의미하고 options은 해당 미들웨어에서 필요한 세부 옵션들을 설정하는데 사용한다.
     
    cloudfront
    매개변수
    필수여부
    설명
    baseurl
    SCHEME://HOST[/PATH] 사용할 Cloudfront 주소
    privatekey
    AWSCloudfront용 사설 키
    keypairid
    AWS의 키 쌍 ID
    duration
    아니오
    URL이 유효한 기간.
     
    reporting
    reporting:
      bugsnag:
        apikey: bugsnagapikey
        releasestage: bugsnagreleasestage
        endpoint: bugsnagendpoint
      newrelic:
        licensekey: newreliclicensekey
        name: newrelicname
        verbose: true
     
    reporting 옵션은 선택사항이다. 에러와 메트릭 리포팅 도구를 선택할 수 있다. 지원하는 서비스로는 뉴랠릭(New Relic)Bugsnag이 있다.
     
    bugsnag
    매개변수
    필수여부
    설명
    apikey
    BugsnagAPI
    releasestage
    아니오
    Registry가 배포될 트랙, production, staging, development등이 있다.
    endpoint
    아니오
    엔터프라이즈 Bugsnag 엔드포인트
     
    Newrelic
    매개변수
    필수여부
    설명
    licensekey
    New Relic용 라이센스 키
    name
    아니오
    New Relic 애플리케이션 이름
    verbose
    아니오
    표준출력에 New Relic 디버깅용 출력을 보이게 함.
     
     
    http
    http:
      addr: localhost:5000
      net: tcp
      prefix: /my/nested/registry/
      secret: asecretforlocaldevelopment
      tls:
        certificate: /path/to/x509/public
        key: /path/to/x509/private
        clientcas:
          - /path/to/ca.pem
          - /path/to/another/ca.pem
      debug:
        addr: localhost:5001


    registry를 제공하는 HTTP 서버의 세부 옵션을 지정한다.
    매개변수
    필수여부
    설명
    addr
    외부 접근이 가능한 IP 대역을 지정한다. net 옵션의 타입에 따라 바뀐다. net 옵션이 tcp이면 HOST:PORT형식을 사용하고 net 옵션이 unix이면 FLIE을 사용한다.
    net
    아니오
    리스닝 소켓을 만드는데 사용할 네트워크를 설정한다. unixtcp를 선택할수 있고, 기본값은 tcp이다.
    prefix
    아니오
    서버에서 사용할 접미사이다. 앞뒤에 슬래시를 가지고 있어야 한다.
    secret
    데이터 보안용 암호화 키. 로드밸런서를 앞에두고 registry 서버를 여러개 사용하려면 각 registry서버의 secret값이 동일해야 한다.
     
    tls
    tlshttp 하위 옵션이다. 서버에서 TLS를 사용할수 있게 설정한다. Nginx나 아파치 같은 웹서버를 이용중이라면 그쪽에 TLS를 설정한 다음 registry에 프록시로 연결해서 사용하면 된다.
    매개변수
    필수여부
    설명
    certificate
    X509 인증 파일의 절대경로
    key
    X509 사설키 파일의 절대경로
    clientcas
    아니오
    X509 CA 파일의 절대경로들에 대한 배열 값
     
    debug
    debug 옵션은 선택사항이다. 디버그 서버를 설정하는데 사용할 수 있다. 여기 설정한 디버그 엔드포인트로 registry의 메트릭과 상태를 모니터링할 수 있고, 프로파일링도 할 수 있다. 민감한 정보들은 디버그 엔드포인트를 이용해서 볼 수 있다. 실제 사용 환경에서는 디버그 엔드포인트는 사용하지 않는게 좋다. 디버그서버가 접속을 허용할 대상에 대한 addr 변수만 HOST:PORT로 있으면 된다.
     
    notifications
    notifications:
      endpoints:
        - name: alistener
          disabled: false
          headers: <http.Header>
          timeout: 500
          threshold: 5
          backoff: 1000
    notifications은 선택사항이다. endpoints 옵션만 선택가능하다.
     
    endpoints
    이벤트 알림을 받을 수 있는 서비스의 URL들을 등록할 수 있다.
    매개변수
    필수여부
    설명
    name
    사람이 읽을 수 있는 이름
    disabled
    아니오
    서비스에 대한 enable/disable 알람 설정
    url
    이벤트를 전달할 URL
    headers
    각 요청에 추가할 정적 헤더
    timeout
    HTTP 타임아웃 값. 기본값은 ns 단위로 설정되어 있음. 값 뒤에 시간 단위를 명시해서 설정가능함.(ns, us, ms, s, m, h)등의 옵션이 사용가능하다.
    threshold
    실패하기전에 얼마나 오래 기다릴지 설정하는 값.
    backoff
    얼마나 오래동안 재시도 할 것인지를 설정하는 값. ns, us, ms, s, m, h 등의 시간단위로 설정가능하다.
     
    redis
    registry에서 캐시 용도로 사용하는 레디스에 대한 설정을 할 수 있다.
    redis:
      addr: localhost:6379
      password: asecret
      db: 0
      dialtimeout: 10ms
      readtimeout: 10ms
      writetimeout: 10ms
      pool:
        maxidle: 16
        maxactive: 64
        idletimeout: 300s

    매개변수
    필수여부
    설명
    addr
    레디스 인스턴스 주소
    password
    아니오
    레디스 인스턴스에서 인증용으로 사용할 비밀번호
    db
    아니오
    사용할 DB
    dialtimeout
    아니오
    레디스 인스턴스에 연결할때 타임아웃
    readtimeout
    아니오
    레디스 커넥션에 대한 읽기 타임아웃
    writetimeout
    아니오
    레디스 커넥션에 대한 쓰기 타임아웃
     
    pool
    pool:
      maxidle: 16
      maxactive: 64
    idletimeout: 300s
     
    레디스 커넥션 풀에 대한 설정.
    매개변수
    필수여부
    설명
    maxidle
    아니오
    사용하지 않는 커넥션의 최대 개수
    maxactive
    아니오
    실제로 사용하는 커넥션의 최대 개수
    idletimeout
    아니오
    사용하지 않는 커넷션을 닫기위해 기다리는 시간
     
     
    옵션 하나만 변경할때는 –e 옵션을 줘서 값 하나만 설정할 수도 있다. –e 옵션으로 REGISTRY_변수 의 형식으로 _를 이용해서 구체적인 옵션을 설정할 수 있다.
    설정파일에서는 아래 처럼 지정하는 변수의 경우
    storage:
      filesystem:
        rootdirectory: /var/lib/registry


     
    반응형

    'Container' 카테고리의 다른 글

    Docker Toolbox  (0) 2016.03.18
    Docker Swarm  (0) 2016.03.16
    Docker Machine  (0) 2016.03.11
    Docker Kitematic  (0) 2016.03.09
    Docker Compose  (0) 2016.03.07

    댓글

Designed by Tistory.