2026. 6. 13. 00:43ㆍDocker
Ⅰ. Docker 로컬 레지스트리
| Docker 로컬 레지스트리 |
구분 | 설명 | |
| 정의 | Docker Hub (공식 이미지 저장소) 외에 사내 네트워크에 자체적으로 설치한 프라이빗 저장소 (Prviate Registry) |
||
| 필요성 | 외부 네트워크 접속 제한 환경 | ||
| 개발 팀 간 일관된 이미지 버전 관리 | |||
| 사내 보안 정책 준수 (외부 유출 방지) | |||
| 빌드 / 배포 속도 향상 | |||
| 기능 | 이미지 업로드 (push) | ||
| 다운로드 (pull) | |||
| 버전 관리 | |||
| 접근 제어 | |||
| SSL 암호화 지원 | |||
| 장점 | 항목 | 설명 | |
| 개발 환경 일관성 | 모든 개발자가 동일한 이미지 버전 공유 가능 | ||
| 보안 강화 | 외부 네트워크 차단 상태에서도 이미지 관리 가능 | ||
| 속도 향상 | 빌드 시 외부 Docker Hub를 거치지 않아 다운로드 속도 향상 | ||
| 정책 통제 | 내부 권한 / 인증 시스템과 연동하여 접근 제어 가능 | ||
| 예시 사용처 | 기업 내 DevOps 환경 | ||
| 보안망 내부 서버 | |||
| 오프라인 배포 환경 | |||
Ⅰ - Ⅰ. 로컬 레지스트리 구성 방법
| 구분 | 설명 | 보안 수준 | 구성 요소 | 사용 환경 |
| 기존 로컬 레지스트리 구축 |
기본적인 HTTP 기반 로컬 레지스트리 구성 방식 |
낮음 | Registry 컨테이너 | 개발 및 테스트 환경 |
| 별도 인증이나 암호화 없이 단일 네트워크 내에서 이미지 장소 구성 |
로컬 저장소 | |||
| SSL 통신 기반 로컬 레지스트리 |
HTTPS 통신을 적용하여 데이터 전송 시 암호화 수행 |
중간 | Registry 컨테이너 | 내부망 서비스 운영 환경 |
| 자체 서명 인증서 (Self-signed) 또는 기업 인증서 사용 가능 |
인증서 (.crt / .key) | |||
| SSL 설정 | ||||
| SSL + Authentication 기반 로컬 레지스트리 |
SSL 암호화 + 사용자 인증 기능 (기본 인증)을 모두 활성화하여 접근 권한이 있는 사용자만 이미지 Push / Pull 가능 |
높음 | Registry 컨테이너 | 보안 정책이 강화된 기업 / 기관 환경 |
| 인증서 파일 | ||||
| 인증 계정 (htpasswd) |
Ⅱ. 기본 로컬 레지스트리 구축
| 기본 로컬 레지스트리 구축 |
구분 | 내용 | |
| 개념 | Docker에서 제공하는 공식 registry 이미지를 이용해 가장 단순한 형태의 이미지 저장소를 구축하는 방식 |
||
| 특징 | 외부 Docker Hub를 사용하지 않고 로컬 서버에서 이미지 관리 가능 | ||
| HTTP 프로토콜 기반 (기본 포트 5000)으로 동작 | |||
| SSL, 인증 기능 없는 테스트 / 개발용 구성 | |||
| 기본 목적 | 개발 환경에서 팀 내에서 동일한 이미지를 공유 및 배포하기 위한 경량 로컬 저장소 구성 | ||
| 구성 형태 | 단일 Docker 컨테이너 (registry : 2)로 실행되고, 호스트 파일 시스템에 이미지 데이터 저장 | ||
| 구성 요소 | 구성 요소 | 설명 | |
| Registry 컨테이너 | Docker Hub에서 제공하는 공식 이미지 registry : 2 를 사용하여 레지스트리 서버 역할 수행 |
||
| 저장 디렉터리 | /var/lib/registry 경로에 이미지 레이어와 메타 데이터 저장 | ||
| 네트워크 포트 | 기본적으로 5000번 포트 사용 (HTTP 기반) | ||
| 접근 주소 | localhost : 5000 또는 내부망 IP 주소를 통해 접근 | ||
| 이미지 전송 방식 | HTTP 프로토콜을 통해 Push / Pull 요청 처리 (암호화 없음) | ||
| 구축 특징 | 항목 | 설명 | |
| 보안 수준 | 낮음 | ||
| 인증 및 암호화 기능 미적용 | |||
| 운영 복잡도 | 낮음 | ||
| 단일 컨테이너만 실행하면 즉시 사용 가능 | |||
| 설정 요구 | 거의 없음 | ||
| 별도 인증서나 사용자 계정 불필요 | |||
| 적합한 환경 | 개발 및 테스트용 로컬 환경 | ||
| 네트워크 폐쇄망 내 단일 서버 | |||
| 비권장 환경 | 운영 환경 | ||
| 네트워크 연결 환경 (보안 취약) | |||
| 기본 동작 구조 | 단계 | 설명 | |
| ① 레지스트리 컨테이너 구동 | Docker 공식 이미지 (registry : 2)를 실행하면 자동으로 HTTP 기반 저장소 생성 |
||
| ② 이미지 업로드 (Push) | 사용자는 docker tag로 로컬 이미지를 태깅하고 docker push로 로컬 레지스트리에 업로드 |
||
| ③ 이미지 다운로드 (Pull) | 동일 네트워크 내 다른 호스트가 docker pull 명령으로 이미지 다운로드 가능 |
||
| ④ 데이터 저장 | 이미지의 레이어 및 메타 정보는 호스트 /var/lib/registry 디렉터리에 저장됨 |
||
| 주의사항 및 권장사항 |
항목 | 설명 | |
| 보안 취약성 | HTTP 통신은 암호화되지 않아 이미지 전송 중 도청 가능성 존재 | ||
| Docker 설정 필요 시 | SSL 없이 HTTP 접근하려면 클라이언트의 /etc/docker/daemon.json 에 insecure - registries 등록 필요 |
||
| 운영 환경 적용 불가 | 테스트용으로만 사용 권장 | ||
| 운영 환경에서는 반드시 SSL/ 인증 적용 필요 | |||
| 저장 공간 관리 | /var/lib/registry 디렉터리의 용량 및 정리 주기 관리 필요 (자동 삭제 미지원) |
||

