You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 10 Current »

Why docker registry?

다음과 같은 경우 레지스트리를 사용해야합니다.

  • 이미지가 저장된 위치를 직접관리
  • 이미지 유통 파이프 라인을 완전히 소유
  • 이미지 저장 및 배포를 사내 개발 워크 플로우에 긴밀하게 통합

요구사항

레지스트리는 Docker 엔진 버전 1.6.0 이상 과 호환됩니다 .

Registry 이미지 검색

[root@k8s-worker01 ~]# docker search registry
INDEX       NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
docker.io   docker.io/registry                                The Docker Registry 2.0 implementation for...   2476      [OK]       
docker.io   docker.io/konradkleine/docker-registry-frontend   Browse and modify your Docker registry in ...   217                  [OK]
docker.io   docker.io/hyper/docker-registry-web               Web UI, authentication service and event r...   161                  [OK]
docker.io   docker.io/atcol/docker-registry-ui                A web UI for easy private/local Docker Reg...   113                  [OK]
docker.io   docker.io/distribution/registry                   WARNING: NOT the registry official image!!...   57                   [OK]
docker.io   docker.io/marvambass/nginx-registry-proxy         Docker Registry Reverse Proxy with Basic A...   44                   [OK]

Docker Registry

Registry 정보

저장소 자체는 드라이버에 위임됩니다. 기본 저장소 드라이버는 개발 또는 소규모 배포에 적합한 로컬 posix 파일 시스템입니다. 

S3, Microsoft Azure, OpenStack Swift 및 Aliyun OSS와 같은 추가 클라우드 기반 스토리지 드라이버도 지원됩니다. 

다른 스토리지 백엔드를 사용하려는 사람들은 스토리지 API를 구현하는 자체 드라이버를 작성하여 이를 수행 할 수 있습니다 .

호스팅 된 이미지에 대한 액세스를 보호하는 것이 가장 중요하기 때문에 레지스트리는 기본적으로 TLS 및 기본 인증을 지원합니다.

레지스트리 GitHub 저장소에는 고급 인증 및 권한 부여 방법에 대한 추가 정보가 들어 있습니다. 

이러한 방식으로 레지스트리를 확장하기 위해서는 대규모 또는 일반 배포 만 필요합니다.

마지막으로, 레지스트리에는 강력한 통지 시스템이 있으며, 활동에 대한 응답으로 webhooks를 호출하며, 광범위한 로깅 및보고 기능을 제공합니다.

메트릭을 수집하려는 대규모 설치에 주로 유용합니다.

사용 사례

자신의 레지스트리를 운영하는 것은 CI / CD 시스템을 통합하고 보완하는 훌륭한 솔루션입니다. 

일반적인 워크 플로에서 소스 개정 관리 시스템에 대한 커밋은 CI 시스템에서 빌드를 트리거합니다.

그러면 빌드가 성공적으로 수행되면 새 이미지가 레지스트리로 전송됩니다. 

그런 다음 레지스트리에서 알림을 받으면 준비 환경에서 배포를 트리거하거나 다른 시스템에 새 이미지를 사용할 수 있음을 알립니다. 

대규모 시스템 클러스터에 새 이미지를 신속하게 배포하려는 경우에도 필수 구성 요소입니다.

마지막으로 고립 된 네트워크 내에 이미지를 배포하는 가장 좋은 방법입니다.

운영 요구사항

이미지를 밀고 당기는 것과 관련하여 Docker에 대해 잘 알고 있어야합니다. 

데몬과 cli의 차이점을 이해하고 최소한 네트워킹에 대한 기본 개념을 파악해야합니다.

또한 레지스트리를 시작하는 것은 매우 쉽지만 프로덕션 환경에서 운영하려면 다른 서비스와 마찬가지로 운영 기술이 필요합니다. 

시스템 가용성 및 확장 성, 로깅 및 로그 처리, 시스템 모니터링 및 보안에 익숙해야합니다.

