Dockerization : localhost to production
실습 셋팅
•
git repo를 clone해주세요.
git clone https://github.com/HyeJung-Hwang/boaz-docker.git
Bash
복사
•
docker desktop을 켜주세요.
•
docker를 사용할 수 있는 터미널(mac)/git bash 또는 wsl 또는 powershell(window)으로 이동해주세요.
Dockerization: For Beginners
1. What is Dockerization?
Dockerziation
= Isolating a Program
= Building Program into a Container
= Building a Dockerfile into a Docker Image and then into a Docker Container
a. Isolating a Program
프로그램에게 격리된 환경이 필요한 이유
•
개발자가 동일한 환경에서 작업할 수 있게 하기 위해
•
프로그램을 서빙(서비스화) 하는데 필요한 환경을 패키지화 하기 위해
b. Building Program into a Container
Dockerization = 내 프로그램(코드) + 내 개발환경 → 컨테이너
•
컨테이너
◦
프로그램 실행에 필요한 모든 것(패키지,런타임)을 포함하는 가상화 패키지
•
i. How Does Virtualisation Work in Container?
가상화(Virtualisation)이란?
•
가상 = 논리 = Not Physical
•
한 대의 물리적인 기계에서 운영 체제/서버/저장소 또는 네트워크와 같은 것들의 여러 개의 시뮬레이션된 환경이나 가상 버전을 만들 수 있는 기술
Container로 가상화하기
•
운영체제(OS)를 가상화
VM: 하드웨어/서버를 가상화
c. Building a Dockerfile into a Docker Image and then into a Docker Container
Docker 란?
•
컨테이너를 만들고 관리하는 툴
•
Dockerfile & Docker Image
Dockerfile → Docker Image → Container
Docker Image
•
Container 실행할 때 필요한 파일 시스템(개발 환경)
→ 도커라는 툴이 도커파일의 커맨드를 한줄한줄 읽으면서 레이어를
쌓아서 최종적인 환경, 파일시스템을 구축
◦
이미지 레이어 구조란?
▪
이미지 레이어 = 파일 시스템의 변경 사항의 스냅샷(캡쳐 단위)
▪
Docker가 Dockerfile을 읽으면서 파일시스템에 변화를 주는 커맨드 마다 새로운 이미지 레이어를 쌓으면서 최종적으로 컨테이너로 실행하려는 프로그램에 필요한 환경, 파일 시스템 구축!
왜 레이어 구조를 사용할까요?
◦
이미지 레이어 구조로 컨테이너가 구현되는 과정
▪
docker run
▪
이미지 레이어 스냅샷 복원
▪
신규 컨테이너 공간에 mount하여 이미지 레이어 구성
▪
새로운 레이어(컨테이너 레이어)가 해당 mount 위에 구성
◦
파일시스템을 여러 개의 레이어로 사용하는 것을 가능하게 한 방법
▪
Union File System
•
2개 이상, 여러 개의 파일 시스템을 하나의 파일 시스템에 마운트하는 방법
상속?
•
두 파일 시스템에서 동일한 파일이 있다면 나중에 마운트된 파일 시스템의 파일을 오버레이
→ 서로 다른 Docker Container 가 같은 동일한 파일시스템 공유 가능
•
하위 파일시스템에 대한 쓰기 작업은 CoW(Copy On Write) 전략에 따라 복사본을 생성하여 수행
→ 서로 다른 Docker Container 의 독립 실행 가능
▪
Union File System in Docker
•
이미지 레이어 위에 컨테이너 레이어를 mount
Docker Container 사이 파일 시스템 공유 가능
Docker Container 독립적으로 실행 가능
실습 1
Optimization: Python Docker Image
Docker 환경을 어떻게 최적화할 수 있을까?
→ Docker Image Layer 구성 변화
1.
필요없는 packages의 제거
2.
적절한 Base image의 선정
3.
Multi-stage 빌드
Docker Image Layer 구성 최적화 방법
FROM python:3.8
RUN apt-get update && apt-get install -y make curl vim
WORKDIR /service
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
Docker
복사
•
result(용량)
◦
1 GB 이상
1.
필요없는 packages의 제거
•
프로그램에 필요 없는 패키지 설치하는 CMD를 Dockerfile에서 삭제
FROM python:3.8
RUN apt-get update
WORKDIR /service
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
Docker
복사
2.
적절한 Base image의 선정
•
alpine, slim 태그가 달린 이미지 사용하기 (추천)
•
alpine
◦
가벼운 리눅스 배포판
•
slim
◦
파이썬을 실행하는데 필요한 최소한의 패지키만 설치
실습 2
3.
Multi-stage 빌드
•
빌드 등에는 필요하지만 최종 컨테이너 이미지에는 필요 없는 환경을 제거할 수 있도록 단계를 나누어서 기반 이미지를 만드는 방법
•
복사하지 않는 모든 변경사항이 폐기되어 다음 스테이지로 옮겨지지 않음
◦
최종 Docker 이미지의 불필요한 크기를 생성하지 않게 된다!
실습3