docker search registry 명령을 통해 registry 키워드가 포함된 이미지 검색

# Registry 이미지 다운로드
docker image pull registry 명령을 통해 Docker Hub에서 Registry 이미지를 로컬 시스템으로 다운로드
docker image ls 명령을 통해 이미지가 잘 다운로드되었는지 확인

docker image inspect registry:latest 명령을 통해 Registry 이미지의 상세 정보 확인

# local-registry 컨테이너 생성 및 실행
docker container run --name local-registry registry 명령을 통해
Registry 이미지 사용하여 local-registry 컨테이너 생성 및 실행
-d 옵션을 통해 local-registry 컨테이너를 백그라운드로 구동
-p 5000:5000 옵션을 통해 호스트의 5000번 포트와 컨테이너의 5000번 포트 매핑
cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

# hello-world 이미지 다운로드
docker image pull hello-world 명령을 통해 Docker Hub에서 hello-world 이미지를 로컬 시스템으로 다운로드
docker image ls 명령을 통해 이미지가 잘 다운로드되었는지 확인

# hello-world 이미지에 새로운 이름과 태그 부여
docker image tag hello-world localhost:5000/hello-world 명령을 통해
hello-world 이미지에 localhost:5000/hello-world라는 새 이름과 새 태그 부여
docker image ls 명령을 통해 이미지에 새로운 이름과 태그가 잘 부여되었는지 확인

cat /etc/hosts 명령을 통해 IP 주소와 호스트 이름을 매핑하는 역할을 하는 시스템의 hosts 파일의 내용 확인
ip address 명령을 통해 시스템에 설정된 모든 네트워크 인터페이스의 IP 주소 정보 확인

netstat 명령을 통해 네트워크 연결, 라우팅 테이블, 인터페이스 통계 등 확인
-n 옵션을 통해 주소와 포트 번호를 숫자 형식으로 표시하도록 설정
-t 옵션을 통해 TCP 연결 표시하도록 설정
-l 옵션을 통해 LISTENING 상태에 있는 소켓 (연결을 기다리고 있는 상태인 소켓)만 표시하도록 설정
-p 옵션을 통해 해당 소켓을 사용하는 프로그램의 PID와 이름 표시하도록 설정

# 이미지 업로드
docker image push localhost:5000/hello-world:latest 명령을 통해
로컬 이미지인 localhost:5000/hello-world:latest를 레지스트리로 push
cls 명령을 통해 이미지가 잘 업로드되었는지 확인

# hello-world:latest, localhost:5000/hello-world:latest 이미지 삭제
docker image rm hello-world:latest localhost:5000/hello-world:latest 명령을 통해
hello-world 이미지와 localhost:5000/hello-world 이미지 삭제
docker image ls 명령을 통해 이미지들이 잘 삭제되었는지 확인

# test1 컨테이너 생성 및 실행
docker container run --name test1 localhost:5000/hello-world 명령을 통해
localhost:5000/hello-world 이미지 사용하여 test1 컨테이너 생성 및 실행
cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

docker image inspect registry:latest 명령을 통해 Registry 이미지의 상세 정보 확인

# local-registry 컨테이너 내부 동작
docker container exec local-registry 명령을 통해 local-registry 컨테이너 내부로 진입
tree /var/lib/registry 옵션을 통해 local-registry 컨테이너 내부에서 /var/lib/registry 디렉터리를 트리 구조로 확인
Ⅲ. SSL 통신을 이용하는 로컬 레지스트리 구축 준비 작업
Ⅲ - Ⅰ. docker1과 docker2에서 /etc/hosts 파일 작업

docker1에서 cat << EOF > /etc/hosts 명령을 통해 /etc/hosts 파일에 EOF 글자가 나오기 전까지 내용 저장
[ /etc/hosts 파일의 내용 ]
192.168.2.20 myregistry.com 명령을 통해 192.168.2.20 IP 주소에 myregistry.com이라는 호스트 이름 매핑
EOF 명령을 통해 입력 종료

docker2에서 cat << EOF > /etc/hosts 명령을 통해 /etc/hosts 파일에 EOF 글자가 나오기 전까지 내용 저장
[ /etc/hosts 파일의 내용 ]
192.168.2.20 myregistry.com 명령을 통해 192.168.2.20 IP 주소에 myregistry.com이라는 호스트 이름 매핑
EOF 명령을 통해 입력 종료