http 및 전체 네트워크 통신에 대한 철저한 이해와 golang에 대한 지식은 고급 작업이나 해킹에 유용합니다.

Registry 사용자 정의

$ docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  registry:2

# --restart : Docker가 다시 시작되거나 종료 될 때 자동으로 다시 시작되도록 설정
# -v : 특정 디렉토리에 SSD 또는 SAN을 마운트 한 경우와 같이 레지스트리 파일 내용을 호스트 파일 시스템의 특정 위치에 저장하려면 바인드 마운트를 대신 사용

외부에서 접근 가능한 레지스트리 실행

[root@k8s-worker01 ~]# mkdir certs
[root@k8s-worker01 ~]# 
[root@k8s-worker01 ~]# openssl req \
>   -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \
>   -x509 -days 365 -out certs/domain.crt
Generating a 4096 bit RSA private key
...................................................++
........................................................................++
writing new private key to 'certs/domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:kr
State or Province Name (full name) []:seoul      
Locality Name (eg, city) [Default City]:seoul 
Organization Name (eg, company) [Default Company Ltd]:sptek
Organizational Unit Name (eg, section) []:engops
Common Name (eg, your name or your server's hostname) []:registry.thesanse.com
Email Address []:sooabia22@sptek.co.kr
[root@k8s-worker01 ~]# cd certs
[root@k8s-worker01 certs]# ls
domain.crt  domain.key
[root@k8s-worker01 certs]# ls
domain.crt  domain.key
[root@k8s-worker01 certs]# 

[root@k8s-worker01 ~]# docker swarm init --advertise-addr 52.231.65.113
Swarm initialized: current node (0zhxqeqg5zcidk4mte87htlej) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join \
    --token SWMTKN-1-2pe05um3cnu3z8ktyxkjmozujgmmvffdct4dz81bd2dghurjyr-eu3oqllp4b637iksavox60t0x \
    52.231.65.113:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]# docker secret create domain.crt certs/domain.crt
ulpoxrnjasokhz9tv3yx0cocy
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]# docker secret create domain.key certs/domain.key
5gbj3r3s81bmxp4s1ueduzdtm
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]# docker node ls
ID                           HOSTNAME      STATUS  AVAILABILITY  MANAGER STATUS
0zhxqeqg5zcidk4mte87htlej *  k8s-worker01  Ready   Active        Leader
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]# docker node update --label-add registry=true 0zhxqeqg5zcidk4mte87htlej
0zhxqeqg5zcidk4mte87htlej
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]# docker service create \
>   --name registry \
>   --secret domain.crt \
>   --secret domain.key \
>   --constraint 'node.labels.registry==true' \
>   --mount type=bind,src=/mnt/registry,dst=/var/lib/registry \
>   -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
>   -e REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/domain.crt \
>   -e REGISTRY_HTTP_TLS_KEY=/run/secrets/domain.key \
>   --publish published=443,target=443 \
>   --replicas 1 \
>   registry:2
7bzq5bkrm51i9nmjtyaqyizkq
[root@k8s-worker01 ~]#
[root@k8s-worker01 ~]# mkdir auth
[root@k8s-worker01 ~]# docker run \
>   --entrypoint htpasswd \
>   registry:2 -Bbn testuser testpassword > auth/htpasswd
[root@k8s-worker01 ~]# docker container stop registry
registry
[root@k8s-worker01 ~]# docker run -d \
>   -p 5000:5000 \
>   --restart=always \
>   --name registry2 \
>   -v "$(pwd)"/auth:/auth \
>   -e "REGISTRY_AUTH=htpasswd" \
>   -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
>   -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
>   -v "$(pwd)"/certs:/certs \
>   -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
>   -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
>   registry:2
fe488ab1873a563e868a336dfbdb962f10429d2adf813d41d7eb5b46a4f6c565
[root@k8s-worker01 ~]# docker login registry.thesanse.com:5000
Username: testuser
Password:
Error response from daemon: Get https://registry.thesanse.com:5000/v1/users/: x509: certificate signed by unknown authority
  • No labels