Harbor 는 프로젝트 단위로 이미지를 묶고 권한을 준다. 모든 이미지는 $HARBOR_ADDRESS/$PROJECT/$REPOSITORY:$TAG 형태로 저장되며, $REPOSITORY 안의 / 는 실제 디렉터리가 아니라 이름의 일부다. Harbor 2.15 기준이다[1].

[Projects] > [New Project] 에서 이름을 넣고 만든다. 설치 시 library 프로젝트가 공개로 미리 만들어져 있다.
| 항목 | 내용 |
|---|---|
| Public | 켜면 로그인 없이 누구나 pull 할 수 있다. 끄면 멤버만 접근한다 |
| Proxy Cache | 외부 레지스트리를 캐시하는 프로젝트. Proxy cache 로 사용 |
| Storage quota | 프로젝트 저장 용량 상한. 시스템 관리자만 바꿀 수 있다 |
[Projects] > 프로젝트 > [Members] 에서 사용자 · 그룹을 넣고 역할을 준다[2].
| 역할 | 할 수 있는 것 |
|---|---|
| Limited Guest | 저장소 · 이미지 · 취약점 목록 조회 |
| Guest | 위에 더해 pull, 이미지 레이블 붙이기 |
| Developer | 위에 더해 push, 저장소 생성, 스캔, 이미지 삭제 |
| Maintainer | 위에 더해 프로젝트 레이블, tag retention · immutability 규칙 |
| Project Admin | 위에 더해 멤버 · 로봇 계정 · webhook · CVE allowlist · 프로젝트 삭제 |
CI 파이프라인에는 사람 계정 대신 [Robot Accounts] 로 만든 로봇 계정을 쓴다. 이름은 robot$<프로젝트>+<이름> 꼴이 되고 토큰은 만들 때 한 번만 보여준다.
docker login harbor.example.com
HTTP 로 띄웠거나 사설 CA 인증서를 쓰면 클라이언트 쪽 설정이 먼저 필요하다 — Private repository 설정 - Harbor.
프로젝트가 먼저 있어야 한다. 이미지 이름 앞에 Harbor 주소와 프로젝트를 붙여 태그를 만들고 올린다.
docker tag ubuntu:24.04 harbor.example.com/demo/ubuntu:24.04
docker push harbor.example.com/demo/ubuntu:24.04
docker pull harbor.example.com/demo/ubuntu:24.04
공개 프로젝트는 로그인 없이 받을 수 있고, 비공개 프로젝트는 Guest 이상 멤버여야 한다.
내장 스캐너(Trivy)가 push 될 때 자동으로 스캔하도록 프로젝트 [Configuration] 에서 Automatically scan images on push 를 켠다. 심각도 기준으로 pull 을 막는 Prevent vulnerable images from running 도 같은 화면에 있다.
[Policy] 탭에서 오래된 태그를 자동으로 지우는 retention 규칙과, 특정 태그를 덮어쓰지 못하게 하는 immutability 규칙을 둔다. latest 를 덮어쓰지 못하게 막아 두면 CI 실수를 줄인다.
[Administration] > [Replications] 에서 다른 Harbor 나 외부 레지스트리와 이미지를 push/pull 방식으로 복제한다. 폐쇄망 Harbor 에 외부 이미지를 넣을 때 쓴다.