cat /etc/hosts 명령을 통해 /etc/hosts 파일의 내용 확인
ping –c 3 myregistry.com 명령을 통해 myregistry.com이라는 도메인 이름으로 네트워크 연결 테스트
Ⅲ - Ⅱ. docker2에서 SSL 공개키 및 비밀키 생성
- 다른 도커 시스템에서 로컬 레지스트리를 사용하려면 SSL / TLS 구축해야함
- 호스트 '/auth' 디렉터리에서 myregistry.com.crt (공개키, Public Key), myregistry.com.key (비밀키, Private Ket)
파일을 생성할 수 있도록 alpine/openssl 이미지 이용하여 컨테이너 구동
● 대칭키 (비밀키, Private Key)
| 대칭키 (비밀키, Private Key) |
구분 | 설명 |
| 개념 | 암호화 (Encrypt)와 복호화 (Decrypt)에 동일한 키 사용하는 방식 | |
| 동작 원리 | 송신자와 수신자가 같은 비밀키를 공유하여 데이터를 암호화하고 복호화함 | |
| 장점 | 처리 속도 빠름 | |
| 구현 단순 | ||
| 단점 | 키를 주고받을 때 노출 위험이 있음 (키 교환 문제) | |
| 사용자 수가 많을수록 키 관리가 복잡해 | ||
| 대표 알고리즘 | AES | |
| DES | ||
| 3DES | ||
| Blowfish | ||
| 사용 예시 | VPN | |
| 파일 암호화 | ||
| 네트워크 데이터 보호 |
● 비대칭키 (공개키, Public Key)
| 비대칭키 (공개키, Public Key) |
구분 | 설명 |
| 개념 | 암호화와 복호화에 서로 다른 두 개의 키 (공개키, 개인키)를 사용하는 방식 | |
| 동작 원리 | 공개키 (Public Key)로 암호화 -> 개인키 (Private Key)로 복호화 수행 | |
| 장점 | 키 교환 시 노출 위험 없음 | |
| 인증 및 서명 기능 제공 | ||
| 단점 | 연산 복잡하여 속도 느림 | |
| 대용량 데이터 암호화에는 비효율적 | ||
| 대표 알고리즘 | RSA | |
| DSA | ||
| ECC | ||
| ElGamal | ||
| 사용 예시 | SSL / TLS | |
| 전자서명 | ||
| 공개 인증서 시스템 (공인인증서 등) |
● 대칭키 vs 비대칭키
| 구분 | 대칭키 (비밀키, Private Key) | 비대칭키 (공개키, Public Key) |
| 키 구조 | 암호화와 복호화 키 동일 | 암호화 키와 복호화 키 다름 |
| 속도 | 빠름 | 느림 |
| 보안성 | 낮음 (키 노출 위험) | 높음 (공개키 기반 구조) |
| 키 관리 | 어려움 (사용자 수 많을수록 복잡) | 상대적으로 용이 |
| 사용 목적 | 데이터 암호화 중심 | 인증, 전자서명, 보안통신 중심 |
| 대표 알고리즘 | AES, DES, 3DES | RSA, DSA, ECC |
| 사용 예시 | 파일 암호화, VPN | HTTPS, SSL, SSH, 전자서명 |
● 대칭키 암호화 알고리즘
| 알고리즘 | 방식 | 설명 | 특징 |
| AES | 블록 암호 | 128 비트 블록 단위로 데이터 암호화 | 현재 가장 널리 사용되는 표준 대칭키 암호화 방식 |
| 키 길이 (128/192/256 비트)에 따라 보안 수준 달라짐 | 빠르고 강력한 보안성 | ||
| DES | 블록 암호 | 64비트 블록, 56비트 키 사용 | 초기 표준이었지만 짧은 키 길이 (56비트) 때문에 오늘날은 보안 취약 |
| 단순 구조로 구현 쉬움 | |||
| 3DES | 블록 암호 | DES를 3번 연속 적용 (암호화 -> 복호화 -> 암호화)하는 구조 |
DES보다 안전하지만 처리 속도 느리고 비효율적 |
| 현재는 AES로 대체 |
● 비대칭키 암호화 알고리즘
| 알고리즘 | 방식 | 설명 | 특징 |
| RSA | 공개키 암호 | 두 개의 큰 소수를 곱한 값을 기반으로 암호화 / 복호화 수행 | 가장 대표적인 공개키 알고리즘 |
| SSL / TLS, 전자서명, 인증서 등 광범위 사용 |
|||
| DSA | 전자서명 전용 | 서명 생성 및 검증용 비대칭키 알고리즘 | 전자서명 표준으로 널리 사용 (특히 정부, 인증기관) |
| 데이터 암호화보단 무결성 검증에 사용 | |||
| ECC | 타원곡선 기반 | 타원곡선 수학을 이용하여 RSA보다 짧은 키로 동일한 보안성 제공 | 경량 및 고속 암호화에 적합 (모바일, IoT 등) |
| ElGamal | 공개키 암호 | 이산 로그 문제의 어려움을 기반으로 설계된 알고리즘 | 구조가 단순하고 보안성 높음 |
| 암호문 길이가 평문보다 김 |
● 대칭키 알고리즘 vs 비대칭키 알고리즘
| 구분 | 대표 알고리즘 | 키 구조 | 속도 | 주요 용도 |
| 대칭키 암호화 | RSA, DES, 3DES | 동일 키 사용 | 빠름 | 데이터 암호화 |
| 비대칭키 암호화 | RSA, DSA, ECC, ElGamal | 공개키 / 개인키 분리 | 느림 | 인증, 서명, 키 교환 |

