docker private registry(with: ssl)

kiyeon·2022년 12월 19일
0

Docker hub private image 를 올리는 것은 제한이 있고 organization 의 경우 에는 비용을 지불해야만 사용가능하다.
서비스는 회사 내부에서 사용하기 때문에 private registry 환경을 구성하기로 했다.


서버사양

운영체제: Centos7.6
도커엔진: 20.10.21


작업 순서

  1. ssl 인증서 사용
  2. docker registry 구성
  3. docker registry 사용법
  4. docker registry 이미지 삭제(with: shell, python)
  5. registry-web-ui 구성
  6. 기타 docker insecure 방식

ssl 인증서

remote 방식은 ssl / openssl / 일반 HTTP (insecure) 배포 등이있다.
로컬에서만 작업을 할 시 remote 방식은 필요없지만, 개발자들이 각 자리에서 테스트 후 registry 서버에 올리는 방식이라 외부에서 이미지를 올리도록 접근이 가능해야했다. 사내에 있는 ssl 인증서를 통해 작업을 진행하였고
ssl 인증서가 와일드 카드라서 방화벽(DNS) or DNS 서버에 DNS 를 등록하여 통신 연결 확인 후 작업 진행하였다

  • registry(서버) certs 폴더 생성
  • ssl 인증서 .crt, .key certs 해당 디렉토리에 파일 복사

docker registry 생성

docker run -d \
  --restart=always \
  --name registry \
  -v /certs:/certs \
  -v $pwd/data:/var/lib/registry \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/testdomain.co.kr.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/testdomain.co.kr.key \
  -p 443:443 \
  registry:2

docker registry 사용법

#이미지 tag 생성

docker tag [image_name][registry_url]:[port]/[image_name]:[tag]
docker tag hello-world testdomain.co.kr:443/hello-world:ver01
#이미지 push / pull 
docker push testdomain.co.kr:443/hello-world:ver01
docker pull testdomain.co.kr:443/hello-world:ver01
#registry 저장소 image 조회

curl -X GET [registry_url]//v2/_catalog
curl -X GET https://testdomain.co.kr:443/v2/_catalog
{"repositories":["hello-world"]} hello-world 라는 image 출력
#registry 저장소 image tag 조회
curl -X GET [registry_url]/v2/[image_name]/tags/list
curl -X GET https://testdomain.co.kr:443/v2/hello-world/tags/list

docker registry 이미지 삭제

#registry 저장소 image 조회

curl -X GET [registry_url]//v2/_catalog
curl -X GET https://testdomain.co.kr:443/v2/_catalog
{"repositories":["hello-world"]} hello-world 라는 image 출력
#registry 저장소 image tag 조회
curl -X GET [registry_url]/v2/[image_name]/tags/list
curl -X GET https://testdomain.co.kr:443/v2/hello-world/tags/list
{"name":"hello-world","tags":["latest"]}
#3.content digest(hash) 조회
 
curl -v --silent -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -X GET https://testdomain.co.kr:443/v2/hello-world/manifests/latest 2>&1 | grep Docker-Content-Digest | awk '{print ($3)}'
sha256:f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4

기타: 위 명령어에 도메인 / 이미지 이름 / 태그 확인하여 입력

 #이미지 삭제
 docker exec registry sh -c "rm -rf /var/lib/registry/docker/registry/v2/repogitories/hello-world/_manifests/tags/latest"
 docker exec registry sh -c "rm -rf /var/lib/registry/docker/registry/v2/repogitories/hello-world/revisions/sha256/f54a58bc1aac5ea1a25d796ae155dc228b3f0e11d046ae276b39c4bf2f13d8c4"

docker registry 이미지 삭제(with: python)
위 명령어를 통해 수동으로 하기 불편하여 파이썬으로 hash 정보를 가져와 삭제 할수 있도록 작성했고, 다른 사용자도 삭제할수 있도록 하려면 젠키스에 등록하면 될거같다.

import os
import json
import requests

image_name = 'hello-world'
tags = 'latest'
url = "https://test.co.kr:443/v2/"
array = "{0}{1}/manifests/{2}".format(url, image_name, tags)

token = "xoxb-4500354520147-4577704574945-0tHo3bjhuQvfr7p1gvluwjQ1"

def registry():
    
    headers = {
        "Accept": "application/vnd.docker.distribution.manifest.v2+json",
}
    response = requests.get(array, headers=headers).headers
    hash = response['Docker-Content-Digest'][7:]
    try:
        os.system("docker exec -w /var/lib/registry/docker/registry/v2/repositories/{0}/_manifests/tags registry rm -rf {1}".format(image_name, tags))
        os.system("docker exec -w /var/lib/registry/docker/registry/v2/repositories/{0}/_manifests/revisions/sha256 registry rm -rf {1}".format(image_name, hash))
        post_message("#test", "삭제완료!")
    except:
        print("error")

def post_message(channel, text):
     headers = {
        'Content-Type': 'application/json', 
        'Authorization': 'Bearer ' + token
        }
        payload = {
        'channel': channel,
        'text': text
        }
    r = requests.post('https://slack.com/api/chat.postMessage', 
        headers=headers, 
        data=json.dumps(payload)
        )         

registry()

기타 registry-web-ui 구성

docker run -d -p 8080:80 --name web -e REGISTRY_TITLE=LocalRegistry -e REGISTRY_URL=https://testdomain.co.kr:443 -e DELETE_IMAGES=true -e SINGLE_REGISTRY=true joxit/docker-registry-ui:latest
# /etc/docker/registry/config.yml

version: 0.1
log:
  fields:
    service: registry
storage:
  delete:
    enabled: true
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
    Access-Control-Allow-Origin: ["http://192.168.1.204:8080"]
    Access-Control-Allow-Methods: ["HEAD", "GET", "OPTIONS", "DELETE"]
    Access-Control-Allow-Headers: ["Authorization", "Accept", "Cache-Control"]
    Access-Control-Expose-Headers: ["Docker-Content-Digest"]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 

기타 docker insecure 방식

docker-desktop 사용시 (windows 10)
insecure-registries 추가 등록

#window
# docker desktop setting -> docker engine
{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [
    "192.168.1.204:5000"
  ]
}

linux
$ vi /etc/docker/daemon.json

{

    "insecure-registries": ["192.168.0.1:5000"]

}

0개의 댓글