-
Docker RegistryContainer 2016. 3. 14. 09:00dockerhub를 이용해서 자신이 만든 docker 이미지를 저장하고 배포할 수 있지만, 필요에 따라 docker 이미지를 저장할 수 있는 저장소를 직접 구축해야할 수도 있다. 이런경우를 위해서 docker는distribution이라는 사설 docker 이미지 저장소 소스를 배포하고 있다. distribution은 원래 docker registry라는 저장소 기능만을 제공하는 프로젝트에 추가로 이미지를 만들고 저장해서 배포하는 기능까지 가지게 되었다.distribution을 사용하려면 docker 버전이 1.6.0 이상이 되어야 한다.우선 간단하게 registry를 실행해 보자. docker registry는 docker 이미지를 제공하기 때문에 쉽게 테스트 해볼 수 있다. 아래처럼 간단한 docker 명령으로 실행가능하다.docker run -d -p 5000:5000 --name registry registry:2이제 이 저장소에 docker 이미지를 저장해 보도록 하자. 아래 명령을 이용해서 Ubuntu 이미지를 가져와서 태그를 변경한 다음에 방금 실행한 docker registry에 저장할 수 있다.docker pull ubuntudocker tag ubuntu localhost:5000/myfirstimagedocker push localhost:5000/myfirstimage이제 등록되있던 이미지를 지우고 docker registry에 저장되어 있던 이미지를 가져와 보자.docker rmi localhost:5000/myfirstimagedocker rmi ubuntudocker pull localhost:5000/myfirstimage이제 registry를 멈추고 registry가 사용하던 볼륨을 삭제하자.docker stop registry && docker rm -v registry여기까지 간단하게 docker registry를 실행해 봤다.실제로 docker 이미지 저장소를 운영하려면 신경써야 할 것들이 더 있다. 이미지를 여러개 저장하려면 충분한 크기의 스토리지가 있어야 한다. 테스트용으로야 간단하게 하드디스크를 사용하면 되겠지만 실제 운영을 하기 위해서는 용량이 크고 안정적인 스토리지가 있어야 한다. registry에서는 다양한 스토리지를 선택해서 사용할 수 있게 해주고 있다. 그리고 방금 예제에서는 이미지를 등록하고 다운받는데 아무런 인증 과정이 없었다. 아무나 docker이미지를 등록, 변경, 삭제할 수 있다면 여러가지 문제가 발생할 수 있다. 이런 일을 방지하기 위해서 docker registry는 TLS인증과 basic authentiation을 지원한다.docker registry는 사용할 스토리지에 대한 드라이버를 변경하는 방식으로 스토리지를 변경할 수 있다. Docker registry가 제공하는 스토리지 드라이버에는 파일시스템, AWS S3, 마이크로소프트 애저, Ceph Rados, 오픈스택 스위프트, Aliyun OSS등이 있다. 각 드라이버마다 설정해줘야 하는 인자값이 다른데, https://docs.docker.com/registry/storagedrivers/에서 드라이버별 인자를 확인할 수 있다. 사용자가 원하면 직접 스토리지 API를 구현해서 사용할 수도 있다.Docker registry는 YAML파일을 이용해서 설정을 할 수 있다. 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설정파일에 쓰이는 옵션에는 다음과 같은 것들이 있다.versionversion: 0.1version은 필수 옵션이다. 설정의 버전을 명시한다.loglog는 하위 항목들을 이용해서 로그 시스템을 설정한다.log:level: debugformatter: textfields:service: registryenvironment: staging이런 형식으로 로그를 설정할 수 있고 각 세부 항목의 내용은level : error, warn, info, debug등을 지정할 수 있다. 기본값은 info다.formatter : 로그 출력 형식을 지정한다. text, json, logstash등을 선택할 수 있고 text가 기본값이다.fields : 로그의 모든 행에 추가되는 값들이다. 다른 로그들과 함께 혼재되어 있을때 구분해서 보기 편하게 해준다.hooks로그 훅이 어떤 걸 할지를 지정한다. Loglevel에 따라 다음처럼 지정된 메일로 메일을 보낼 수 있다.hooks:- type: maillevels:- panicoptions:smtp:addr: smtp.sendhost.com:25username: sendernamepassword: passwordinsecure: truefrom: name@sendhost.comto:loglevelerror, warn, info, debug등의 값을 지정할 수 있고, 기본값은 info이다. 더 자세한 로그 설정은 log를 이용해서 할 수 있다.storage이미지 저장소로 어떤 스토리지를 사용할지 지정하는 옵션이고, 필수 옵션이다. 스토리지 종류는 하나만 선택할 수 있다. 스토리지 종류별로 설정해 주어야 하는 옵션 항목들은 아래와 같다. 최근에는 s3나 swift API를 지원하는 스토리지나 데이터베이스가 많이 있어서 s2, swift와 API가 호환 가능한 다양한 스토리지를 사용할 수 있다.storage:filesystem:rootdirectory: /var/lib/registryazure:accountname: accountnameaccountkey: base64encodedaccountkeycontainer: containernames3:accesskey: awsaccesskeysecretkey: awssecretkeyregion: us-west-1bucket: bucketnameencrypt: truesecure: truev4auth: truechunksize: 5242880rootdirectory: /s3/object/name/prefixrados:poolname: radospoolusername: radosuserchunksize: 4194304swift:username: usernamepassword: passwordtenant: tenantnametenantid: tenantiddomain: domain name for Openstack Identity v3 APIdomainid: domain id for Openstack Identity v3 APIinsecureskipverify: trueregion: frcontainer: containernamerootdirectory: /swift/object/name/prefixcache:blobdescriptor: inmemorymaintenance:uploadpurging:enabled: trueage: 168hinterval: 24hdryrun: falseredirect:disable: falsecache스토리지 벡엔드에 접근하는 데이터를 캐싱할 수 있다. 주로 레이어 메타데이터를 빠르게 접근할 수 있게 한다. Blobdescriptor 필드에 redis나 inmemory를 지정해서 사용할수 있다.redirect콘텐츠 벡엔드에서 리다이렉트하는걸 관리하는 설정이다. 기본값은 redirect를 사용하는 것이다. 사용하지 않으려면 아래처럼 disable를 true로 설정하면 된다.redirect:disable: truefilesystemfilesystem은 이미지 파일을 보관하는 스토리지로 로컬 디스크를 사용한다. 개발용이나 규모가 작은 애플리케이션에 적합하다. rootdirectory 매개변수만 있으면 된다. 여기에 사용하는 경로명은 절대경로여야 한다.azure마이크로 소프트의 애저 Blob 스토리지를 사용한다.사용하는 매개변수는 아래와 같다.매개변수필수여부설명accountname예애저 계정명accountkey예에저 계정 키container예데이터를 저장하는데 사용하려는 애저 컨테이너의 이름realm아니오스토리지 서비스 API 엔드포인트에 대한 도메인명 접미사. 기본값은 core.windows.net이다.radosCeph 오브젝트스토리지를 사용한다.매개변수필수여부설명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아니오버전 4의 AWS 인증을 사용할 것인지 설정. 기본값은 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: ARegistryMiddlewareoptions:foo: barrepository:- name: ARepositoryMiddlewareoptions:foo: barstorage:- name: cloudfrontoptions:baseurl: https://my.cloudfronted.domain.com/privatekey: /path/to/pemkeypairid: cloudfrontkeypairidduration: 3000미들웨어는 name와 options 키워드를 가지고 있다. Name은 미들웨어의 이름을 의미하고 options은 해당 미들웨어에서 필요한 세부 옵션들을 설정하는데 사용한다.cloudfront매개변수필수여부설명baseurl예SCHEME://HOST[/PATH] 사용할 Cloudfront 주소privatekey예AWS의 Cloudfront용 사설 키keypairid예AWS의 키 쌍 IDduration아니오URL이 유효한 기간.reportingreporting:bugsnag:apikey: bugsnagapikeyreleasestage: bugsnagreleasestageendpoint: bugsnagendpointnewrelic:licensekey: newreliclicensekeyname: newrelicnameverbose: truereporting 옵션은 선택사항이다. 에러와 메트릭 리포팅 도구를 선택할 수 있다. 지원하는 서비스로는 뉴랠릭(New Relic)과 Bugsnag이 있다.bugsnag매개변수필수여부설명apikey예Bugsnag용 API 키releasestage아니오Registry가 배포될 트랙, production, staging, development등이 있다.endpoint아니오엔터프라이즈 Bugsnag 엔드포인트Newrelic매개변수필수여부설명licensekey예New Relic용 라이센스 키name아니오New Relic 애플리케이션 이름verbose아니오표준출력에 New Relic 디버깅용 출력을 보이게 함.httphttp:addr: localhost:5000net: tcpprefix: /my/nested/registry/secret: asecretforlocaldevelopmenttls:certificate: /path/to/x509/publickey: /path/to/x509/privateclientcas:- /path/to/ca.pem- /path/to/another/ca.pemdebug:addr: localhost:5001registry를 제공하는 HTTP 서버의 세부 옵션을 지정한다.매개변수필수여부설명addr예외부 접근이 가능한 IP 대역을 지정한다. net 옵션의 타입에 따라 바뀐다. net 옵션이 tcp이면 HOST:PORT형식을 사용하고 net 옵션이 unix이면 FLIE을 사용한다.net아니오리스닝 소켓을 만드는데 사용할 네트워크를 설정한다. unix와 tcp를 선택할수 있고, 기본값은 tcp이다.prefix아니오서버에서 사용할 접미사이다. 앞뒤에 슬래시를 가지고 있어야 한다.secret예데이터 보안용 암호화 키. 로드밸런서를 앞에두고 registry 서버를 여러개 사용하려면 각 registry서버의 secret값이 동일해야 한다.tlstls는 http 하위 옵션이다. 서버에서 TLS를 사용할수 있게 설정한다. Nginx나 아파치 같은 웹서버를 이용중이라면 그쪽에 TLS를 설정한 다음 registry에 프록시로 연결해서 사용하면 된다.매개변수필수여부설명certificate예X509 인증 파일의 절대경로key예X509 사설키 파일의 절대경로clientcas아니오X509 CA 파일의 절대경로들에 대한 배열 값debugdebug 옵션은 선택사항이다. 디버그 서버를 설정하는데 사용할 수 있다. 여기 설정한 디버그 엔드포인트로 registry의 메트릭과 상태를 모니터링할 수 있고, 프로파일링도 할 수 있다. 민감한 정보들은 디버그 엔드포인트를 이용해서 볼 수 있다. 실제 사용 환경에서는 디버그 엔드포인트는 사용하지 않는게 좋다. 디버그서버가 접속을 허용할 대상에 대한 addr 변수만 HOST:PORT로 있으면 된다.notificationsnotifications:endpoints:- name: alistenerdisabled: falseheaders: <http.Header>timeout: 500threshold: 5backoff: 1000notifications은 선택사항이다. endpoints 옵션만 선택가능하다.endpoints이벤트 알림을 받을 수 있는 서비스의 URL들을 등록할 수 있다.매개변수필수여부설명name예사람이 읽을 수 있는 이름disabled아니오서비스에 대한 enable/disable 알람 설정url예이벤트를 전달할 URLheaders예각 요청에 추가할 정적 헤더timeout예HTTP 타임아웃 값. 기본값은 ns 단위로 설정되어 있음. 값 뒤에 시간 단위를 명시해서 설정가능함.(ns, us, ms, s, m, h)등의 옵션이 사용가능하다.threshold예실패하기전에 얼마나 오래 기다릴지 설정하는 값.backoff예얼마나 오래동안 재시도 할 것인지를 설정하는 값. ns, us, ms, s, m, h 등의 시간단위로 설정가능하다.redisregistry에서 캐시 용도로 사용하는 레디스에 대한 설정을 할 수 있다.redis:addr: localhost:6379password: asecretdb: 0dialtimeout: 10msreadtimeout: 10mswritetimeout: 10mspool:maxidle: 16maxactive: 64idletimeout: 300s매개변수필수여부설명addr예레디스 인스턴스 주소password아니오레디스 인스턴스에서 인증용으로 사용할 비밀번호db아니오사용할 DBdialtimeout아니오레디스 인스턴스에 연결할때 타임아웃readtimeout아니오레디스 커넥션에 대한 읽기 타임아웃writetimeout아니오레디스 커넥션에 대한 쓰기 타임아웃poolpool:maxidle: 16maxactive: 64idletimeout: 300s레디스 커넥션 풀에 대한 설정.매개변수필수여부설명maxidle아니오사용하지 않는 커넥션의 최대 개수maxactive아니오실제로 사용하는 커넥션의 최대 개수idletimeout아니오사용하지 않는 커넷션을 닫기위해 기다리는 시간옵션 하나만 변경할때는 –e 옵션을 줘서 값 하나만 설정할 수도 있다. –e 옵션으로 REGISTRY_변수 의 형식으로 _를 이용해서 구체적인 옵션을 설정할 수 있다.설정파일에서는 아래 처럼 지정하는 변수의 경우storage:filesystem:rootdirectory: /var/lib/registry-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 댓글