IT기술/도커 (docker)

Docker Hub 완벽 가이드: 이미지 관리와 배포의 중심 플랫폼

후스파 2025. 7. 14. 00:43
반응형

도커 생태계에서 도커 허브는 매우 중요한 역할을 합니다. 이 블로그 포스트에서는 도커 허브의 개념과 사용 방법, 그리고 스스로 이미지를 업로드해서 관리하는 방법에 대해 자세히 설명하겠습니다.


도커 허브란?

정의: 도커 허브는 도커 이미지의 공식 레지스트리로, 일반적으로 도커 허브 레지스트리가 구성되지 않은 경우 이곳에서 이미지를 다운로드 받습니다.
기능: 사용자가 직접 만든 이미지를 도커 허브에 업로드할 수 있으며 비공식적으로 비공개 레포지토리를 생성하여 사용할 수도 있습니다.

도커 허브의 주요 특징

  • 세계 최대의 컨테이너 이미지 라이브러리: 수백만 개의 공개 이미지 제공
  • 공식 이미지: Docker에서 인증한 고품질 이미지 제공
  • 자동 빌드: GitHub, Bitbucket과 연동하여 자동 이미지 빌드
  • 웹훅: 이미지 업데이트 시 자동 알림 기능
  • 팀 협업: 조직 단위의 이미지 관리 및 접근 권한 제어

도커 레지스트리

정의: 도커 레지스트리는 이미지를 배포하는 장소를 의미합니다.
도커 허브: 도커 제작사에서 운영하며, 대부분의 오픈소스 소프트웨어는 도커 허브에 참여하여 이미지를 배포합니다. 사용자는 run 커맨드를 통해 이미지를 다운로드 받을 수 있습니다.
운영: 다양한 도커 레지스트리가 전 세계에서 운영되며, 외부에 공개되지 않은 레지스트리는 일반적으로 접근이 불가능합니다.

주요 레지스트리 서비스

Docker HubDocker Inc.무료 공개 저장소, 제한된 비공개 저장소
Amazon ECRAWSAWS 통합, 고성능, 보안 강화
Google Container RegistryGoogle CloudGCP 통합, 자동 취약점 스캔
Azure Container RegistryMicrosoft AzureAzure 통합, 지역별 복제
GitHub Container RegistryGitHubGitHub 통합, 패키지와 함께 관리
HarborCNCF오픈소스, 엔터프라이즈급 기능

레지스트리와 리포지토리

레지스트리: 이미지를 배포하는 장소이며 회사나 부서 단위로 그룹화가 가능합니다.
리포지토리: 소프트웨어 단위로 구성되며, 도커 허브에서는 각 리포지토리에 고유한 ID가 부여됩니다. 예를 들어, 홈페이지 ver2 및 고객관리시스템 ver5 등이 있습니다.

계층 구조 예시

Registry (레지스트리)
├── Organization (조직)
│   ├── Repository 1 (리포지토리)
│   │   ├── Tag: latest
│   │   ├── Tag: v1.0
│   │   └── Tag: v1.1
│   └── Repository 2
│       ├── Tag: latest
│       └── Tag: dev
└── Personal Account (개인 계정)
    └── Repository 3
        ├── Tag: latest
        └── Tag: experimental

이미지 이름과 태그

비공개 레지스트리

주소 형식은 레지스트리 주소/레포지토리명:버전입니다. 예를 들어, localhost:5000/sample:0.1와 같은 형식을 따릅니다.

도커 허브 태그

형식은 도커허브ID/레포지토리명:버전으로, 예를 들어 sampleID/sample:0.1입니다. 버전은 생략 가능하지만, 향후를 위해서 가능한 붙여두는 게 좋습니다.

태그 네이밍 컨벤션

# 기본 형식
username/repository:tag

# 실제 예시들
mycompany/webapp:latest          # 최신 버전
mycompany/webapp:v1.2.3          # 시맨틱 버전
mycompany/webapp:dev             # 개발 버전
mycompany/webapp:prod            # 프로덕션 버전
mycompany/webapp:feature-auth    # 기능별 브랜치
mycompany/webapp:20250704        # 날짜 기반

이미지 태그 부여 및 복사

복제: 기존 이미지에 새로운 이름과 태그를 부여하여 복제할 수 있습니다. 복제된 이미지는 원본 이미지의 IMAGE ID는 같지만 서로 다른 이미지로 취급됩니다. 예시로는 아래와 같은 명령어가 있습니다:

# 기본 태그 명령어
docker tag httpd localhost/httpd:0.1

# 이미지 목록 확인
docker image ls

출력 결과:

REPOSITORY                      TAG       IMAGE ID       CREATED        SIZE
apache_ex040                    latest    9f63e4e41f72   9 days ago     178MB
ollama/ollama                   latest    0e59655207b2   6 months ago   536MB
httpd                           latest    062dcbdad052   6 months ago   178MB
localhost/httpd                 0.1       062dcbdad052   6 months ago   178MB
ghcr.io/open-webui/open-webui   main      5a6b5ae70d1e   6 months ago   3.12GB

다양한 태그 부여 예시

# 여러 태그 동시 부여
docker tag myapp:latest myregistry.com/myapp:v1.0
docker tag myapp:latest myregistry.com/myapp:stable
docker tag myapp:latest myregistry.com/myapp:production

# Docker Hub용 태그
docker tag myapp:latest username/myapp:latest
docker tag myapp:latest username/myapp:v1.0

# 조직용 태그
docker tag myapp:latest myorg/myapp:latest
docker tag myapp:latest myorg/myapp:release-candidate

이미지 업로드

