# 해당 부분을 문서 가장 아래 추가
export PYENV_ROOT="$HOME/.pyenv"
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
sudo apt-get update
# 패키지 목록을 최신으로 갱신
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 도커 설치에 필요한 기본 도구 설치
# - ca-certificates : 보안 인증서 관련
# - curl : 인터넷에서 파일 다운로드
# - gnupg : 보안 키 관리
# - lsb-release : Ubuntu 버전 확인용
2. GPG 키 추가
sudo mkdir -m 0755 -p /etc/apt/keyrings
# 도커 키를 저장할 폴더 생성 (권한 0755)
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 도커 공식 GPG 키를 다운로드 후 변환하여 저장
3. Docker 리포지토리 추가
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
| sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 도커 소프트웨어를 받을 수 있는 저장소(repository)를 시스템에 등록
4. Docker 엔진 설치
sudo apt-get update
# 저장소 등록 후 다시 패키지 목록 업데이트
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 도커 본체와 관련 도구 설치
# - docker-ce : 도커 엔진 (Community Edition)
# - docker-ce-cli : 도커 명령어 도구
# - containerd.io : 컨테이너 관리 런타임
# - docker-buildx-plugin : 확장 빌드 도구
# - docker-compose-plugin : 여러 컨테이너 실행 도구
💡 설치 중 Y 를 입력해야 설치가 진행됩니다.
5. 설치 확인
docker # 도커 명령어 실행 → 사용 가능한 옵션이 나오면 정상 설치
6. 도커 서비스 상태 확인
systemctl status docker # 도커 서비스가 실행 중인지 확인 # active (running) 이 나오면 정상 실행 중
7. 일반 사용자도 도커 사용 가능하게 설정
sudo usermod -aG docker $USER
# 현재 사용자를 docker 그룹에 추가 → sudo 없이 사용 가능
exit
# 세션 종료 후 다시 로그인해야 반영됨
8. 도커 버전 확인
docker version # 도커 클라이언트/서버 버전 확인
9. 샘플 실행 (Hello World)
docker run hello-world
# 도커 허브에서 hello-world 이미지 다운로드 후 실행
# 정상 설치 시 안내 메시지 출력
- **Docker Client (docker-cli)** 사용자가 터미널에서 명령어 입력 (예: `docker run`)
- **Docker Daemon (dockerd)** 백그라운드에서 실행, 컨테이너/이미지 관리
- **containerd** 컨테이너의 전체 생애주기 관리 (생성, 실행, 중지, 삭제)
- **runc** 실제 컨테이너 실행 담당
- **containerd-shim** containerd ↔ runc 중간 연결자, 실행 조정
---
### 📊 도커 구성요소 다이어그램
```mermaid flowchart TD A["사용자 (Docker CLI)"] --> B["Docker Daemon (dockerd)"] B --> C["containerd (컨테이너 생애주기 관리)"] C --> D["runc (컨테이너 실행)"] C --> E["containerd-shim (중개자)"] ```
---
## 2. 도커 실행 환경
- **리눅스**: 바로 설치 가능 (CLI 환경 위주)
- **윈도우 / macOS**:
- Docker Desktop 패키지 사용 (내부적으로 리눅스 VM 실행)
- 사용자는 VM 신경 안 쓰고 일반 프로그램처럼 실행 가능
---
### 📋 도커 Desktop 요구사항
- **윈도우**
- Windows 10 64bit (Pro, Enterprise, Education) / Build 16299 이후
- Home 버전은 WSL2 필요
- CPU 가상화(SLAT) 지원, 메모리 4GB 이상
- **macOS**
- 2010년 이후 모델
- macOS 10.13 이후, 메모리 4GB 이상
- **리눅스**
- Ubuntu 16.04 이후 등 주요 배포판 지원
---
## 3. 도커 동작 방식
### 📊 동작 흐름
```mermaid sequenceDiagram participant U as 사용자 (docker run) participant C as Docker Client participant D as Docker Daemon participant H as Docker Hub participant N as Container
U->>C: docker run hello-world C->>D: 명령 전달 D->>H: 이미지 요청 (hello-world) H-->>D: 이미지 다운로드 D->>N: 컨테이너 생성 및 실행 N-->>U: 실행 결과 출력 ```
---
### 📦 이미지와 컨테이너
- **이미지(Image)**
- 프로그램 + 라이브러리 + 설정을 묶은 패키지
- "빵틀" 같은 역할
- 여러 개의 "레이어(Layer)"로 구성
- **컨테이너(Container)**
- 이미지를 실행한 인스턴스
- 실행/중지/삭제 가능
- 독립된 파일 시스템과 환경을 가짐
---
## 4. 도커 첫 실행 (Hello World)
### 🚀 명령어
`# 도커 "hello-world" 컨테이너 실행 docker run hello-world`
### 📝 한 줄씩 설명
- `docker` → 도커 명령어 실행
- `run` → 새로운 컨테이너를 실행하겠다는 의미
- `hello-world` → Docker Hub에서 제공하는 기본 테스트 이미지
---
### ⚡ 실행 과정
1. 사용자가 `docker run hello-world` 입력
2. Docker Client → Docker Daemon에 명령 전달
3. Daemon이 Docker Hub에서 이미지 다운로드
4. Daemon이 컨테이너 생성 및 실행
5. 실행 결과를 사용자 터미널에 출력
---
## 5. 컨테이너가 가벼운 이유
- 운영체제를 하나씩 포함하는 VM과 달리, **호스트 OS 커널을 공유**해서 불필요한 리소스 사용이 없음.
- 따라서 실행 속도도 빠르고, 메모리/디스크 효율도 좋음.
---
## 6. 현업에서 도커 활용 사례
- **개발 환경 공유**
- 팀원 모두 같은 개발 환경 사용 (환경 차이로 인한 문제 방지)
- **테스트 및 배포 자동화 (CI/CD)**
- GitHub Actions, Jenkins, GitLab CI/CD와 연계해 자동 배포
- **마이크로서비스 운영**
- 여러 개의 독립적인 컨테이너로 서비스 운영 (예: 웹, DB, 캐시 분리)
- **클라우드 환경과 결합**
- AWS ECS, EKS / GCP GKE / Azure AKS 등과 함께 사용
---
# ✅ 정리
- 도커는 **이미지 → 컨테이너 실행 구조**
- **Docker CLI → Daemon → containerd → runc** 흐름
- 현업에서는 **개발환경 통일, 자동화 배포, 마이크로서비스 운영**에 필수
---
👉 여기까지 하면 **도커 사용 구조 + 설치 + 동작 원리 + Hello World 실습**을 전체적으로 이해할 수 있어요.