ssh-keygen 명령을 통해 SSH 프로토콜에서 사용되는 비대칭키 쌍인 공개키와 비밀키 생성
ls –l /root/.ssh/ 명령을 통해 /root/.ssh 디렉터리에 비밀키와 대칭키가 생성되었는지 확인

cat /root/.ssh/id_rsa.pub 명령을 통해 공개키가 생성된 /root/.ssh/id_rsa.pub 파일의 내용 확인
cat /root/.ssh/id_rsa 명령을 통해 비밀키가 생성된 /root/.ssh/id_rsa 파일의 내용 확인

mkdir /auth 명령을 통해 /auth 디렉터리 생성
cd /auth 명령을 통해 홈 디렉터리에서 /auth 디렉터리로 이동

# 컨테이너 생성 및 실행
docker container run 명령을 통해 컨테이너 생성 및 실행
—rm 옵션을 통해 실행이 종료되면 컨테이너가 자동으로 삭제되도록 설정
-v /auth:/auth 옵션을 통해 호스트 시스템의 /auth 디렉터리를 컨테이너 내부 /auth 디렉터리에 연결하여
컨테이너에서 생성된 파일을 호스트 시스템에 저장할 수 있도록 설정
alpine/openssl 옵션을 통해 openssl 명령어가 포함된 alpine 이미지를 사용하도록 지정
req 옵션을 통해 새로운 인증서 요청을 생성
-newkey rsa:4096 옵션을 통해 RSA-4096 알고리즘을 사용한 새 개인키 생성
-nodes 옵션을 통해 비밀번호 없이 개인키 생성
-sha256 옵션을 통해 인증서를 SHA-256 알고리즘으로 서명하도록 명시
-x509 옵션을 통해 인증서 서명 요청이 아닌 자체 서명된 인증서를 만들도록 지정
-days 365 옵션을 통해 인증서의 유효 기간을 365일로 설정
-out /auth/myregistry.com.crt 옵션을 통해 생성된 인증서 파일을 저장할 출력 경로 지정
-keyout /auth/myregistry.com.key 옵션을 통해 생성된 개인키 파일을 저장할 출력 경로 지정
-subj ‘/CN=myregistry.com’ 옵션을 통해 인증서가 유효한 주 도메인 이름을
myregistry.com으로 설정하고, 생성될 인증서의 주체 정보를 한 번에 지정
-addext “subjectAltName=DNS:myregistry.com” 옵션을 통해 주체 대체 이름을 설정하여 인증서에 확장 필드 추가
ls –l 명령을 통해 파일들이 잘 생성되었는지 확인

cat myregistry.com.crt 명령을 통해 인증서 파일인 myregistry.com.crt 파일의 내용 확인

cat myregistry.com.key 명령을 통해 비밀키 파일인 myregistry.com.key 파일의 내용 확인

cat myregistry.com.key | wc –c 명령을 통해 myregistry.com.key 파일의 내용을 화면에 출력하지 않고
그 내용을 다른 명령어의 입력으로 전달하여 파일의 크기만 확인
Ⅲ - Ⅲ. docker2에서 공개키 배포를 위한 인증서 준비
- SSL 환경에서 다른 도커 시스템들이 로컬 레지스트리로부터 이미지 다운받기 위해 로컬 레지스트리의 공개키 필요

mkdir –p /etc/docker/cert.d/myregistry.com 명령을 통해 사용자가 로컬 레지스트리용 인증서를
신뢰할 수 있도록 /etc/docker/cert.d/myregistry.com 디렉터리 생성
(-p 옵션 때문에 상위 디렉터리가 없을 경우 함께 생성)
cp /auth/myregistry.com.crt /etc/docker/cert.d/myregistry,com/ca.crt 명령을 통해
/etc/docker/cert.d/myregistry.com/ca.crt 파일에 /auth/myregistry.com.crt 인증서 파일의 내용 복사
ls –l /etc/docker/cert.d/myregistry.com/ 명령을 통해 파일이 잘 생성되었는지 확인

