02 Docker
02 Docker
1. Note
1. Note
- 다시 복습!
2. VM / Docker
1. VM / Docker / Container
- VM → OS 단위로 가상화 / 하나의 VM = 독립된 컴퓨터 1대
- Docker → 컨테이너를 만들고 실행하는 도구(플랫폼)
- Container → 애플리케이션 실행 단위 (격리된 프로세스)
2. 비교
| 기준 | VM | Container |
|---|---|---|
| 가상화 대상 | OS | 프로세스 |
| OS 포함 여부 | 포함 (각 VM마다) | 없음 (커널 공유) |
| 격리 수준 | OS 단위 (강함) | 프로세스 단위 |
| 무게 | 무거움 | 가벼움 |
| 실행 속도 | 느림 (부팅 필요) | 빠름 (즉시 실행) |
3. 구조 차이
- VM 구조
1 2 3 4
물리 서버 └─ VM └─ OS └─ App (직접 설치)
- 도커 사용패턴
1 2 3 4 5
물리 서버 (클라우드/온프레 등) └─ VM (☆) # VM 없이 바로 사용함. 설비를 어떻게 했는지 차이 └─ Host OS (Linux 등) └─ Docker Engine (☆) └─ Container(☆)
4. 가상화 영역
- 실제로는 하나인데, 여러 개처럼 보이게 만드는 것
가상화 구분
구분 실제 가상으로 보이는 것 VM OS 1개 OS 여러 개 Container OS 1개 여러 개의 독립된 실행 환경 - 비교
- VM (OS 가상화)
- OS가 따로 있음 (Ubuntu, Windows 등)
- 커널도 따로 있음
- 재부팅 가능
- 완전히 다른 컴퓨터 느낌
- Container (프로세스 환경 가상화)
- / 루트 디렉토리가 따로 있음
- ps 찍으면 자기 프로세스만 보임
- 포트도 따로 씀
- 다른 컨테이너 안 보임
- VM (OS 가상화)
5. Container의 이점
1. 환경 일관성
- 주요 문제
- 로컬에서는 가능하지만, 서버에서 안되는 경우 발생함.
- OS 차이 / 라이브러리 버전 차이 / 설정 누락
- Container의 이점
- 이미지에 모든 환경이 담겨있어서 이미지 하나로 어디서든 동일 실행
- 클라우드 변경, 또는 다른 시스템에서 진행해도 동일한 조건이 됨.
2. 빠른 배포 & 롤백
- 주요 문제
서버 접속 → 파일 복사 → 설정 변경 → 재시작- 의미 없는 반복적인 작업 필요함
- Container의 이점
이미지 pull → 컨테이너 실행- CI 단계에서 공통 이미지를 만들고 CD에서는 컨테이너를 실행으로 분리.
3. 확장성
- 주요 문제
- VM에서는 트래픽이 몰리면 VM을 계속 증설 필요함
- 하드웨어 성능에 따라서 무한히 증설이 불가능함.
- Container의 이점
- 트래픽 증가하면 컨테이너를 복제해서 확장함
4. 자원 효율성
- 주요문제
- VM이 늘어날때마다 OS도 증가하여 메모리 차지
- 불필요한 메모리 낭비가 많음
- Container의 이점
- 커널을 공유하여 사용함
- 컨테이너로 필요한 것(AP 등)만 실행하여 메모리 감소
3. Docker
1. Docker란?
- 컨테이너 기술을 활용하여 애플리케이션을 실행하는 플랫폼
- 가상 머신과 비교하여 가볍고 빠른 환경 제공
2. Docker의 핵심 개념
1. 이미지 (Image)
- 컨테이너 실행을 위한 설계도 (immutable)
- 애플리케이션 + 라이브러리 + 실행환경 포함
- 변경 불가능 (새로 만들면 됨)
Spring Boot + JDK + 설정등으로 이미지마다 다르게 구성- 재사용가능
2. 컨테이너 (Container)
- 실행 중인 독립된 환경
- 이미지를 실행한 실제 인스턴스
- 프로세스 단위 실행
3. Dockerfile
- 컨테이너를 정의하는 설정 파일
- 이미지를 만드는 설계 스크립트
1 2 3
FROM openjdk:17 COPY app.jar app.jar ENTRYPOINT ["java", "-jar", "app.jar"]
4. Volume
- 컨테이너 외부에 데이터를 저장하는 공간
- 컨테이너는 기본적으로 휘발성
- DB등의 중요한 데이터들은 사라지면 문제가 됨.
- 데이터를 Host 또는 별도 영역에 저장
5. Network
- 컨테이너 간 통신
- 컨테이너 이름으로 통신 가능
- 내부 DNS 제공
6. Registry
- 이미지를 저장하는 저장소
Docker Hub,Private Registry- 흐름
1 2 3
build → push → pull → run # CI 과정에서 빌드를 하면 빌드된 파일은 이미지 레지스트리에 Push # 디플로이할때 이미지 레지스트리에서 Pull하고 Run을 시키게됨
3. Docker Architecture
- Docker Client (CLI, REST API, UI)
- 사용자가 Docker와 상호작용할 수 있도록 명령을 전달하는 인터페이스
- CLI(Command Line Interface) 또는 REST API를 사용하여 컨테이너를 실행하거나 관리할 수 있음
- Docker Daemon (dockerd)
- Docker의 핵심 엔진으로, 컨테이너와 이미지를 관리하는 역할
- Clinet 로 부터 명령을 받아 컨테이너 생성, 네트워크 관리, 스토리지 할당 등을 처리
- Docker Images
- 컨테이너를 실행하는 데 필요한 파일 시스템과 애플리케이션 코드가 포함된 템플릿
- Layer 기반의 구조로, 같은 이미지에서 여러 개의 컨테이너 생성 가능
- Containers
- 독립적으로 실행되는 애플리케이션 인스턴스
- 각 컨테이너는 자체 파일 시스템과 네트워크 인터페이스를 가지며, 다른 컨테이너와 격리됨
docker run명령으로 생성 가능
- Docker Registry (Docker Hub, Private Registry)
- Docker 이미지를 저장하고 배포하는 서비스
- Docker Hub(공개), Amazon ECR, Google GCR 등의 사설 레지스트리를 사용 가능
docker pull또는docker push명령으로 이미지를 업로드/다운로드
- Storage & Networking
- Storage: 컨테이너의 데이터를 지속적으로 저장하기 위해 Volumes, Bind Mounts, Tmpfs 사용
- Networking: 브리지(Bridge), 호스트(Host), 오버레이(Overlay) 등의 네트워크 드라이버를 통해 컨테이너 간 통신을 제공
4. Docker 기본명령어
1
2
3
4
5
6
7
8
9
10
11
# 현재 시스템에서 사용 가능한 모든 Docker 이미지 목록 확인
$ docker images
# 특정 이미지 다운로드
$ docker pull <이미지 이름>
# 이미지 정보 확인
$ docker inspect <이미지 이름>
# 이미지 삭제
$ docker rmi <이미지 이름>
5. 컨테이너 관련
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 컨테이너 실행 (제일 중요)
docker run -d -p 8080:80 nginx
# 실행 중 컨테이너 조회
docker ps
# 전체 컨테이너 조회
docker ps -a
# 컨테이너 정지
docker stop <컨테이너ID>
# 컨테이너 재시작
docker start <컨테이너ID>
# 컨테이너 삭제
docker rm <컨테이너ID>
4. Docker Compose
1. Docker Compose
- 여러 개의 컨테이너를 하나의 서비스로 관리하는 도구
- YAML 파일로 컨테이너 정의 및 실행 가능
- 개발 및 배포 환경에서 다중 컨테이너 애플리케이션을 쉽게 설정할 수 있습니다
2. 기본구조
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: "3.8"
services: # 컨테이너 정의 영역
app:
build: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: test
ports:
- "3306:3306"
3. 주요 명령어
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 전체 실행(최신버전은 하이픈이 없음)
docker-compose up
docker compose up
# 백그라운드 실행
docker compose up -d
# 종료
docker compose down
# 로그 확인
docker compose logs
docker compose logs app # 특정서비스 실행
# 재빌드
docker compose up --build
This post is licensed under CC BY 4.0 by the author.
