0. Docker 기초: 개념 및 설치
by NyangPolice
Docker 기초: 개념 및 설치
Docker는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있게 해주는 오픈소스 플랫폼이다.
Docker란?
Docker는 2013년 dotCloud(현 Docker Inc.)에서 출시한 컨테이너 기반의 가상화 플랫폼이다. 애플리케이션과 그 실행에 필요한 모든 종속성(라이브러리, 설정 파일, 환경 변수 등)을 하나의 컨테이너로 패키징하여 어디서든 동일하게 실행할 수 있게 해준다.
가상 머신 vs Docker
전통적인 가상 머신(VM)과 Docker 컨테이너의 차이를 이해하는 것이 중요하다.
가상 머신 (Virtual Machine)
graph TD
Hardware[Hardware]
HostOS[Host OS]
Hypervisor[Hypervisor]
GuestOS1["Guest OS (Linux)"]
GuestOS2["Guest OS (Windows)"]
AppA[Application A]
AppB[Application B]
Hardware --> HostOS
HostOS --> Hypervisor
Hypervisor --> GuestOS1
Hypervisor --> GuestOS2
GuestOS1 --> AppA
GuestOS2 --> AppB
- 하드웨어를 가상화
- 각 VM마다 완전한 게스트 OS가 필요
- 무겁고 부팅이 느림 (분 단위)
- 리소스 오버헤드가 큼
Docker 컨테이너
graph TD
Hardware[Hardware]
HostOS[Host OS]
DockerEngine[Docker Engine]
ContainerA[Container A<br/>App + Libs]
ContainerB[Container B<br/>App + Libs]
Hardware --> HostOS
HostOS --> DockerEngine
DockerEngine --> ContainerA
DockerEngine --> ContainerB
- OS 레벨을 가상화
- 호스트 OS의 커널을 공유
- 가볍고 빠른 시작 (초 단위)
- 리소스 효율적
Docker의 주요 특징
1. 경량성 (Lightweight)
- 컨테이너는 호스트 OS의 커널을 공유하므로 VM보다 훨씬 가볍다
- 이미지 크기가 작고 (수십 MB ~ 수백 MB) 시작 시간이 빠르다
- 동일한 하드웨어에서 더 많은 컨테이너를 실행할 수 있다
2. 이식성 (Portability)
- “Build once, run anywhere” - 한 번 만들면 어디서든 실행 가능
- 개발 환경, 테스트 환경, 프로덕션 환경에서 동일하게 동작
- 개발자의 로컬 머신과 클라우드 서버 간 환경 차이 문제 해결
3. 격리성 (Isolation)
- 각 컨테이너는 독립적인 파일시스템, 네트워크, 프로세스 공간을 가짐
- 컨테이너 간 간섭 없이 동일한 포트나 라이브러리를 사용 가능
- 보안 측면에서도 애플리케이션을 격리할 수 있음
4. 확장성 (Scalability)
- 컨테이너를 쉽게 복제하고 배포할 수 있음
- 마이크로서비스 아키텍처에 최적화
- Kubernetes 등의 오케스트레이션 도구와 결합 가능
5. 버전 관리 및 재사용
- 이미지 레이어 구조로 효율적인 버전 관리
- Docker Hub를 통한 이미지 공유 및 재사용
- 롤백과 업데이트가 용이
Docker 아키텍처
Docker는 클라이언트-서버 아키텍처를 사용한다.
graph LR
Client["Docker Client (CLI)"]
Daemon["Docker Daemon (dockerd)"]
Registry[Image Registry]
subgraph ClientCommands [Commands]
run[docker run]
build[docker build]
pull[docker pull]
end
subgraph DaemonManage [Management]
Images[Images]
Containers[Containers]
Networks[Networks]
Volumes[Volumes]
end
Client -- REST API --> Daemon
Client --- ClientCommands
Daemon --- DaemonManage
Daemon -- Pull/Push --> Registry
주요 구성 요소
1. Docker Daemon (dockerd)
- 백그라운드에서 실행되는 서버 프로세스
- Docker API 요청을 수신하고 처리
- 이미지, 컨테이너, 네트워크, 볼륨 등을 관리
2. Docker Client (docker)
- 사용자가 Docker와 상호작용하는 CLI 도구
docker run,docker build등의 명령을 Docker Daemon에 전달
3. Docker Registry
- Docker 이미지를 저장하고 배포하는 저장소
- 공식 레지스트리: Docker Hub (hub.docker.com)
- 프라이빗 레지스트리 구축 가능
4. Docker Objects
- Images: 컨테이너를 만들기 위한 읽기 전용 템플릿
- Containers: 이미지의 실행 가능한 인스턴스
- Networks: 컨테이너 간 통신을 위한 네트워크
- Volumes: 데이터를 영구적으로 저장하기 위한 스토리지
Docker 핵심 개념
1. 이미지 (Image)
이미지는 컨테이너를 생성하기 위한 읽기 전용 템플릿이다. 이미지는 레이어(Layer) 구조로 되어 있어 효율적으로 저장되고 전송된다.
이미지 레이어 구조
graph BT
Base["Ubuntu Base (80MB)"]
Runtime["Python 3.9 (100MB)"]
Deps["Dependencies (50MB)"]
App["App Layer (10MB)"]
Base --> Runtime
Runtime --> Deps
Deps --> App
각 레이어는 읽기 전용이며, 여러 이미지가 동일한 레이어를 공유할 수 있어 디스크 공간을 절약한다.
이미지 명명 규칙
[registry]/[namespace]/[repository]:[tag]
예시:
docker.io/library/nginx:latest
- registry: docker.io (Docker Hub)
- namespace: library (공식 이미지)
- repository: nginx
- tag: latest
2. 컨테이너 (Container)
컨테이너는 이미지의 실행 가능한 인스턴스다. 컨테이너는 이미지 레이어 위에 쓰기 가능한 레이어를 추가하여 실행 중에 변경된 내용을 저장한다.
컨테이너 생명주기
stateDiagram-v2
[*] --> Created
Created --> Running
Running --> Paused
Paused --> Running
Running --> Stopped
Stopped --> Running : Restart
Stopped --> Removed
Removed --> [*]
3. Dockerfile
Dockerfile은 이미지를 빌드하기 위한 스크립트 파일이다. 텍스트 형식으로 작성되며, 이미지 생성 과정을 자동화한다.
주요 명령어
FROM: 베이스 이미지 지정RUN: 이미지 빌드 시 실행할 명령COPY/ADD: 파일을 이미지에 복사WORKDIR: 작업 디렉토리 설정ENV: 환경 변수 설정EXPOSE: 컨테이너가 리스닝할 포트 명시CMD/ENTRYPOINT: 컨테이너 시작 시 실행할 명령
4. 볼륨 (Volume)
볼륨은 컨테이너의 데이터를 영구적으로 저장하기 위한 메커니즘이다. 컨테이너가 삭제되어도 볼륨의 데이터는 유지된다.
5. 네트워크 (Network)
Docker는 여러 네트워크 드라이버를 제공하여 컨테이너 간 통신을 지원한다.
- bridge: 기본 네트워크 모드, 동일 호스트의 컨테이너 간 통신
- host: 호스트의 네트워크를 직접 사용
- none: 네트워크 없음
- overlay: 여러 호스트에 걸친 컨테이너 간 통신 (Swarm)
Docker 설치
Docker는 다양한 플랫폼에서 사용할 수 있음. 각 플랫폼별 빠른 설치 방법을 소개함.
[!IMPORTANT] 상세 설치 가이드: 플랫폼별 상세한 설치 방법, 시스템 요구사항, 문제 해결은 Docker 설치 가이드 문서를 참고할 것.
빠른 설치 요약
Windows
- Docker Desktop for Windows 다운로드
- WSL 2 활성화 필요
- 설치 후
docker --version으로 확인
상세 가이드: Windows 설치 가이드
macOS
- Docker Desktop for Mac 다운로드
- CPU 아키텍처(Apple Silicon/Intel) 확인 후 설치
- 설치 후
docker --version으로 확인
상세 가이드: macOS 설치 가이드
Linux (Ubuntu/Debian)
# 편리한 설치 스크립트 (개발/테스트 환경용)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 사용자 권한 설정
sudo usermod -aG docker $USER
newgrp docker
# 설치 확인
docker --version
상세 가이드: Linux 설치 가이드
[!WARNING] 프로덕션 환경: 편리한 설치 스크립트는 테스트/개발 환경에서만 사용할 것. 프로덕션 환경에서는 공식 저장소를 통한 설치를 권장함.
설치 확인
# Docker 버전 확인
docker --version
# Docker 정보 확인
docker info
# 테스트 컨테이너 실행
docker run hello-world
설치 후 첫 단계
1. Hello World 실행
docker run hello-world
이 명령은:
- 로컬에서
hello-world이미지를 찾음 - 없으면 Docker Hub에서 다운로드
- 컨테이너를 생성하고 실행
- 메시지를 출력하고 종료
2. 첫 번째 실용적인 컨테이너 실행
# Nginx 웹 서버 실행
docker run -d -p 8080:80 --name my-nginx nginx
# 웹 브라우저에서 http://localhost:8080 접속
3. 컨테이너 관리 기본
# 실행 중인 컨테이너 확인
docker ps
# 모든 컨테이너 확인
docker ps -a
# 컨테이너 중지
docker stop my-nginx
# 컨테이너 시작
docker start my-nginx
# 컨테이너 삭제
docker rm my-nginx
# 컨테이너 강제 삭제 (실행 중이어도)
docker rm -f my-nginx
4. 이미지 관리 기본
# 로컬 이미지 목록
docker images
# 이미지 검색
docker search nginx
# 이미지 다운로드
docker pull nginx:alpine
# 이미지 삭제
docker rmi nginx:alpine
# 사용하지 않는 이미지 정리
docker image prune
Docker Desktop 주요 기능
GUI 대시보드
Docker Desktop은 GUI를 제공하여 다음을 쉽게 관리할 수 있다:
- Containers: 컨테이너 목록, 로그, 상태 확인
- Images: 이미지 관리, 다운로드, 삭제
- Volumes: 볼륨 생성 및 관리
- Dev Environments: 개발 환경 설정
Kubernetes 통합
Docker Desktop에는 단일 노드 Kubernetes 클러스터가 포함되어 있다.
설정 방법:
Settings → Kubernetes → Enable Kubernetes
Extensions
Docker Desktop Extensions를 통해 추가 기능을 설치할 수 있다:
- 로그 분석
- 보안 스캔
- 모니터링 도구
- CI/CD 통합
다음 단계
Docker가 성공적으로 설치되었다면 다음 주제들을 학습하자:
- Docker 기본 명령어: 컨테이너와 이미지 관리
- Dockerfile 작성: 커스텀 이미지 만들기
- Docker Compose: 멀티 컨테이너 애플리케이션 관리
- 볼륨과 네트워크: 데이터 영속성과 컨테이너 간 통신
- Best Practices: 효율적이고 안전한 Docker 사용법
Docker는 현대적인 애플리케이션 개발과 배포에 필수적인 도구가 되었다. 설치를 완료했다면 이제 컨테이너 기반 개발의 세계로 들어갈 준비가 된 것이다!
tags: docker - 기초 - 설치 - 개념 - 가상화 - 컨테이너Docker 카테고리의 글 목록
-
1. Docker 설치 가이드
-
0. Docker 기초: 개념 및 설치