mv /etc/docker/cert.d /etc/docker/certs.d 명령을 통해 /etc/docker/cert.d 안에 있는
디렉터리와 파일들을 /etc/docker/certs.d 디렉터리로 이동
ls –l /etc/docker/certs.d/myregistry.com/ 명령을 통해 잘 이동되었는지 확인
Ⅳ. SSL 통신을 이용하는 로컬 레지스트리 구축
| 구분 | 구분 | 설명 | |
| SSL 통신을 이용한 로컬 레지스트리 구축 |
개념 | 로컬 레지스트리에 SSL 인증서를 적용하여 HTTPS 기반으로 암호화 통신을 수행하는 구성 방식 | |
| 필요성 | 기본 HTTP 환경에서는 이미지 전송 시 평문으로 데이터가 오가므로 기밀 정보 유출 위험 존재 | ||
| 구성 목적 | 이미지 업로드 (Push), 다운로드 (Pull) 시 데이터 전송 구간 암호화 (End - to - End Encryption) | ||
| 구성 요소 | 구성 요소 | 설명 | |
| Registry 서버 | registry : 2 이미지를 기반으로 구동되는 로컬 이미지 저장소 | ||
| SSL 인증서 (CRT) | HTTPS 암호화를 위한 인증 파일 (자체 서명 or CA 인증) | ||
| 비공개 키 (KEY) | SSL 인증서의 개인키 | ||
| 서버의 신원 검증 | |||
| 도메인 설정 | registry.company.local 같은 고유 도메인명으로 접근 | ||
| Docker 데몬 설정 | SSL 적용 시 Docker가 인증된 Registry로 인식하도록 daemon.json에 등록 필요 |
||
| 적용 대상 | 사내 개발망, 운영망 등 보안이 필요한 네트워크 환경 | ||
| 적용 효과 | 항목 | 설명 | |
| 데이터 암호화 | 이미지, 계정 정보 등 모든 전송 데이터 암호화 | ||
| 서버 인증 기능 | 서버의 신원 (도메인)을 검증하여 피싱 방지 | ||
| 무결성 보장 | 전송 중 데이터 위변조 탐지 및 차단 기능 | ||
| 보안 규정 준수 | HTTPS 기반 통신은 내부망 보안 정책 (ISO, ISMS 등)에 적합 | ||
| 주의사항 및 권장 사항 |
항목 | 설명 | |
| 인증서 관리 | 자체 서명 인증서 (Self-signed) 사용 시 클라이언트 측 insecure-registries 설정 필요 |
||
| 공인 인증서 사용 권장 | 기업망 / 운영만은 CA 서명 인증서 사용이 보안 및 호환성 측면에서 안전 | ||
| 키 보호 | .key 파일은 외부 접근이 불가능하도록 권한 제한 필요 | ||
| Docker 설정 변경 | /etc/docker/daemon.json에 SSL 도메인 등록 후 데몬 재시작 필요 | ||
| 테스트 환경 분리 | SSL 적용 전후 환경을 분리하여 인증서 충돌 방지 | ||
● HTTP 구성과의 차이점
| 구분 | HTTP 기반 레지스트리 | HTTPS (SSL) 기반 레지스트리 |
| 통신 포트 | 5000 (기본값) | 443 |
| 데이터 암호화 여부 | 평문 전송 | 암호화 전송 |
| 보안 위험 | 중간자 공격 (Man - in -the - Middle) 가능 | 암호화로 위변조 방지 |
| 서버 인증 | 없음 | 인증서 검증 가능 |
| 서버 환경 | 테스트용 | 내부망 |
| 폐쇄망 | 운영 환경 |

# local-registry 컨테이너 생성 및 실행
docker container run --name local-registry registry 명령을 통해
Registry 이미지 사용하여 local-registry 컨테이너 생성 및 실행
-d 옵션을 통해 local-registry 컨테이너를 백그라운드로 구동
-p 443:443 옵션을 통해 호스트의 443번 포트와 컨테이너의 443번 포트 매핑
--restart=always 옵션을 통해 컨테이너가 종료되면 항상 자동으로 다시 시작하도록 설정
-v /auth:/certs 옵션을 통해 호스트 시스템에 이전에 생성한 SSL/TLS 인증서 파일이 들어있는 /auth 디렉터리를
컨테이너 내부의 /certs 디렉터리에 연결하여 컨테이너가 인증서 파일에 접근할 수 있도록 함
-v /root/upload-img-1:/var/lib/registry 옵션을 통해 호스트 시스템의
/root/upload-img-1 디렉터리를 컨테이너 내부의 /var/lib/registry 디렉터리에 마운트 시킴
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myregistry.com.crt 옵션을 통해 인증서 파일의
컨테이너 내부 경로를 REGISTRY_HTTP_TLS_CERTIFICATE 환경 변수에 설정
-e REGISTRY_HTTP_TLS_KEY=/certs/myregistry.com.key 옵션을 통해
개인키 파일의 컨테이너 내부 경로를 REGISTRY_HTTP_TLS_KEY 환경 변수에 설정
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 옵션을 통해 레지스트리가 443번 포트에서 요청 받도록 설정
cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

# local-registry 컨테이너 내부 동작
docker container exec local-registry 명령을 통해 local-registry 컨테이너 내부로 진입
ls –l /certs 명령을 통해 local-registry 컨테이너 내부에서 /certs 디렉터리의 파일 목록을 상세 정보와 함께 확인

# local-registry 컨테이너 내부 동작
docker container exec local-registry env 명령을 통해 명령을 통해
local-registry 컨테이너 내부에 진입하여 환경 변수 출력

# hello-world 이미지 다운로드
docker image pull hello-world 명령을 통해 Docker Hub에서 hello-world 이미지 다운로드

docker image ls 명령을 통해 이미지가 잘 다운로드되었는지 확인

cat /etc/hosts 명령을 통해 /etc/hosts 파일의 내용 확인

# 이미지에 새 이름과 새 태그 부여
docker image tag hello-world myregistry.com/hello-world 명령을 통해
hello-world 이미지에 myregistry.com/hello-world라는 새 이름과 새 태그 부여
docker image ls 명령을 통해 이미지에 새로운 이름과 태그가 잘 부여되었는지 확인

