๐ Docker๊ฐ ํ์ํ ์ด์
1. ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถฉ๋
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ/๋ชจ๋์ ์ถฉ๋ ์ด์ ๋ฐ์
- DAG์ ๋ฐ๋ผ ์คํ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/๋ชจ๋์ด ๋ฌ๋ผ์ง๊ธฐ ์์ํ๋ค.
-> Python Version Issue -> 3.7, 3.8๋ฑ๋ฑ์์ ์ฌ์ฉ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ/๋ชจ๋์ด ๊ฐ๋ฆฐ๋ค.
- ์ด๋ก ์ธํ์ฌ DAG ํน์ Task๋ณ๋ก ๋ณ๋์ ๋
๋ฆฝ๊ณต๊ฐ์ ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด ํ์ํ๋ค.
- Docker to the rescue
- Dag ํน์ Task ์ฝ๋๋ฅผ Docker Image๋ก ๋ง๋ค๊ณ ์ด๋ฅผ ๋
๋ฆฝ๋ ๊ณต๊ฐ์์์ ์คํํ๋ค.
2. Worker์ ๋ถ์กฑ
- Scale Up/Out
-> ํด๋ผ์ฐ๋ ์๋น์ค ์ฌ์ฉ
- K8s์ ๊ฐ์ ์ปจํ
์ด๋ ๊ธฐ์ ์ฌ์ฉ -> ํ์ํ๋งํผ ์๋ฒ์ ์์ฒญ
3. ๋ฎ์ Server Utilization Issue
- Airflow ์ ์ฉํ๋์จ์ด๋ฅผ ์ง์ ํ์์ง๋ง ์๋ฒ๋ค์ด ํญ์ ๋ฐ์์ง ์์๊ฒฝ์ฐ
- ์๋น์ค๋ณ๋ก ์ ์ฉ ์๋ฒ๋ฅผํ ๋นํ๋ ๊ฒ์ ์ฌ๋ฌ๊ฐ์ง Issue๋ฅผ ๋ง๋ค์ด๋ธ๋ค.
- ์๋น์ค๋ณ๋ก Capacity ๊ด๋ฆฌ๋ฅผํด์ผํ๋ค.
- ๊ฐ ์๋น์ค์ ์ํ ์๋ฒ๋ค์ ๋ณด๋ฉด utilization์ด ๋ฎ์ ์ด์๊ฐ ๋ฐ์ํ๋ค.
- ์ด ์ญ์ K8s์ ๊ฐ์ ์ปจํ
์ด๋๊ธฐ์ ์ ๋์
์ผ๋ก ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
4. ํด๊ฒฐ์ฑ
- Task๋ DAG์ฝ๋๋ฅผ Docker Image๋ก ๋ง๋ค์ด์ Docker Container ํํ๋ก ์คํ
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ/๋ชจ๋ ์ถฉ๋ ๋ฐฉ์ง
- ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ํ๋ก๋์
ํ๊ฒฝ์ ๋์ผํ๊ฒ ์ ์ง
- Airflow Worker๋ฅผ K8s์์ ํ์ํ๋งํผ ๋์ ์ผ๋ก ํ ๋นํ์ฌ ์ฌ์ฉ
- ์ ์ฉ ์๋ฒ๋ฅผ Airflow์ ํ ๋นํ์ง ์๊ณ Container Orchestration ์๋น์ค๋ฅผ ํตํด ํ ๋นํด์ ์ฌ์ฉํ๊ณ ๋ฆฌํด
- Airflow์์ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ 3๊ฐ์ง
- Airflow Operator๋ก K8sPodOperator๋ฅผ ์ฌ์ฉ
- Airflow Operator๋ก DockerOperator๋ฅผ ์ฌ์ฉ
- Airflow Executor๋ก ์๋๋ฅผ ์ฌ์ฉ
- K8sExecutor
- CeleryK8sExecutor
- LocalK8sExecutor
5. Airflow Executor
- Executor๋ Task๋ค์ ๊ด๋ฆฌํ๊ณ ์คํํ๋ ์ญํ ์ ์ํํ๋ค.
- ๋ณ๋ ฌ ํน์ ์ผ๋ ฌ ์คํ์ด๋ ์ด๋ worker์์ ์คํํ ์ง ๋ฑ๋ฑ
- ๋ค์ํ ์์ Executor ํ์
์ด ์กด์ฌํ๋ค.
- Sequential Executor: ๋ํด๋๋ก ์ค์น๋๋ฉฐ Sqlite์ ๊ฐ์ ์ฑ๊ธ์ค๋ ๋ DB์์๋ง ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
- Local Executor: task๋ค์ Airflow ๋ง์คํฐ๋
ธ๋์์์ ์คํํ๋ค.
- Celery Executor: ๋ค์์ Worker ๋
ธ๋๊ฐ ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ฉฐ Celery ํ๋ฅผ ์ฌ์ฉํ์ฌ Task๋ค์ Worker ๋
ธ๋๋ก ๋ถ์ฐํ์ฌ ์คํํ๋ค.
- K8s Executor๋ K8s ํด๋ฌ์คํฐ๋ฅผ ์ฌ์ฉํ์ฌ Task๋ค์ ๋
๋ฆฝ๋ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ค.
- Local K8s Executor์ Celery K8s Executor๋ ์กด์ฌํ๋ค.
๐ Docker ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ ํ๋ก์ธ์ค
1. High-Level Docker ์ฌ์ฉ ํ๋ก์ธ์ค
- ๋จผ์ ๋์ ์ํํธ์จ์ด๋ฅผ ์ ํ
- ๋ค์์ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋๋ SW๋ผ๋ฉด ๊ฐ๊ฐ์ด Docker Image๋ก ๋ง๋ค์ด์ ธ์ผํ ์๋ ์๋ค.
- ์ด๋ฅผ Docker Image๋ก ๋น๋ -> Dockerization์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
- Dockerfile์ด๋ผ๋ ํ
์คํธ ํ์ผ๋ก ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ธฐ์ ํ๋ค.
- ํด๋น SW๋ฅผ ์ด๋ฏธ์ง๋ก ๋ฐ๊พธ๊ธฐ ์ํ Docker์๊ฒ ์ฃผ๋ ๋ช
๋ น๋ค์ ํฌํจํ๋ค.
- Docker Image : ํ๋์ Docker Container์์์ ์คํ๋๋ค.
- Dockerfile์ ๊ธฐ์ค์ผ๋ก ๋ง๋ค์ด์ง๋ฉฐ SW๋ฅผ ์คํํ๊ธฐ์ํด ํ์ํ ๋ชจ๋ ๊ฒ์ ํฌํจํ๋ค.
2. Docker Image์ ๊ตฌ์ฑ ์์
- ๊ธฐ๋ณธ OS์ ๊ฐ์ SW์ ์คํํ๊ฒฝ
- SW ์์ฒด(์ฝ๋)
- SW๊ฐ ํ์๋ก ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ํ์ผ ์์คํ
์ค๋
์ท : ์คํํ๋ ํํ๋ก ๊ตฌํ๋๋ค.
- ํ๊ฒฝ ์ค์ ๋ณ์ : ๋น๋ํ ๋ ๋ณ์์ ์คํ ๋ ๋ณ์ ๋ ๊ฐ์ง๊ฐ ์กด์ฌํ๋ค.
- ๋ฉํ ๋ฐ์ดํฐ : ์ด๋ฏธ์ง ์์ฒด์ ๋ํ ์ ๋ณด(๋ฒ์ , ์์ฑ์, ์ค๋ช
๋ฑ๋ฑ)
3. Docker Image์ ์คํ
- Container๋ฅผ ํตํด Docker Image์์ SW๋ฅผ ์คํ
- Container๋ ์์ฒด ํ์ผ ์์คํ
์ ๊ฐ์ง ํน์ํ ํ๋ก์ธ์ค๋ก ์ด๋ฏธ์ง์ ํ์ผ ์์คํ
์ด ๋ก๋ฉ๋๋ค.
- Image๋ฅผ Container ์์์ ์คํํ๋ค.
4. Docker Image์ ๋ฑ๋ก : Docker Hub
- Docker Regustry๋ Docker Image๋ค์ ๋ณด๊ด์์ด๋ค.
- On-prem registry์ Cloud registry๊ฐ ์กด์ฌํ๋ค.
- docker hub์ด ๊ฐ์ฅ ์ ๋ช
ํ๋ค.
- ์ฌ๊ธฐ์ ๋ฑ๋กํ๋ฉด ํ์ฌ๋ด ํน์ ํผ๋ธ๋ฆญํ๊ฒ ์ด๋ฏธ์ง๋ฅผ ๊ณต์ ๊ฐ๋ฅํ๋ค.
- ๋ฆฌ๋
์ค์์๋ Docker Desktop์ ๋ก๊ทธ์ธ์ ํ๋ ค๋ฉด ์๋ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ๋๋ค.
- ๋จผ์ GPGํค๋ฅผ ์์ฑํด์ผ ํ๋ค.
GnuPG needs to construct a user ID to identify your key.
Real name: Molly
Email address: molly@example.com
You selected this USER-ID:
"Molly <molly@example.com>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
- ์ดํ ์ด๊ธฐํ๋ฅผ ์์ผ์ฃผ์ด์ผ ํ๋ค. ์ด๋ ํด๋๋ฅผ ํ๋ ๋ง๋๋ ๊ณผ์ ์ด๋ค.
- pass init <your_generated_gpg-id_public_key>
- ์ด์ Docker Desktop์ผ๋ก ๋์๊ฐ๋ฉด ๋ก๊ทธ์ธ์ด ๋์ด ์์ ๊ฒ์ด๋ค.
๐ Docker Hello World
1. ํ๋ก๊ทธ๋จ์ ๊ฐ์
- Node.js๋ก ๊ตฌ์ฑ๋ ์น ์๋น์ค
- app.js๊ฐ ์ ๋ถ์ด๋ค.
- Node ๋ฐํ์ ํ๊ฒฝ์ด ํ์ํ๋ค.
- ์คํ ๋ฐฉ๋ฒ
- node ํ๊ฒฝ์ด ์ค์ ๋์ด ์์ด์ผ ์คํ ๊ฐ๋ฅํ๋ค.
2. Dockerfile ์ฌ์ฉ๊ฐ๋ฅ ํค์๋
- FROM node:alpine : OS ์ข
๋ฅ๋ฅผ ์ ์ด๋๋ค. Alpine์ด๋ผ๋ ๊ฒฝ๋ ๋ฆฌ๋
์ค๋ฅผ ์๋ฏธ
- COPY./app : ์ฝ๋ ๋ณต์ฌ์ ์ฌ์ฉ
- WORKDIR /app : Working directory๋ฅผ ์ง์ ํ๋ค.
- CMD node app.js : ์คํํ๋ ๋ช
๋ น ์์ ์ง์ ํ๋ค.
- ARG : Docker Image๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉ๋๋ ๋ณ์ ์ง์ . ์ต์ข
์ด๋ฏธ์ง์๋ ์ ๋ค์ด๊ฐ๋ค.
- ENV : ์ปจํ
์ด๋๊ฐ ์คํ๋ ๋ ์ฌ์ฉ๋๋ ํ๊ฒฝ๋ณ์. ์ต์ข
์ด๋ฏธ์ง์ ์ ์ฅ๋๋ค.
- USER : ์ปจํ
์ด๋๋ฅผ ์คํํ ๋ ์ฌ์ฉํ ์ ์ ID
- EXPOSE : ์๋น์ค ์ฌ์ฉ ํฌํธ ๋ฒํธ
- RUN
- ๋น๋์ ์คํ๋์ด์ผํ๋ ๋ช
๋ น๋ค์ด ์ง์ ๋จ (docker build)
- RUN apt-get update && apt-get install -y curl
2-1. CMD vs. ENTRYPOINT
ENTRYPOINT๋ฅผ ์ฌ์ฉํ๋ฉด ๋ช
๋ น์ด ์ฌ์ฉ์์ ๋ ๊ฐํธํ์ง๋ง CMD๊ฐ ์ข๋ ๋ช
ํํ๊ธฐ ๋๋ฌธ์ CMD๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
2-2. Linux Docker Hub ์ฌ์ฉ
์ผ๋จ ๊ทธ๋ฅ ์ฌ์ฉํ๋ ค ๋์ ํ๋ค๋ฉด ๋ฌด์กฐ๊ฑด ์คํจํ๋ค.
์ด์ ๋ ๋์ปค ์์ฒด๊ฐ ๋ฆฌ๋
์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์
์๋์ฐ์ Mac๊ณผ๋ ๋ฌ๋ฆฌ HUB๋ผ๋ ์ฑ์ด ๋ฐ๋ก ์๋ค.
์ด๋ ๋์ปค์ ๊ฐ๋
์ ์กฐ๊ธ ์์์ผ ํ๋๋ฐ ๋ฆฌ๋
์ค์์์ ๋์ปค๋ ์์ง ํ๋์ด๋ค.
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ์๋ Desktop, Hub๊ฐ ๊ณต์กดํ๋ค๊ณ ์๊ฐํ๋ฉด ํธํ๋ค.
Hub๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
docker login -u (user-name)
password :
user-name๊ณผ password๋ฅผ ์ฑ์์ฃผ๋ฉด ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ค...
๋ง์ฝ ์ฌ๊ธฐ์ ์คํจํ๋ค๋ฉด ์๋ ๋ช
๋ น์ด๋ฅผ ์คํํด์
cd ~/.docker
config.json์ ์ญ์ ํด์ฃผ๋ฉด ๋๋ค.
sudo rm config.json
์ดํ $HOME์ผ๋ก ๊ฐ์ ๋ค์ ๋ก๊ทธ์ธ์ ์๋ํ๋ฉด ๋ ๊ฒ์ด๋ค.