๐Ÿ“’ Docker(2)

Kimdongkiยท2024๋…„ 5์›” 27์ผ

DB

๋ชฉ๋ก ๋ณด๊ธฐ
21/33

๐Ÿ“Œ 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 ์•ˆ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.
    • docker run...

4. Docker Image์˜ ๋“ฑ๋ก : Docker Hub

  • Docker Regustry๋Š” Docker Image๋“ค์˜ ๋ณด๊ด€์†Œ์ด๋‹ค.
    • On-prem registry์™€ Cloud registry๊ฐ€ ์กด์žฌํ•œ๋‹ค.
    • docker hub์ด ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๋‹ค.
  • ์—ฌ๊ธฐ์— ๋“ฑ๋กํ•˜๋ฉด ํšŒ์‚ฌ๋‚ด ํ˜น์€ ํผ๋ธ”๋ฆญํ•˜๊ฒŒ ์ด๋ฏธ์ง€๋ฅผ ๊ณต์œ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” Docker Desktop์— ๋กœ๊ทธ์ธ์„ ํ•˜๋ ค๋ฉด ์•„๋ž˜ ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉด ๋œ๋‹ค.
    • ๋จผ์ € GPGํ‚ค๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
      • gpg --generate-key
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 app.js
  • 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์œผ๋กœ ๊ฐ€์„œ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๋ฉด ๋ ๊ฒƒ์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€