# 이미지 다운로드
docker image push myregistry.com/hello-world:latest 명령을 통해 로컬 이미지인
myregistry.com/hello-world:latest를 레지스트리로 push

tree /root/upload-img-1/ 옵션을 통해 컨테이너 내부에서
/root/upload-img-1/ 컨테이너의 디렉터리와 파일 목록을 트리 구조로 확인

# hello-world:latest, myregistry.com/hello-world:latest 이미지 삭제
docker image rm hello-world:latest myregistry.com/hello-world:latest 명령을 통해
hello-world 이미지와 myreigstry.com/hello-world 이미지 삭제
docker image ls 명령을 통해 이미지들이 잘 삭제되었는지 확인

# test2 컨테이너 생성 및 실행
docker container run --name test2 myregistry.com/hello-world 명령을 통해
myregistry.com/hello-world 이미지 사용하여 test2 컨테이너 생성 및 실행
cls 명령을 통해 컨테이너가 잘 생성되었는지 확인
docker image ls 명령을 통해 myregistry.com/hello-world 이미지가 다시 다운로드 된 것을 확인

scp –r /etc/docker/certs.d 192.168.2.10:/etc/docker 명령을 통해 /etc/docker/certs.d 디렉터리에 있는
파일들을 안전하고 재귀적으로 192.168.2.10 (docker1) /etc/docker로 복사

ls –l /etc/docker 명령을 통해 /etc/docker가 docker2에서 docker1로 잘 복사되었는지 확인
ls -l /etc/docker/certs.d/ 명령을 통해 /etc/docker/certs.d가 docker2에서 docker1로 잘 복사되었는지 확인
ls -l /etc/docker/certs.d/myregistry.com/ 명령을 통해 /etc/docker/certs.d/myregistry.com이
docker2에서 docker1로 잘 복사되었는지 확인

# test3 컨테이너 생성 및 실행
docker container run --name test3 myregistry.com/hello-world 명령을 통해
myregistry.com/hello-world 이미지 사용하여 test3 컨테이너 생성 및 실행
docker image ls 명령을 통해 컨테이너를 생성할 때 사용한 이미지가 잘 다운로드 되었는지 확인
docker container ls –a 명령을 통해 컨테이너가 잘 생성되었는지 확인

# 컨테이너 삭제
crm 명령을 통해 생성된 컨테이너 삭제
# 이미지 삭제
irm 명령을 통해 생성된 이미지 삭제
docker container ls –a 명령을 통해 컨테이너가 잘 삭제되었는지 확인
docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인

