Docker란?
•
애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼
핵심 개념
•
컨테이너 기반 가상화 기술
◦
호스트 커널을 공유하면서도 프로세스·네트워크·파일시스템을 격리
◦
전통적 VM 대비 훨씬 가볍고 빠름
•
이미지(Image)
◦
애플리케이션 실행에 필요한 파일·라이브러리 스냅샷
◦
Dockerfile로 정의하고, 계층(layer) 단위로 캐시 활용
•
컨테이너(Container)
◦
이미지의 실행 인스턴스
◦
생성·시작·중지·삭제가 자유롭고, 일관된 실행 환경을 보장
왜 Docker가 필요한가?
환경 일관성 보장
•
“제 PC에서는 잘 되는데요?” 문제 해결
•
개발 · 테스트 · 프로덕션 전 단계에서 동일한 환경 제공
높은 이식성(Portability)
•
로컬 노트북, 온프레미스 서버, 퍼블릭 클라우드 어디서나 실행
•
레지스트리(Docker Hub, Private Registry)에 이미지를 중앙화
빠른 배포 및 스케일링
•
컨테이너 단위로 서비스 확장·축소
•
오케스트레이션(Kubernetes, Docker Swarm)과 연동해 자동 스케일링
리소스 효율성
•
VM 대비 오버헤드 적음 → 동일 하드웨어에서 더 많은 워크로드 실행
•
cgroups를 통한 CPU·메모리 제한 가능
협업 및 CI/CD 최적화
•
컨테이너 이미지를 코드처럼 버전 관리
•
파이프라인 내 docker build → docker push → docker run을 통한 자동화
Docker Container
•
Docker Image를 담아놓는 곳
•
호스트 OS상에 논리적인 구획
•
어플리케이션을 작동시키기 위해 필요한 라이브러리나 어플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것
•
컨테이너는 훨씬 가볍고 운영체제 커널을 공유하며, 시작이 훨씬 빠르고 운영체제 전체 부팅보다 메모리를 훨씬 적게 차지한다.
정의
이미지에 읽기-쓰기 레이어를 더해 실제 프로세스가 실행되는 인스턴스
특징
•
격리(Isolation): 네트워크, 프로세스, 파일시스템이 분리
•
라이프사이클: 생성(create) → 시작(start) → 중지(stop) → 삭제(rm)
•
일관성: 어디서 실행해도 동일 동작 보장
주요 명령어
•
docker run <이미지> → 컨테이너 생성·시작
•
docker ps / docker ps -a → 실행 중/전체 컨테이너
•
docker exec -it <컨테이너> → 내부 명령 실행
•
docker stop/start/rm <컨테이너> → 중지·재시작·삭제
컨테이너 기술 발전 과정
Traditional Deployment
•
하드웨어 위에 OS 설치 후 App 실행에 필요한 Library를 OS에 설치
•
다양한 서비스를 한 서버에서 운영해야 하는 문제가 발생 (비용 효율성)
•
서비스간 라이브러리 충돌이 발생함에 까라 서비스간 환경 격리가 요구됨
Virtualized Deployment
•
Hypervisor: VM(Virtual Machine)을 관리하는 역할을 함
•
Guest OS(VM)에 하드웨어 자원을 에뮬레이팅을 하다보니 성능 하락이 발생하며, 가상머신을 띄우기 위한 자원의 오버헤드가 발생
•
Cold Start
Container Deployment
•
Docker : 대표적인 Container Engine
•
chroot, namespace 등을 이용한 격리기술 제공
•
Host Process에서 실행되는 환경이기에 성능하락과 자원 오버헤드 문제에서 벗어남
•
Cold Start
Kubernetes Deployment
•
Kubernetes : 대표적인 Container Orchestration System
•
여러 서버에서 구성된 환경에서 Container를 어떻게 잘 운영할 수 있는지 목적으로 함
virtual Machine vs Docker Container
•
virtual Machine
◦
성능 손실 발생: 시스템 자원을 가상화하고 독립된 공강을 생성하는 작업(HyperVisor)을 거침
◦
배포가 느려짐: 실행 파일 이외에 Guest OS 등이 추가됨으로써 용량이 큼
•
Docker Container
◦
성능 손실 없음: 리눅스 자체 기능을 사용하여 프로세스 단위의 격리 환경을 구축
◦
배포가 빠름: 실행 파일 및 라이브러리만 필요하여 용량이 적음
Docker Image & Container
•
도커 이미지와 컨테이너는 1:N 관계
•
1개의 이미지로 N개의 컨테이너를 만들 수 있다.
Docker Image
•
컨테이너를 실행할 수 있는 실행파일, 설정 값 들을 가지고 있는 것
•
Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작
•
스택형태로 차곡차곡 쌓임
◦
ubuntu 이미지: Layer A,B,C
◦
nginx 이미지: unbuntu(Layer A,B,C) + nginx Layer
◦
web app 이미지: unbuntu(Layer A,B,C) + nginx Layer+ web app source Layer
정의
읽기 전용 템플릿(스냅샷)으로, 컨테이너 실행에 필요한 애플리케이션 코드·라이브러리·설정 파일을 레이어(layer) 단위로 저장
특징
•
불변(Immutable): 한 번 빌드된 이미지는 변경되지 않음
•
레이어 캐시: 변경 없는 레이어는 재빌드하지 않아 빌드 속도 및 저장 효율 증가
•
공유 가능: 여러 이미지가 동일한 레이어를 참조
주요 명령어
•
docker build -t <이름>:<태그> . → Dockerfile로 이미지 생성
•
docker images → 로컬 이미지 목록
•
docker pull <이미지> / docker push <이미지> → 레지스트리와 동기화
Docker Hub & Docker Registry
•
Docker Hub : 이미지를 저장하고 관리
•
많은 회사들이 Docker로 소프트웨어를 배포하기 시작했고 공개이미지들을 공유 가능.
Docker Hub를 이용하면 손쉽게 image를 pull 받아 컨테이너에 적용 가능. (사실 GitHub와 동일하게 생각해도 무관함)
•
Docker Registry : Docker Hub처럼 공개된 방식이 아닌 비공개적으로 격리된 저장소를 구축
Docker Archtecture
•
Docker Client
◦
사용자 = 우리
◦
도커를 설치하면 그것이 Client며, build, pull, run 등의 도커 명령어를 수행
•
Docker Host
◦
도커가 띄워져있는 서버를 의미
◦
컨테이너와 이미지를 관리하게 된다.
•
Docker daemon
◦
도커 엔진
•
Registry
◦
외부(remote) 이미지 저장소