업로드 명령어: 레지스트리 주소와 리포지토리명, 버전을 포함하는 다양한 식별 정보를 통해 업로드할 레지스트리를 결정합니다.

# 기본 업로드 명령어
docker push sampleadress111.com/sample:0.1

# Docker Hub 업로드
docker push username/myapp:latest

# 비공개 레지스트리 업로드
docker push myregistry.com:5000/myapp:v1.0

업로드 전 준비사항

# 1. Docker Hub 로그인
docker login

# 2. 비공개 레지스트리 로그인
docker login myregistry.com:5000

# 3. 이미지 태그 확인
docker images | grep myapp

# 4. 이미지 업로드
docker push username/myapp:latest

# 5. 업로드 진행 상황 확인
# Pushing 과정이 레이어별로 표시됨

업로드 최적화

# 멀티 태그 동시 업로드
docker push username/myapp --all-tags

# 압축 최적화
docker image save myapp:latest | gzip > myapp.tar.gz

# 레이어 캐시 활용을 위한 Dockerfile 최적화
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./    # 의존성 먼저 복사
RUN npm ci --only=production
COPY . .                 # 소스코드는 나중에 복사
CMD ["npm", "start"]

비공개 레지스트리 생성

설치: 레지스트리용 컨테이너를 사용하여 비공식 레지스트리를 간편하게 만들 수 있습니다. 기본 포트는 5000번이지만 이미 사용 중일 경우 다른 포트를 지정할 수 있습니다.

# 기본 레지스트리 실행
docker run -d -p 5005:5000 registry

실행 결과:

Unable to find image 'registry:latest' locally
latest: Pulling from library/registry
f6b431426dd5: Pull complete 
0726ca172d8b: Pull complete 
66b7b7187cb3: Pull complete 
f14fe80572ad: Pull complete 
aa909d974276: Pull complete 
Digest: sha256:319881be2ee9e345d5837d15842a04268de6a139e23be42654fc7664fc6eaf52
Status: Downloaded newer image for registry:latest

고급 비공개 레지스트리 설정

# 볼륨과 함께 레지스트리 실행 (데이터 영속성)
docker run -d \
  -p 5000:5000 \
  --name registry \
  -v registry-data:/var/lib/registry \
  registry:2

# SSL 인증서와 함께 보안 레지스트리
docker run -d \
  -p 5000:5000 \
  --name secure-registry \
  -v /path/to/certs:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  registry:2

# 인증이 포함된 레지스트리
docker run -d \
  -p 5000:5000 \
  --name auth-registry \
  -v /path/to/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  registry:2

레지스트리 관리 명령어

# 레지스트리 API를 통한 이미지 목록 확인
curl -X GET http://localhost:5000/v2/_catalog

# 특정 이미지의 태그 목록 확인
curl -X GET http://localhost:5000/v2/myapp/tags/list

# 레지스트리 상태 확인
curl -X GET http://localhost:5000/v2/

# 이미지 삭제 (DELETE API 활성화 필요)
curl -X DELETE http://localhost:5000/v2/myapp/manifests/sha256:...

도커 허브 사용법

가입: 이메일 주소만 있으면 누구나 도커 허브를 사용할 수 있습니다. 무료 플랜을 통해 먼저 사용해볼 수 있습니다.
공유 옵션: 도커 허브에 이미지를 업로드하면 전 세계 사람들과 이미지를 공유할 수 있으며, 비공개 설정도 가능합니다. push 커맨드로 리포지토리를 생성하면 자동으로 공개 설정됩니다.
접속 URL: https://hub.docker.com/

Docker Hub 계정 관리

# Docker Hub 로그인
docker login
# Username과 Password 입력

# 특정 레지스트리 로그인
docker login myregistry.com

# 로그아웃
docker logout

# 로그인 정보 확인
cat ~/.docker/config.json

Docker Hub 요금제 (2025년 기준)

Free$0/월1개무제한2시간/월
Pro$5/월무제한무제한5시간/월
Team$25/월무제한5명15시간/월
Business$105/월무제한무제한60시간/월

실무 활용 예시

# 1. 개발 환경 이미지 생성
docker build -t mycompany/webapp:dev .

# 2. 테스트 후 프로덕션 태그 추가
docker tag mycompany/webapp:dev mycompany/webapp:v1.0
docker tag mycompany/webapp:dev mycompany/webapp:latest

# 3. Docker Hub에 업로드
docker push mycompany/webapp:v1.0
docker push mycompany/webapp:latest

# 4. 다른 환경에서 배포
docker pull mycompany/webapp:v1.0
docker run -d -p 80:3000 mycompany/webapp:v1.0

# 5. 자동 빌드 설정 (GitHub 연동)
# Docker Hub 웹사이트에서 GitHub 저장소 연결
# Dockerfile이 있는 저장소의 변경사항 자동 감지하여 빌드

결론

도커 허브는 도커 이미지를 관리하고 배포하는 데 매우 유용한 도구입니다. 간단한 명령어로 이미지를 등록하고 관리할 수 있으며, 이를 통해 다양한 개발 및 배포 환경에서 효율성을 높일 수 있습니다.
핵심 포인트:

  • Docker Hub를 활용한 중앙집중식 이미지 관리
  • 태그 전략을 통한 체계적인 버전 관리
  • 비공개 레지스트리 구축으로 보안 강화
  • 자동 빌드와 CI/CD 파이프라인 통합
  • 팀 협업을 위한 조직 단위 이미지 관리

Docker Hub를 마스터하면 컨테이너 기반 개발 워크플로우를 크게 개선할 수 있으며, 전 세계 개발자들과 이미지를 공유하거나 조직 내에서 안전하게 이미지를 관리할 수 있습니다.

반응형