# 컨테이너 삭제
crm 명령을 통해 생성된 컨테이너 삭제
# 이미지 삭제
irm 명령을 통해 생성된 이미지 삭제
docker container ls –a 명령을 통해 컨테이너가 잘 삭제되었는지 확인
docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인
Ⅴ. SSL 통신과 Authentication 기능을 이용하는 로컬 레지스트리 구축
| SSL 통신과 Authentication 기능을 이용한 로컬 레지스트리 구축 |
구분 | 설명 | ||
| 목적 | 레지스트리와 클라이언트 간 통신을 HTTPS로 암호화 (SSL / TLS) | |||
| 인증 (Authentication)으로 접근 제어를 적용하여 운영환경에서 안전하게 이미지 저장 및 배포 | ||||
| 주요 요구사항 | TLS (인증서) | |||
| 인증 (사용자 / 토큰 / 외부 ID 연동) | ||||
| 접근 통제 | ||||
| 안정적 스토리지 | ||||
| 감사 및 로깅 | ||||
| 인증서 및 자격관리 정책 | ||||
| 적합 환경 | 사내 운영 환경 | |||
| 보안 규제가 있는 서비스 | ||||
| 외부 네트워크와 연결되는 레지스트리 | ||||
| 핵심 구성 요소 | 구성 요소 | 설명 | ||
| Registry 서비스 | registry 프로세스 (컨테이너 / 바이너) | |||
| 이미지 업로드 / 다운로드 / 메타 데이터 관리 | ||||
| TLS 인증서 (.crt / .key) | HTTPS 통신을 위한 서버 인증서 및 개인키 (사내 CA 또는 공인 CA) | |||
| 인증 (Identity) 백엔드 | 사용자 인증 방식 - htpasswd (기본), 토큰 서비스 (권장), LDAP / AD, OAuth / OpenID Connect 등 |
|||
| Reverse Proxy | nginx / HAProxy 앞단에서 TLS, 인증, 로깅, 리밸런싱 처리 가능 (운영 권장) |
|||
| 스토리지 백엔드 | 레지스트리 저장소 (로컬 FS, NFS, S3 호환 오브젝트 스토리지 등) | |||
| 클라이언트 설정 | Docker 클라이언트에서 CA 신뢰 설정 회피 | |||
| 로그인 (docker login), insecure 설정 회피 | ||||
| 감사 및 모니터링 | 접근 로그 | |||
| 인증 로그 | ||||
| 용량 모니터링 | ||||
| 보안 스캔 연동 | ||||
| TLS 인증서 종류 및 선택 기준 |
종류 | 사용 권장 여부 | 비고 | |
| 공인 CA 인증서 | 권장 (운영) | 신뢰체인 자동 인식 | ||
| 클라이언트 추가 설정 불필요 | ||||
| 사내 CA / 자체 서명 | 내부망 및 테스트용 허용 | 클라이언트에 루트 CA 배포 필요 (관리 부담) |
||
| Let's Encrypt | 가능 (도메인 공개 시) | 자동 갱신 편리 | ||
| 외부 접근 시 적합 | ||||
| 구성 아키텍처 | 클라이언트 -> HTTPS 연결 -> Reverse Proxy (TLS 종료, 인증 / 로그 / 리밸런싱) -> 내부 Registry -> 스토리지 |
|||
| 인증 방식 | Reverse Proxy 또는 Registry 레이어에서 인증 (ex. 토큰 발급 엔드포인트 연동) |
|||
| 권한 검증 (스코프) | Push / Pull 권한을 토큰 스코프로 제한 | |||
| 보안 및 운영 체크 리스트 |
항목 | 권장 액션 | ||
| TLS 적용 | 공인 / 사내 CA로 TLS 적용 | |||
| 키 파일 권한 엄격 설정 | ||||
| 인증 적용 | htpasswd는 소규모 | |||
| 운영은 Token / LDAP / OIDC 권장 | ||||
| 최소 권한 원칙 | 계정별 최소 권한 (읽기 / 쓰기 구분) 적용 | |||
| 로그 및 감사 | 접근 로그 및 인증 로그 보관 (보안 사고 조사용) | |||
| 이미지 스캔 | 레지스트리로 푸시 전 이미지 스캔 (취약점 검사) 연동 | |||
| 네트워크 분리 | 관리 네트워크 및 방화벽으로 접근 제어 | |||
| 인증서 갱신 정책 | 자동 갱신 (ex. ACME) 또는 만료 모니터링 및 사전 교체 | |||
| 비밀 관리 | 키 및 비밀번호는 Vault 등 비밀관리 시스템에 보관 | |||
| 백업 및 복구 | 스토리지 백업 정책 (오브젝트 백업, 스냅샷) 마련 | |||
| 모니터링 및 알람 | 스토리지 용량 / 에러 / 인증 실패 알람 설정 | |||
● 인증 방식별 특성 비교
| 방식 | 특징 | 장점 | 단점 및 주의 |
| htpasswd (Basic Auth) |
레지스트리 자체에서 사용자 / 비밀번호 확인 | 구현 단순 | 비밀번호 관리 및 회전 번거로움 |
| 소규모에 적합 | 기본 인증이라 토큰보단 덜 권장 | ||
| Token 인증 (Bearer) |
별도의 토큰 발급 서비스로 인증 / 권한 관리 | 권한 세분화 (스코프) | 토큰 서비스 추가 구성 필요 (권장 방식) |
| 보안성 향상 | |||
| 세션 제어 가능 | |||
| LPAP / AD 연동 | 회사 디렉터리 연동 (SSO와 통합 가능) |
중앙 계정 관리 | 설정 복잡 |
| 권한 일관성 유지 | TLS 및 인증 흐름 설계 필요 | ||
| OAuth / OIDC | 외부 IdP 연동 (Keycloak, Auth0 등) |
SSO, MFA 등 현대적 인증 가능 |
구성 복잡도 증가 |
| 토큰 관리 필요 |

htpasswd —help 명령을 통해 htpasswd 명령어의 옵션 확인

# 컨테이너 생성 및 실행
docker container run httpd:2.4 명령을 통해 HTTPD:2..4 이미지 사용하여 컨테이너 생성 및 실행
--rm 옵션을 통해 실행이 종료되면 컨테이너가 자동으로 삭제되도록 설정
-entrypoint htpasswd 옵션을 통해 컨테이너의 기본 실행 명령어인 CMD를 무시하고 htpasswd를 실행 명령어로
지정하여 httpd 이미지에 포함된 htpasswd 도구 직접 사용 가능하도록 설정
-B 옵션을 통해 비밀번호를 bcrypt 알고리즘으로 암호화
-b 옵션을 통해 명령줄에서 바로 사용자 이름과 비밀번호 지정
-n 옵션을 통해 파일에 쓰지 않고 표준 출력으로 결과만 확인
tester 옵션을 통해 생성할 사용자 이름 지정
abcd1234 옵션을 통해 사용자의 비밀번호 지정
/auth/htpasswd 옵션을 통해 생성된 인증 정보를 저장할 파일의 경로 설정
ls –l 명령을 통해 /auth 디렉터리에 파일이 잘 생성되었는지 확인

cat htpasswd 명령을 통해 htpasswd 파일의 내용 확인

