Docker Hub
Docker Hub란?
Docker에서 운영하는 세계 최대의 클라우드 기반 컨테이너 이미지 저장소(Registry)
1. 핵심 기능
- 이미지 리포지토리 (Repositories): Docker 이미지를 업로드(Push)하고 다운로드(Pull)할 수 있는 공간입니다. 누구나 볼 수 있는 Public(공개) 저장소와 나 또는 지정된 팀원만 볼 수 있는 Private(비공개) 저장소를 제공합니다.
- 공식 이미지 제공 (Official Images): Ubuntu, CentOS 같은 OS부터 Python, Node.js, MySQL, Nginx 등 전 세계적으로 많이 쓰이는 오픈소스 소프트웨어의 공인된 오피셜 이미지를 제공합니다. Docker 측에서 보안과 최적화를 검증하기 때문에 안심하고 베이스 이미지로 사용할 수 있습니다.
- 자동 빌드 (Automated Builds): GitHub이나 Bitbucket 같은 소스코드 저장소와 연동하여, 코드가 업데이트(Push)되면 Docker Hub가 이를 감지하고 자동으로 새로운 Docker 이미지를 빌드하도록 설정할 수 있습니다.
- 팀 및 조직 관리 (Teams & Organizations): 회사나 프로젝트 단위로 조직을 만들고, 팀원별로 이미지 접근 권한을 세부적으로 관리할 수 있습니다.
2. Docker Hub가 중요한 이유
- 생산성 향상: 개발 환경을 매번 처음부터 세팅할 필요 없이, docker pull 명령어 한 줄로 필요한 환경(예: Python + Flask + SQLite)이 완벽하게 세팅된 이미지를 몇 초 만에 내려받을 수 있습니다.
- 어디서나 동일한 환경: 로컬 PC에서 빌드한 이미지를 Docker Hub에 올리면, 클라우드 서버(AWS, GCP 등)나 다른 팀원의 PC에서도 완전히 동일한 환경으로 실행할 수 있습니다.
3. 기본 사용 흐름
Docker Hub를 사용하는 과정은 대개 다음과 같은 간단한 흐름으로 진행됩니다.
[로컬 PC에서 이미지 빌드]
│
▼ (docker login)
[Docker Hub 계정 인증]
│
▼ (docker push)
[Docker Hub 저장소에 업로드] ───► [다른 개발자나 서버에서 docker pull로 다운로드]
- 검색 (docker search): 필요한 이미지가 있는지 Docker Hub에서 검색합니다.
- 다운로드 (docker pull): 저장소에 있는 이미지를 내 컴퓨터로 가져옵니다.
- 업로드 (docker push): 내가 커스텀하게 만든 이미지를 내 Docker Hub 저장소에 올립니다.
# 도커 허브에 로그인
docker login
# 기존 이미지에 태깅(식별자) 처리
docker tag my-image <username>/my-image:1.0
# docker tag: 이미지의 이름을 바꾸거나 새로운 식별자를 추가하겠다는 명령어
# my-image: 현재 내 로컬 PC에 존재하는 원본 이미지의 이름
# <username>/my-image:1.0: Docke Hub에 올리기 위해 새롭게 지정한 이름
# <username>: 본인의 Docker Hub 가입 계정 명(ID)을 적는 곳입니다.
# my-image: Docker Hub 상에서 관ㄹ리할 리포지토리의 이름
# :1.0: 이미지의 버전을 명시, 만약 이 콜론(:)뒤의 버전을 생략하면 자동으로 :latest라는 태그를 붙입니다.
# 도커 허브에 업로드
docker push <username>/my-image:1.0
Docker Hub에서 불러오기
1. 환경(WSL - Ubuntu)
#PowerShell
# WSL 목록확인
wsl -l
# Ubuntu 가상환경 들어가기
wsl -d Ubuntu-24.04
2. Docer desktop WSL 연결하기
1단계: Docker Desktop 설정 변경하기 (WSL2 연동)
Docker Desktop 프로그램이 윈도우에서 실행 중인 Ubuntu 가상환경을 인식할 수 있도록 길을 열어주어야 합니다.
- 윈도우에서 Docker Desktop 프로그램을 켭니다.
- 오른쪽 위의 톱니바퀴 아이콘 (Settings)을 클릭합니다.
- 왼쪽 메뉴에서 General로 이동한 뒤, "Use the WSL 2 based engine" 항목이 체크되어 있는지 확인합니다. (기본적으로 체크되어 있습니다.)
- 왼쪽 메뉴에서 Resources ──► WSL integration으로 이동합니다.
- "Enable integration with my default WSL distro"를 체크하고, 그 아래 목록에 나오는 Ubuntu (또는 본인이 사용하는 가상환경 이름) 스위치를 ON(활성화)으로 켭니다.
- 오른쪽 아래의 Apply & restart 버튼을 눌러 적용합니다.
2단계: 우분투(WSL2) 터미널에서 컨테이너 실행하기
이제 윈도우와 가상환경의 도커 엔진이 하나로 합쳐졌습니다. 따로 우분투 안에 도커를 중복으로 깔 필요 없이, 평소처럼 우분투 터미널에서 명령어를 날려주면 됩니다.
- Ubuntu 터미널창을 켭니다.
- 아까 만들었던 MariaDB 컨테이너 명령어를 입력해 실행합니다.
# MariaDB 컨테이너 실행 docker run -d --name my-mariadb --network my-network -p 3309:3306 -e MARIADB_ROOT_PASSWORD=1234 -v ./mariadb_data:/var/lib/mysql mariadb:latest
3단계: Docker Desktop 화면에서 확인하기
명령어를 치고 잠시 기다린 후, 윈도우의 Docker Desktop 화면으로 돌아와 보세요.
- Docker Desktop 왼쪽 메뉴에서 Containers 탭을 클릭합니다.
- 목록에 내가 우분투에서 실행한 my-mariadb라는 컨테이너가 생성되어 있고, 왼쪽에 녹색 불(Running)이 들어와 있는 것을 볼 수 있습니다!
- Port(s) 칸을 보면 우리가 지정한 3309:3306 포트도 친절하게 표시되어 있을 겁니다.
3. Docker 설치
sudo apt update
sudo apt upgrade
# 도커 설치(Docker 엔진과 Docker Compose를 한번에 설치)
sudo apt install -y docker.io docker-compose
# docker.io: 핵심 Docker 엔진 페키지 이름(리눅스에서는 docker라는 이름을 먼저 사용 중이 다른 프로그램이 있기 때문에 docker.io 사용)
# docker-compose: 여러 컨테이너를 한 번에 관리해주는 확장 도구 패키지 이름
# 도커 버전 확인
sudo docker --version
# 도커 서비스 등록 및 구동
sudo systemctl start docker
sudo systemctl enable docker
# 사용자를 도커 그룹에 포함
# 리눅스 시스템에서는 보안과 안전을 위해 기본으로 관리자 권한(sudo)이 있을 때만 실행 가능(이 불편함을 해결해주는 명령어)
sudo usermod -aG docker $USER
# -aG docker: 현재 사용자가 속해 있는 기존 그룹들은 그대로 둔 채(-a), 'docker'라는 그룹에 추가(-G)하겠다는 옵션
# $USER: 현재 리눅스에 로그인되어 있는 내 계정 ID를 자동으로 불러오는 환경 변수
newgrp docker
# 현재 열려 있는 터미널 창 안에서 'docker' 그룹의 권한을 즉시 새로고침(적용)하여 활성화
# 도커 허브에서 이미지 다운로드
docker pull <username>/my-image:1.0
# 컨테이너 실행
docker run -d --name my_container -p 8080:80 <username>/my-image:1.0
## 마운트 실행
docker run -d --name my_container -p 8080:80 -v "./html:/usr/share/nginx/html" <username>/my-image:1.0
# 데이터베이스 컨테이너
docker run -d --name my-mariadb -p 3309:3306 -e MARIADB_ROOT_PASSWORD=1234 -v ./mariadb_data:/var/lib/mysql mariadb:latest
# -e MARIADB_ROOT_PASSWORD=1234: 컨테이너 내부의 환경 변수 설정, MariaDB의 최고 관리자(root) 계정의 비밀번호를 1234로 세팅
# -v ./mariadb_data:/var/lib/mysql: 컨테이너는 기본적으로 가상 파일 시스템이라 컨테이너를 삭제하면 내부 데이터가 함께 날아갑니다.
# 이를 방지하기 위해 컨테이너 내부의 실제 데이터 저장 경로(/var/lib/mysql)를 현재 내 리눅스의 ./mariadb_data라는 폴더와 연동
4. Docker 네트워크 공유( 가상 네트워크(네트워크 브리지) )
Docker 컨테이너들을 서로 안전하게 연결하기 위해 독립된 가상의 네트워크 공간을 만들고, MariaDB 컨테이너를 그 네트워크 안으로 집어넣는 작업
docker network create my-network
Docker 엔진 내부에 my-network라는 이름을 가진 가상의 네트워크(네트워크 브리지)를 하나 개설
- 왜 만들까요? 기본적으로 Docker 컨테이너들은 각각 독립된 가상 방에 갇혀 있어서 서로 통신하기가 까다롭습니다. 하지만 개발을 하다 보면 '내가 만든 Flask 웹 앱 컨테이너'가 'MariaDB 데이터베이스 컨테이너'에 접속해서 데이터를 가져와야 합니다.
- 이렇게 하나의 가상 네트워크 영역(my-network)을 만들어두고 통신이 필요한 컨테이너들을 이 안에 같은 멤버로 묶어두면, 컨테이너들끼리 서로의 이름(IP 주소가 아닌 --name에 지정한 이름)을 사용해 아주 쉽게 통신할 수 있게 됩니다.
docker run -d --name my-mariadb --network my-network -p 3309:3306 -e MARIADB_ROOT_PASSWORD=1234 mariadb:latest
docker run -d --name my-was --network my-network -p 5005:5000 my-was-image
- my-network로 flask, mariadb가 묶였으므로 컨테이너 이름으로 연결 가능
- ex) flask 내부 코드 중 db config에 host = 'my-mariadb'(도커 컨테이너 이름)로 연결 가능
——————————————————————————
본 후기는 [한글과컴퓨터x한국생산성본부x스나이퍼팩토리] 한컴 AI 아카데미 (B-log) 리뷰로 작성 되었습니다.
'학습일지' 카테고리의 다른 글
| [스나이퍼팩토리] 한컴AI아카데미(26.06.02) GitHub CI/CD (0) | 2026.06.04 |
|---|---|
| [스나이퍼팩토리] 한컴AI아카데미(26.05.29) Docker compose (0) | 2026.05.29 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.27) Docker (0) | 2026.05.27 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.22) GitHub (0) | 2026.05.23 |
| [스나이퍼팩토리] 한컴AI아카데미(26.05.21) Git (0) | 2026.05.21 |