JSCODE Logo
프로그래밍 과외블로그후기멘토진
회사명 : JSCODE대표 : 박재성사업자 등록번호 : 244-22-01557통신판매업 : 제 2023-인천미추홀-0381 호
학원 명칭 : 제이에스코드(JSCODE)원격학원학원설립ㆍ운영 등록번호 : 제6063호

서울특별시 구로구 경인로 20가길 11(오류동, 아델리아)

Copyright ⓒ 2025 JSCODE - 최상위 현업 개발자들의 프로그래밍 교육 All rights reserved.

이용약관개인정보처리방침
← 블로그 목록으로 돌아가기

개인 서버에 Docker Registry 직접 구축해서 사용하기

JSCODE 박재성
JSCODE 박재성
2025-12-10
author
JSCODE 박재성
category
Docker
createdAt
Dec 10, 2025
series
slug
setup-docker-registry-in-home-server
type
post
updatedAt
Dec 9, 2025 11:19 PM
👨🏻‍🏫
Docker 이미지를 저장하는 대표적인 Registry는 Docker Hub이다. 하지만 Docker Hub의 프라이빗 이미지 기능을 사용하려면 비용이 발생한다. (1개까지는 무료이지만…) 따라서 비용 없이 프라이빗 이미지를 관리하기 위해 자체 Docker Registry를 구축해 사용할 수 있다. 이제 Docker Registry를 직접 구축하는 방법에 대해 알아보자.
 

1. OpenSSL을 활용해 자체 서명된 SSL 인증서 생성하기

외부에서 Registry에 접근하려면 HTTPS를 기반으로 통신을 해야만 한다. HTTP로 통신할 경우 보안적인 위험성 때문에 Docker Registry 단에서 아예 통신을 차단한다. 따라서 HTTPS 적용을 위해 SSL 인증서를 먼저 발급받자.
 
$ mkdir ~/docker-registry/certs $ cd ~/docker-registry/certs # $ openssl req -newkey rsa:4096 -nodes -sha256 -keyout {key 파일명}.key -x509 -days {인증서 유효기간} -out {crt 파일명}.crt -subj $ openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.key -x509 -days 36500 -out registry.crt
위 명령어를 입력하면 아래와 같은 입력창이 뜬다. SSL 인증서의 메타 데이터를 입력한다고 생각하면 된다.
notion image
위 입력 항목 중에 다른 것들은 다 공백으로 놔둬도 되는데, Common Name에는 반드시 Docker Registry가 설치될 컴퓨터의 IP 또는 도메인 이름(ex. localhost, 192.168.0.10, jscode.kr 등)을 기입해야 한다. 그래야 실제 HTTPS 접속 시 Commane Name에 기입한 접속 주소가 일치해야 인증 에러가 안 뜬다.
 
[잘 생성됐는 지 확인하기]
notion image
  • .crt 파일 : 공개키(Public Key)를 포함한 인증서(Certificate) 파일
    • HTTPS 통신에서 클라이언트가 서버한테 통신을 보낼 때 공개키를 활용해 암호화를 해서 보냄.
    • 평상시에 클라이언트가 .crt 파일을 가지고 있지 않고, 클라이언트가 서버에 HTTPS 요청을 보내면 그 때 서버가 클라이언트한테 .crt 파일을 전달한다. 이게 바로 SSL Handshake이다.
  • .key 파일 : 개인키(Private Key) 파일
    • 절대 유출되면 안 됨. 서버만 가지고 있어야 함.
    • HTTPS 통신에서 클라이언트가 보낸 암호화된 데이터를 복호화할 때 사용.
 
 

2. Compose 파일 작성하기

$ cd ~/docker-registry $ vi compose.yml
 
compose.yml
services: docker-registry: image: registry:3 container_name: docker-registry restart: always ports: - "5000:5000" environment: REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt REGISTRY_HTTP_TLS_KEY: /certs/registry.key REGISTRY_HTTP_ADDR: 0.0.0.0:5000 volumes: - ./data:/var/lib/registry - ./certs:/certs
  • registry.crt, registry.key라고 입력한 값은, 1번 과정에서 SSL 인증서를 발급할 때 만든 파일명과 동일하게 작성해야 한다.
 

