0. 들어가며
지금까지 우리는 로컬에서 도커 이미지를 만들고, 컨테이너를 실행하는 방법을 배웠다. 하지만 실제 개발에서는 다음과 같은 상황이 발생한다.
- 팀원들과 이미지를 공유해야 한다.
- CI/CD 파이프라인에서 이미지를 사용해야 한다.
- 운영 서버에 이미지를 배포해야 한다.
이때 필요한 것이 이미지 저장소(Registry) 다. 가장 대표적인 이미지 저장소가 Docker Hub다.
이번 포스팅에서는 Docker Hub를 활용하여 이미지를 공유하고 배포하는 방법을 알아보겠다.
1. Docker Hub란?
1.1. 정의
Docker Hub는 도커 이미지를 저장하고 공유하는 클라우드 기반 레지스트리 서비스다.
- GitHub가 코드 저장소라면, Docker Hub는 이미지 저장소다.
- 공개(public) 저장소는 무료로 사용할 수 있다.
- 비공개(private) 저장소는 유료 플랜이 필요하다.
1.2. 주요 기능
- 이미지 저장: 빌드한 이미지를 업로드(push)하여 보관
- 이미지 공유: 다른 사람이 이미지를 다운로드(pull)하여 사용
- 공식 이미지: nginx, mysql, ubuntu 등 공식 이미지 제공
- 자동 빌드: GitHub와 연동하여 자동으로 이미지 빌드
2. Docker Hub 가입 및 로그인
2.1. 회원가입
- Docker Hub 접속
- Sign Up 버튼 클릭
- username, email, password 입력 후 가입
2.2. CLI에서 로그인
# Docker Hub 로그인
docker login
# Username: 입력
# Password: 입력
Login Succeeded
2.3. 로그아웃
docker logout
3. 이미지 태깅(Tagging)
3.1. 태그의 개념
도커 이미지에는 태그(Tag) 를 붙일 수 있다. 보통 버전 정보를 태그로 사용한다.
- nginx:latest - 최신 버전
- nginx:1.21 - 1.21 버전
- nginx:1.21.3 - 1.21.3 특정 버전
3.2. 태그 규칙
Docker Hub에 이미지를 push하려면 다음과 같은 형식의 태그가 필요하다.
<docker-hub-username>/<repository-name>:<tag>
예시:
- john/app:1.0.0
- john/app:latest
- john/web-server:v2
3.3. 태그 추가하기
# 기존 이미지에 태그 추가
docker tag spring-app:1.0 john/spring-app:1.0
docker tag spring-app:1.0 john/spring-app:latest
# 확인
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
spring-app 1.0 abc123def456 2 hours ago 350MB
john/spring-app 1.0 abc123def456 2 hours ago 350MB
john/spring-app latest abc123def456 2 hours ago 350MB
4. 이미지 Push (업로드)
4.1. 기본 Push
# Docker Hub에 이미지 업로드
docker push john/spring-app:1.0
docker push john/spring-app:latest
4.2. 진행 상황 확인
The push refers to repository [docker.io/john/spring-app]
d8a33133e477: Pushed
c625c62f7a91: Pushed
1.0: digest: sha256:abc123... size: 1570
각 레이어가 순서대로 업로드된다.
4.3. 여러 태그 한 번에 Push
# 태그 여러 개 추가 후
docker tag spring-app:1.0 john/spring-app:1.0
docker tag spring-app:1.0 john/spring-app:1.0.0
docker tag spring-app:1.0 john/spring-app:latest
# 각각 push
docker push john/spring-app --all-tags
# 또는
docker push john/spring-app -a
5. 이미지 Pull (다운로드)
5.1. 기본 Pull
# 내 이미지 다운로드
docker pull john/spring-app:1.0
# 공식 이미지 다운로드
docker pull nginx:latest
docker pull mysql:8.0
5.2. Pull 받은 이미지 실행
# 다운로드한 이미지로 컨테이너 실행
docker run -d -p 8080:8080 john/spring-app:1.0
6. 실제 실습: Spring Boot 이미지 배포하기
6.1. 애플리케이션 준비
간단한 Spring Boot 애플리케이션을 만들었다고 가정하자.
// DemoApplication.java
@SpringBootApplication
@RestController
public class DemoApplication {
@GetMapping("/")
public String home() {
return "Hello from Docker Hub!";
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
6.2. Dockerfile 작성
FROM openjdk:17-jdk-slim
COPY target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
6.3. 이미지 빌드
# 애플리케이션 빌드 (Maven)
./mvnw clean package
# 도커 이미지 빌드
docker build -t demo-app:1.0 .
6.4. 태그 추가 및 Push
# Docker Hub 사용자명으로 태그 추가
docker tag demo-app:1.0 john/demo-app:1.0
docker tag demo-app:1.0 john/demo-app:latest
# Push
docker push john/demo-app:1.0
docker push john/demo-app:latest
6.5. Docker Hub에서 확인
브라우저에서 Docker Hub 저장소 페이지에 접속하면 업로드된 이미지를 확인할 수 있다.
https://hub.docker.com/r/john/demo-app
7. Private 저장소 사용하기
7.1. Private 저장소 생성
- Docker Hub에서 "Create Repository" 클릭
- 이름 입력
- Private 선택
- Create 버튼 클릭
7.2. Private 이미지 Push
# 태그 추가
docker tag demo-app:1.0 john/private-app:1.0
# Push (로그인된 상태여야 함)
docker push john/private-app:1.0
7.3. Private 이미지 Pull
다른 서버에서 private 이미지를 pull하려면 먼저 로그인이 필요하다.
# 로그인
docker login
# Pull
docker pull john/private-app:1.0
8. GitHub Actions와 연동한 자동 빌드
8.1. GitHub 저장소 준비
프로젝트를 GitHub에 push한다.
my-spring-app/
├── .github/
│ └── workflows/
│ └── docker-build.yml
├── src/
├── pom.xml
├── Dockerfile
└── README.md
8.2. GitHub Actions 워크플로우 작성
.github/workflows/docker-build.yml
name: Build and Push Docker Image
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Maven
run: mvn clean package
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: .
push: true
tags: |
${{ secrets.DOCKER_USERNAME }}/myapp:latest
${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}
8.3. Secrets 설정
GitHub 저장소에서 Secrets에 Docker Hub 인증 정보를 등록한다.
- Settings → Secrets and variables → Actions
- New repository secret
- DOCKER_USERNAME: Docker Hub 사용자명
- DOCKER_PASSWORD: Docker Hub 비밀번호 (또는 Access Token)
9. 이미지 내부 파일 확인하기
때로는 이미지 내부의 설정 파일을 확인해야 할 때가 있다. 예를 들어, 배포된 이미지의 application.yml을 확인해보자.
9.1. 이미지 다운로드
docker pull h6bro/test-app:bc6e847
9.2. 임시 컨테이너로 파일 확인
# 컨테이너 실행 없이 이미지 내부 확인
docker run --rm -it --entrypoint /bin/sh h6bro/test-app:bc6e847
# 컨테이너 내부에서
ls -l
# app.jar 파일 확인
# jar 파일 내부 구조 확인
jar -tf app.jar | grep application.yml
# BOOT-INF/classes/application.yml
# 파일 추출 및 확인
jar -xf app.jar BOOT-INF/classes/application.yml
cat BOOT-INF/classes/application.yml
# 컨테이너 종료 (--rm 옵션으로 자동 삭제)
exit
9.3. 결과 예시
spring:
application:
name: k8s-test
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://${DB_HOST}/${MYSQL_DATABASE}?useSSL=false
username: ${MYSQL_USERNAME}
password: ${MYSQL_PASSWORD}
환경 변수로 설정된 값들을 확인할 수 있다.
10. Docker Hub 유용한 팁
10.1. Official 이미지 활용
가능하면 공식 이미지를 베이스로 사용하자.
- nginx:alpine - 알파인 리눅스 기반 (크기 작음)
- node:18-slim - 슬림 버전
- python:3.9-slim - 슬림 버전
10.2. 이미지 크기 줄이기
# ❌ 비효율적
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install -y python3
RUN apt-get install -y python3-pip
# ✅ 효율적 (알파인 사용, 레이어 통합)
FROM python:3.9-alpine
RUN apk add --no-cache gcc musl-dev
10.3. 태그 관리 전략
- latest: 가장 최신 안정 버전
- 1.0.0: 특정 버전 (semver)
- 1.0: 마이너 버전 최신
- sha-abc123: Git 커밋 해시 (개발 버전)
10.4. 이미지 스캔 (보안)
# Docker Scout로 취약점 스캔
docker scout quickview john/myapp:latest
11. 명령어 요약
| 명령어 | 설명 |
| docker login | Docker Hub 로그인 |
| docker logout | 로그아웃 |
| docker tag 원본:태그 새이름:태그 | 이미지에 태그 추가 |
| docker push 사용자명/저장소:태그 | 이미지 업로드 |
| docker pull 사용자명/저장소:태그 | 이미지 다운로드 |
| docker search 키워드 | 이미지 검색 |
| docker scout quickview 이미지 | 보안 취약점 스캔 |
12. 마치며
이번 포스팅에서는 Docker Hub를 활용한 이미지 배포와 공유 방법을 알아보았다.
- Docker Hub는 이미지 저장소 역할을 한다.
- docker tag로 이미지에 적절한 이름을 붙이고,
- docker push로 업로드하고,
- docker pull로 다운로드받아 사용한다.
- Private 저장소는 인증된 사용자만 접근 가능하다.
- CI/CD 파이프라인과 연동하여 자동 빌드/배포가 가능하다.
이제 여러분은 도커 이미지를 만들어 전 세계 어디서든 사용할 수 있게 되었다.
'Docker' 카테고리의 다른 글
| [PROJECT #1] N-Tier 애플리케이션 도커로 구성하기 (Web + App + DB) (0) | 2025.06.01 |
|---|---|
| [ADVANCED #1] 여러 컨테이너 한 번에 관리하기: Docker Compose (0) | 2025.06.01 |
| [BASIC #6] 컨테이너 간 통신: Docker Network 이해하기 (0) | 2025.06.01 |
| [BASIC #5] 데이터를 영구적으로 저장하는 법: Docker Volume (0) | 2025.05.31 |
| [BASIC #4] 나만의 이미지 만들기: Dockerfile 완전 정복 (0) | 2025.05.31 |
