암호, SSL 및 S3 백엔드를 사용하여 자신의 docker 레지스트리를 실행하는 방법

10794 단어 devopsdocker
나는 내가 Docker를 사용하기 시작한 날을 기억한다.그것의 단순성은 압도적이다.나는 아주 좋은 공식 문서를 찾아보았고, 101편의 교과서를 찾아보았다.나는 성공적으로 나의 첫 번째 사진을 찍었다.이제 하나 생겼는데,
나는 나의 서버에 그것을 배치하고 싶다.첫 번째 옵션은 DockerHub 이지만 무료 계정에서 사진을 공유해 달라고 합니다.만약 네가 비밀을 지켜야 한다면, 이 서비스는 돈을 써야 한다.
또는 자체 Docker Registry 를 실행할 수 있으며 다음과 같은 유연성을 제공합니다.
  • 암호 보호
  • 이미지를 로컬 또는 클라우드에 저장(S3/Azure/GoogleCloud)
  • 자체 서명 SSL 인증서 사용
  • "The Registry is a stateless, highly scalable server side application that stores and lets you distribute Docker images."


    Docker 공식 문서에서 이 주제를 심도 있게 토론했습니다.너는 그것을 읽어서 그것이 무엇인지, 어떻게 작동하는지 파악해야 한다.이 글에서 나는 등록표 서버를 배치할 때 겪은 문제를 토론했다.나는 상술한 세 가지를 어떻게 실현하는지 설명할 것이다.본고의 나머지 부분에서 나는 당신이 공식 사이트에서 Registry OverviewUnderstanding Docker Registry를 읽었다고 가정합니다.약 3분.

    레지스트리 실행


    등록표 프로그램 자체가 용기에서 실행됩니다.브라우저에서 레지스트리 데이터에 접근할 수 있는 프런트엔드 구성 요소가 있습니다.모든 구성 요소는 자신의 용기에서 실행되며, 용기는 응용 프로그램 창고를 형성한다.응용 프로그램 스택은 특정한 작업을 수행하기 위해 연결된 응용 프로그램 그룹입니다.우리는 용기 하나하나를 단독으로 실행하는 것이 아니라 docker-compose 를 사용하여 응용 프로그램 창고를 실행할 수 있다.
    이것은 부두 노동자의 작문이다.우리는 yml 파일부터 시작합니다.
    version: '2'
    registry:
        image: registry:v2
        restart: always
        ports:
          - "5000"
        environment:
          REGISTRY_STORAGE_DELETE_ENABLED: 'true'
          REGISTRY_HTTP_ADDR: 0.0.0.0:5000
    registry-frontend:
        image: konradkleine/docker-registry-frontend:v2
        restart: always
        environment:
          ENV_DOCKER_REGISTRY_HOST: 'registry'
          ENV_DOCKER_REGISTRY_PORT: 5000
        links:
          - registry
        ports:
          - "8080:80"
        expose:
          - 80
    
    간단한 구성일 뿐이기 때문에 간단하게 분석합시다 (비밀번호, S3 또는 SSL 없음).
    등록표와 등록표의 앞부분은 창고의 용기 이름입니다.너는 마음대로 그들에게 이름을 지어줄 수 있다.환경 변수 REGISTRY\u STORAGE\u DELETE\u ENABLED를 사용하면 레지스트리에서 이미지를 삭제할 수 있습니다. REGISTRY\u HTTP\u ADDR 귀속 탐지 주소입니다.
    등록표 프런트엔드 컨테이너는 연결된 주소로 ENV\u DOCKER\u registry\u 호스트와 ENV\u DOCKER\u registry\u 포트를 사용합니다.dockercompose를 사용하기 때문에, 이름에 따라 사용할 수 있습니다.links 용기를 다른 서비스에 연결하도록 설정합니다. 우리의 예에서 등록표에 연결합니다.
    portsexpose 설정 사이에 어떤 차이가 있는지 알고 싶지 않습니까?다른 점은 포트는 호스트와 파일을 작성하는 다른 서비스가 정의된 포트에 접근할 수 있도록 하고, expose는 실제로는 포트를 다른 서비스에만 공개하고 호스트에 발표하지 않는다는 점이다.이 경우 내부 포트만 지정할 수 있습니다.
    포트는 또한 외부 포트(호스트에 정의됨)를 컨테이너에 할당된 포트에 연결합니다.registry 컨테이너의 경우 어느 곳에서든 항구 5000에 도착할 수 있다.한편, 등록표 앞부분은 포트80을 파일에 정의된 다른 서비스에만 공개하고 외부 액세스 포트80은 포트8080으로 연결한다.
    서비스를 실행하기 위해서, 우리는docker가 작성한 디렉터리에서 사용합니다 docker-compose up.yml 파일 주재.docker ps를 사용하여 서비스가 실행 중인지 확인할 수 있습니다.컨테이너가 열려 있으면 등록표 데이터를 보려면 http://localhost:8080 를 탐색할 수 있습니다.

    암호 시간


    개인 등록의 일부로서 나는 안전 조치를 좀 늘리고 싶다.나는 비밀번호로 그것을 보호하고 싶다.
    설정 후, 클라이언트는 처음으로 등록표에 로그인할 때 비밀번호를 제공해야 한다.
    이것은 매우 간단하다. 아주 좋은 문장이 이 점을 소개했다.검사"Private Docker Registry Part 2: let’s add basic authentication" on Medium 및 필요한 경우 구성합니다.

    개인 SSL 인증서


    안전은 시종 문제다.이것은 우리가 POC 과정에서 쉽게 잊을 수 있는 일이다.우리는 일을 먼저 시작하게 하고 싶을 뿐만 아니라 빨리 해야 한다.그것은 추가 절차가 필요하다. 우리는 그것을 마지막 임무로 삼는 경향이 있다.
    내가 너에게 건의한 것은 SSL을 사용할 수만 있다면 그것을 사용하라는 것이다.네가 투입한 추가 시간은 가치가 있고 결점이 없다.
    docker 클라이언트는 기본적으로 HTTPS를 사용하기 때문에 세 가지 옵션이 있습니다.
  • 클라이언트가 HTTPS 대신 HTTP를 사용하도록 설정
  • 비보안 레지스트리 매개 변수
  • 를 사용하여 클라이언트를 설정하여 우리의 레지스트리를 신뢰합니다
  • 신뢰할 수 있는 인증서, docker 엔진 또는 운영체제에 인증서를 추가
  • 나는 세 번째 옵션이 나의 가장 좋은 해결 방안이라는 것을 발견했다.나는 나의 서버를 위해 나의 인증서를 사용할 것이다.
    서버에 인증서 (cert.crt,cert.pem,ca 인증서) 를 생성했다고 가정합니다.
    공개 키와 개인 키를/var/lib/docker/certs에 넣습니다.레지스트리를 사용하려면 레지스트리 환경에서 구성에 다음 내용을 추가해야 합니다.
        REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry_gnosis.crt
        REGISTRY_HTTP_TLS_KEY: /certs/registry_gnosis_key.pem
      volumes:
        - /var/lib/docker/certs:/certs
    
    네, 서버 쪽에서 인증서를 사용하고 있습니다.너무 좋아요.하지만 우리는 아직 완성하지 못했다.
    클라이언트가 레지스트리에 연결할 수 있도록 워크스테이션에서 CA를 신뢰해야 합니다. 그렇지 않으면 연결할 수 없습니다.클라이언트가 CA 인증서를 신뢰하는 경우 완료됩니다.그렇지 않으면 CA 인증서를 기계에서 복사해야 합니다./etc/docker/certs로 복사할 수 있습니다.d와 docker는 자동으로 신뢰하거나 운영체제에서 필요한 것을 신뢰합니다. (Ubuntu 시스템에서는 다른 운영체제에서 다를 수 있습니다.)
  • /usr/local/share/ca 인증서/
  • 로 복사
  • sudoca인증서 업데이트
  • 이 동작을 실행한 후에 클라이언트의docker 서비스를 다시 시작해야 합니다.
    현재 우리의 등록표는 기본적인 신분 검증과 SSL 암호화 지원을 가지고 있으며, 우리의 여정을 계속하고 마지막 설정 절차에 들어가도록 합니다.S3를 백업으로 사용하는 방법을 설명한 후에 등록표에 연결하는 방법을 보여 드리겠습니다.

    S3 스토리지 백엔드


    우리의 이미지에 서비스를 등록합니다.우리는 그림을 끌어들이거나 밀어낼 수 있다.따라서 이미지는 디스크에 있어야 합니다.기본적으로 등록표를 실행하는 docker 호스트에 있습니다.너는 다른 부피로 그것을 설치할 수 있지만, 너는 이것보다 더 멋진 일을 할 수 있다.AWS S3 스토리지 서비스를 백엔드로 사용합니다.이것은 내가 등록표에 올린 모든 이미지가 S3의 전용 저장소에 저장되어 있다는 것을 의미한다.
    다음과 같은 이점이 있습니다.
  • 백업에 신경 쓸 필요가 없습니다.
  • 나의 저장 공간은 무한하다.
  • 재난 복구, 만약에 나의 등록표가 burns 같은 기계에서 실행된다면, 나는 새로운 서비스를 배치하여 S3 저장소에 연결할 수 있다.모든 데이터를 보존합니다.
  • 3항을 다시 읽다.이것은 값을 매길 수 없는 것이다.dockercompose에서 S3 저장소를 설정하면 세계 어느 곳에서든 다른 등록표 용기를 시작할 수 있습니다.yml 파일은 제 모든 이미지에 접근할 수 있습니다.
    저장소를 구성하려면 레지스트리 구성 요소의 환경 부분에서 다음 코드 세그먼트를 사용해야 합니다.
        REGISTRY_STORAGE: s3
        REGISTRY_STORAGE_S3_ACCESSKEY: <api access key>
        REGISTRY_STORAGE_S3_SECRETKEY: <api secret>
        REGISTRY_STORAGE_S3_BUCKET: <bucket name>
        REGISTRY_STORAGE_S3_REGION: <region>
        REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false
    
    이것은 매우 직접적이지만 마지막이다.REGISTRY\u HEALTH\u STORAGEDRIVER\u를 사용하는 것이 중요합니다.
    내가 보충하기 전에 나는 문제에 부딪혔다.나는 정확한 오류를 기억하지 못하지만, 구글에서 한동안 검색한 후, 만약 당신이 빈 버킷 (나의was) 으로 등록표를 실행한다면, 이 건강 검사는 실패하고, 서비스도 시작할 수 없다는 것을 발견했다.그래서 나는 그것을 사용하지 않을 수 없었다. 모든 것이 정상이었다.
    내용을 업로드하면 이 검사를 사용할 수 있습니다.나는 정말 개의치 않기로 결정했다. 그래서 나는 그것을 사용하지 않았다.

    클라이언트 연결


    새 등록표를 사용하기 위해서 클라이언트를 연결해서 그림을 가져오거나 전송할 수 있도록 해야 합니다.등록표는 SSL을 사용하고 기본적으로 docker 클라이언트도 SSL을 사용하기 때문에 앞에서 말한 대로 CA를 신뢰해야 합니다.
    연결하려면 docker login -u <user> <url:port> (https 접두사 없음) 을 실행하십시오.
    이제 Ubuntu 시스템에서 이 작업을 수행하는 동안 또 다른 오류가 발생했습니다.
    자격 증명 저장 중 오류: 자격 증명을 저장하는 중 오류 - 오류: 종료 상태 1, 종료: X11$DISPLAY 없이 D-Bus를 자동으로 시작할 수 없음
    이 문제를 해결하기 위해서는 운영체제에서 패키지를 삭제해야 합니다. apt remove golang-docker-credential-helpers성공했어.레지스트리에 로그인하면 기본적으로 숨겨진 디렉터리 ~/내의 파일에 자격 증명이 저장됩니다.docker/config.json.분명히 이것은 최선의 방법이 아니다. 너는 더 좋은 대안을 찾을 수 있다above

    여기 있다 밀고 당기다


    그림을 당기거나 밀려면 등록표 주소 docker pull our-registry.com:<port>/image 를 참고하십시오.
    도메인 이름이 없으면 IP를 사용할 수도 있습니다.

    레지스트리 컨텐트 확인을 위한 API


    나는 나의 등록표 서버를 위해 가짜 도메인 registry.gnosis.org:5000 을 사용할 것이다.
    컨테이너를 실행하면 을 찾아 등록표의 내용, 저장소, 이미지, 태그를 볼 수 있습니다.프런트엔드를 사용하지 않거나 응용 프로그램에서 사용해야 하는 경우 해당 API를 사용하여 레지스트리에 액세스할 수 있습니다.
    유용한 예시를 보여드리겠습니다.
    # list of the repositories
    chen@gns:~$ curl -ksS -u admin https://gnosis.example.com/v2/_catalog
    Enter host password for user 'admin':
    {"repositories":["sample_image","nginx"]}
    
    # list of tags for an image
    chen@gns:~$ curl -ksS -u admin https://gnosis.example.com/v2/sample_image/tags/list
    Enter host password for user 'admin':
    {"name":"sample_image","tags":["0.1", "0.2", "latest"]}
    

    http://gnosis.example.com 총결산


    나는 등록표를 배치하는 과정을 완성했다.나는 내가 그것을 매우 투철하게 말하지 않았다는 것을 알고 있지만, 이것은 본문의 목적이 아니다.만약 당신이 개인 등록표를 필요로 한다면, 쉽게 하나를 설정할 수 있다.이 점을 어떻게 하는지 소개하는 강좌가 많다.
    나는 당신과 등록표를 배치할 때 겪은 문제와 내가 응용한 설정을 공유했습니다.
    비밀번호와 SSL을 보안 항목으로 적용하는 것이 중요하다는 점을 잊지 마세요.만약 클라우드 공급자를 사용하여 이미지를 저장할 수 있다면, 그것은 당신을 도와 많은 번거로움을 줄일 수 있다.그러나 이것은 결코 세계의 종말이 아니다. 만약 네가 할 수 없다면, 너는 내가 열거한 항목을 잘 돌볼 수 있을 뿐이다.
    다음은 전체docker-compose.yml의 모양입니다.
    version: '2'
    registry:
        image: registry:v2
        restart: always
        ports:
          - "5000"
        environment:
          REGISTRY_STORAGE_DELETE_ENABLED: 'true'
          REGISTRY_HTTP_ADDR: 0.0.0.0:5000
          REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry_gnosis.crt
          REGISTRY_HTTP_TLS_KEY: /certs/registry_gnosis_key.pem
          REGISTRY_STORAGE: s3
          REGISTRY_STORAGE_S3_ACCESSKEY: <api access key>
          REGISTRY_STORAGE_S3_SECRETKEY: <api secret>
          REGISTRY_STORAGE_S3_BUCKET: <bucket name>
          REGISTRY_STORAGE_S3_REGION: <region>
          REGISTRY_HEALTH_STORAGEDRIVER_ENABLED: false
      volumes:
        - /var/lib/docker/certs:/certs
    registry-frontend:
        image: konradkleine/docker-registry-frontend:v2
        restart: always
        environment:
          ENV_DOCKER_REGISTRY_HOST: 'registry'
          ENV_DOCKER_REGISTRY_PORT: 5000
        links:
          - registry
        ports:
          - "8080:80"
        expose:
          - 80
    

    좋은 웹페이지 즐겨찾기