# local-registry 컨테이너 생성 및 실행
docker container run --name local-registry registry 명령을 통해
Registry 이미지 사용하여 local-registry 컨테이너 생성 및 실행
-d 옵션을 통해 local-registry 컨테이너를 백그라운드로 구동
-p 443:443 옵션을 통해 호스트의 443번 포트와 컨테이너의 443번 포트 매핑
--restart=always 옵션을 통해 컨테이너가 종료되면 항상 자동으로 다시 시작하도록 설정
-v /auth:/certs 옵션을 통해 호스트 시스템에 이전에 생성한 SSL/TLS 인증서 파일이 들어있는 /auth 디렉터리를
컨테이너 내부의 /certs 디렉터리에 연결하여 컨테이너가 인증서 파일에 접근할 수 있도록 설정
-v /root/upload-img-2:/var/lib/registry 옵션을 통해 호스트의 /root/upload-img-2 디렉터리를
컨테이너 내부의 /var/lib/registry 디렉터리에 마운트 시킴
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myregistry.com.crt 옵션을 통해 인증서 파일의
컨테이너 내부 경로를 REGISTRY_HTTP_TLS_CERTIFICATE 환경 변수에 설정
-e REGISTRY_HTTP_TLS_KEY=/certs/myregistry.com.key 옵션을 통해 개인키 파일의 컨테이너 내부 경로를
REGISTRY_HTTP_TLS_KEY 환경 변수에 설정
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 옵션을 통해 레지스트리가 443번 포트에서 요청 받도록 설정
-e REGISTRY_AUTH=htpasswd 옵션을 통해 REGISTRY_AUTH 환경 변수를 htpasswd로 설정하여
비밀번호 파일을 통해 사용자를 인증하도록 사용자 인증 방식 지정
-e REGISTRY_AUTH_HTPASSWD_REALM="Please enter your Username and Password." 옵션을 통해
REGISTRY_AUTH_HTPASSWD_REALM 환경 변수를 설정하여, 인증 창에 표시될 메시지 지정
cls 명령을 통해 컨테이너가 잘 생성되었는지 확인

# local-registry 컨테이너 내부 동작
docker container exec local-registry ls –l /certs 명령을 통해
local-registry 컨테이너 내에서 /certs 디렉터리 내 파일 목록 확인

# local-registry 컨테이너 내부 동작
docker container exec local-registry ls –l /certs 명령을 통해 실행 중인
local-registry 컨테이너 내에서 /certs 디렉터리 내 파일 목록 확인

# hello-world 이미지 다운로드
docker image pull hello-world 명령을 통해 Docker Hub에서 hello-world 이미지 다운로드
docker image ls 명령을 통해 이미지가 잘 다운로드되었는지 확인

# 이미지에 새로운 이름과 태그 부여
docker image tag hello-world myregistry.com/hello-world 명령을 통해 hello-world 이미지에
myregistry.com/hello-world라는 새로운 이름과 태그 부여
docker image ls 명령을 통해 이미지에 새로운 이름과 태그가 잘 부여되었는지 확인
# 새로운 이미지 업로드
docker image push myregistry.com/hello-world:latest 명령을 통해
myregistry.com/hello-world:latest를 레지스트리로 push

tree /root/upload-img-2 명령을 통해 /root/upload-img-2 에 있는 디렉터리와 파일들을 트리 구조로 확인

docker login myregistry.com 명령을 통해 myregistry.com에 로그인
# 이미지 업로드
docker image push myregistry.com/hello-world:latest 명령을 통해
myregistry.com/hello-world:latest를 레지스트리로 업로드

tree /root/upload-img-2 명령을 통해 /root/upload-img-2 에 있는 디렉터리와 파일들을 트리 구조로 확인

# hello-world:latest, myregistry.com/hello-world:latest 이미지 삭제
docker image rm hello-world:latest myregistry.com/hello-world:latest 명령을 통해
hello-world와 myregistry.com/hello-world 이미지 삭제
docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인

# test4 컨테이너 생성 및 실행
docker container run —name test4 myregistry.com/hello-world 명령을 통해
myregistry.com/hello-world 이미지 사용하여 test4 컨테이너 생성 및 실행
docker container ls –a 명령을 통해 컨테이너가 잘 생성되었는지 확인
docker image ls 명령을 통해 컨테이너를 생성할 때 사용한 이미지가 다운로드 된 것 확인

docker1에서 docker login myregistry.com 명령을 통해 myregistry.com에 로그인

# test5 컨테이너 생성 및 실행
docker container run —name test5 myregistry.com/hello-world 명령을 통해
myregistry.com/hello-world 이미지 사용하여 test5 컨테이너 생성 및 실행

docker container ls –l 명령을 통해 컨테이너가 잘 생성되었는지 확인
docker image ls 명령을 통해 컨테이너를 생성할 때 사용한 이미지가 다운로드 된 것 확인

# 컨테이너 삭제
crm 명령을 통해 생성된 컨테이너 삭제
# 이미지 삭제
irm 명령을 통해 생성된 이미지 삭제
docker container ls –l 명령을 통해 컨테이너가 잘 삭제되었는지 확인
docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인
docker logout myregistry 명령을 통해 myregistry에서 로그아웃

# 컨테이너 삭제
crm 명령을 통해 생성된 컨테이너 삭제
# 이미지 삭제
irm 명령을 통해 생성된 이미지 삭제
docker container ls –l 명령을 통해 컨테이너가 잘 삭제되었는지 확인
docker image ls 명령을 통해 이미지가 잘 삭제되었는지 확인
docker logout myregistry.com 명령을 통해 myregistry.com에서 로그아웃
docker system prune 명령을 통해 모두 삭제
'Docker' 카테고리의 다른 글
| Docker 명령어 (0) | 2026.06.13 |
|---|---|
| Dockerfille 명령어 이해 (0) | 2026.06.12 |
| Docker 파일 이미지 빌드 (0) | 2026.06.12 |
| Docker 이미지 생성 (0) | 2026.06.12 |
| Docker 리소스 제한 및 모니터링 (0) | 2026.06.12 |