Docker hub private image 를 올리는 것은 제한이 있고 organization 의 경우 에는 비용을 지불해야만 사용가능하다.
서비스는 회사 내부에서 사용하기 때문에 private registry 환경을 구성하기로 했다.
운영체제: Centos7.6
도커엔진: 20.10.21
remote 방식은 ssl / openssl / 일반 HTTP (insecure) 배포 등이있다.
로컬에서만 작업을 할 시 remote 방식은 필요없지만, 개발자들이 각 자리에서 테스트 후 registry 서버에 올리는 방식이라 외부에서 이미지를 올리도록 접근이 가능해야했다. 사내에 있는 ssl 인증서를 통해 작업을 진행하였고
ssl 인증서가 와일드 카드라서 방화벽(DNS) or DNS 서버에 DNS 를 등록하여 통신 연결 확인 후 작업 진행하였다
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
#이미지 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
#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()
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-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"]
}