3. 도메인이 없는 채로 HTTPS 통신을 하기 위한 설정 추가

Docker Registry로 요청을 보내고자 하는 클라이언트 컴퓨터에 아래 설정을 추가해주어야 한다. Docker Registry를 설치한 리눅스 컴퓨터에서도 Docker Registry로부터 이미지를 pull할 일이 있으므로 추가해주자.
/etc/docker/daemon.json (리눅스에서 Docker Registry로 요청을 보낼 경우)
{ "insecure-registries": [ "172.30.1.37:5000" # 자신이 구축한 Docker Registry의 접근 IP 주소 기입 ] }
그리고 Docker를 재시작싴주자.
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
 
 
Mac에서 Docker Destkop을 기반으로 Docker Registry로 요청을 보내고 싶다면 아래 순서를 통해 옵션을 추가해주자.
  1. Docker Desktop 실행
  1. 오른쪽 상단 톱니바 → Settings
  1. 왼쪽 메뉴에서 Docker Engine 클릭
  1. JSON에 아래처럼 추가:
    1. { "insecure-registries": [ "172.30.1.37:5000" ] }
 

4. HTTPS 통신이 정상적으로 잘 되는 지 테스트하기

  1. docker-registry 컨테이너 실행시키기
    1. $ docker compose up --build -d $ docker ps # 컨테이너가 잘 떴는지 확인 $ docker logs [컨테이너 ID] # 컨테이너 로그에 에러 메시지 없는 지 확인
       
  1. curl 활용해 HTTPS 통신 잘 되는 지 확인하기
    1. Docker Registry가 설치된 환경에서 아래 명령어를 입력해 통신을 해보자.
      $ curl -k https://localhost:5000/v2/_catalog
      아래와 같이 출력된다면 정상적으로 잘 적용된 것이다.
      notion image
       
      그리고 외부의 다른 컴퓨터에서 Docker Registry로 HTTPS 통신을 해보자.
      # curl -k https://{Docker Registry로 접근할 IP}:5000/v2/_catalog $ curl -k https://172.30.1.37:5000/v2/_catalog
      아래와 같이 출력이 된다면 역시나 잘 적용된 것이다.
      notion image
 
 

5. 기본 인증 설정하기

  1. Docker Registry에 접근할 때 사용할 아이디, 패스워드 설정하기
    1. Docker Registry를 사용하려면 HTTPS 적용 이외에도 기본적인 인증 과정을 추가해주어야만 사용이 가능하다. 그래서 아이디, 패스워드를 입력하고 Docker Registry를 사용하는 과정을 추가해줄 것이다.
      $ mkdir ~/docker-registry/auth $ cd ~/docker-registry/auth $ docker run \ --entrypoint htpasswd \ httpd:2 -Bbn {아이디} {비밀번호} > htpasswd
       
      인증 파일이 잘 생성됐는 지 확인해보자. 아래와 같이 명령어를 입력했을 때 아래와 같이 출력된다면 정상적으로 잘 생성된 것이다.
      notion image
       
  1. compose.yml 파일 수정하기
    1. compose.yml
      services: docker-registry: image: registry:3 container_name: docker-registry restart: always ports: - "5000:5000" environment: REGISTRY_HTTP_TLS_CERTIFICATE: /certs/registry.crt REGISTRY_HTTP_TLS_KEY: /certs/registry.key REGISTRY_HTTP_ADDR: 0.0.0.0:5000 REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: "Registry Realm" REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd volumes: - ./data:/var/lib/registry - ./certs:/certs - ./auth:/auth
       
  1. 컨테이너 다시 실행시키기
    1. $ cd ~/docker-registry $ docker compose up --build -d
       
  1. 잘 작동하는 지 확인하기
    1. Docker Registry가 설치된 환경에서 먼저 확인해보자.
      # docker login {Docker Registry로 접근할 IP}:5000 $ docker login 172.30.1.37:5000
      notion image
외부 환경에서도 Docker Registry로 로그인이 잘 되는 지 확인해보자.
# docker login {Docker Registry로 접근할 IP}:5000 $ docker login 172.30.1.37:5000
 
이렇게까지 설정하면 Docker Resitry 구축이 끝이다~~~~