๐Ÿ”จ[๊ฐœ๋ฐœ] Docker

manduยท2025๋…„ 9์›” 21์ผ

[๊ฐœ๋ฐœ]

๋ชฉ๋ก ๋ณด๊ธฐ
7/9

Docker์™€ ์ปจํ…Œ์ด๋„ˆ: ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ํ˜์‹ ์˜ ์‹œ์ž‘

์‚ฌ๋‚ด์—์„œ ๊ณต๋ถ€ํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธด ํ•˜์ง€๋งŒ,
์ •ํ™•ํ•œ ๊ฐœ๋…๋„ ๋˜์งš์–ด๋ณผ ๊ฒธ ์ •๋ฆฌ ๋งŒ๋‘์—๋„ ๋‚จ๊ฒจ๋‘๊ณ  ์‹ถ์—ˆ๋‹ค.
์ฒ˜์Œ์—” ์–ด๋ ต๊ฒŒ๋งŒ ๋А๊ปด์กŒ๋Š”๋ฐ,
์ด์ œ "์ด๊ฒŒ ์—†์—ˆ์„ ๋• ์–ด๋–ป๊ฒŒ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋‹ค ๋งž์ท„๋‚˜?" ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.


1. Docker์™€ ์ปจํ…Œ์ด๋„ˆ

1.1 Docker๋ž€?

Go์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์˜คํ”ˆ์†Œ์Šค ๊ฐ€์ƒํ™” ํ”Œ๋žซํผ
โ†’ ํŠน์ •ํ•œ ์„œ๋น„์Šค๋ฅผ ํŒจํ‚ค์ง•ํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š”๋ฐ ์œ ์šฉํ•œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ๊ทธ๋žจ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ด๋ฏธ์ง€(Image)๋กœ ํŒจํ‚ค์ง•ํ•˜๊ณ , ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ(Container)๋กœ ๋„์šฐ๋Š” ํ”Œ๋žซํผ

  • OS ์ˆ˜์ค€์—์„œ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•ด, ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์ด ๋‹ฌ๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘

  • ๊ฐ€์ƒ ๋จธ์‹ (VM)๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋ณ๊ณ  ๋น ๋ฅด๊ฒŒ ์‹คํ–‰

  • ํ™œ์šฉ ์˜ˆ์‹œ

    1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ฒฉ๋ฆฌ: ํ”„๋กœ์ ํŠธ๋งˆ๋‹ค Python, Node, DB ๋ฒ„์ „ ๋‹ฌ๋ผ๋„ ๋™์ผํ•œ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ ๊ฐ€๋Šฅ
    2. CI/CD ํŒŒ์ดํ”„๋ผ์ธ: ํ…Œ์ŠคํŠธ, ๋นŒ๋“œ, ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ์ปจํ…Œ์ด๋„ˆ ํ™œ์šฉ
    3. ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜: ์„œ๋น„์Šค๋ณ„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌ
    4. ๋กœ์ปฌ DB ํ…Œ์ŠคํŠธ: Postgres, MySQL ์ปจํ…Œ์ด๋„ˆ๋กœ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

์œˆ๋„์šฐ์—์„œ๋„ ๋„์ปค ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ• ๊นŒ?

  1. ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฆฌ๋ˆ…์Šค ์ปค๋„ ๊ธฐ๋Šฅ(Linux namespaces, cgroups ๋“ฑ)์„ ์‚ฌ์šฉํ•ด์„œ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์„ ๋งŒ๋“ฆ
  2. Windows ์ปค๋„์€ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ
    โ†’ ๋”ฐ๋ผ์„œ Windows์—์„œ Docker๋ฅผ ์“ฐ๋ ค๋ฉด Linux ์ปค๋„์ด ํ•„์š”ํ•จ
    โ†’ ๋ณดํ†ต WSL2(Windows Subsystem for Linux 2) ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•จ

1.2 ์ปจํ…Œ์ด๋„ˆ(Container)

์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ ์‹คํ–‰ ๋‹จ์œ„

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์„ค์ • ํŒŒ์ผ ๋“ฑ์„ ๋ชจ๋‘ ํฌํ•จ
  • ํ˜ธ์ŠคํŠธ OS์™€ ์ปค๋„์„ ๊ณต์œ ํ•˜๋ฏ€๋กœ VM๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ์™€ CPU ํšจ์œจ์ด ์ข‹์Œ
  • ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค ๊ณต๊ฐ„๊ณผ ํŒŒ์ผ ์‹œ์Šคํ…œ์„ ๊ฐ€์ง€๋ฉฐ, ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฒฉ๋ฆฌ๋จ

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ๊ฒจ๋‚˜๊ฒŒ ๋œ ์—ญ์‚ฌ

1. ์ „ํ†ต์  ๋ฐฐํฌ (Traditional Deployment)

  • ํ•œ ๋Œ€์˜ ์ปดํ“จํ„ฐ(์„œ๋ฒ„)์— ํ•˜๋‚˜์˜ OS)๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰
  • ์˜ˆ: PC์— Windows ์„ค์น˜ โ†’ ๊ฒŒ์ž„, ์›Œ๋“œํ”„๋กœ์„ธ์„œ, ์€ํ–‰ ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜
  • ๋ฌธ์ œ์ :
    1. ๋ณด์•ˆ ํ”„๋กœ๊ทธ๋žจ, ํ•„์ˆ˜ ํ”„๋กœ๊ทธ๋žจ ์ฆ๊ฐ€ โ†’ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€, ์†๋„ ์ €ํ•˜
    2. OS ๋‹จ์œ„๋กœ ๊ฒฉ๋ฆฌ๋˜์ง€ ์•Š์•„ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ์ถฉ๋Œ ๊ฐ€๋Šฅ
    3. ํ™•์žฅ/๋ฐฐํฌ ์œ ์—ฐ์„ฑ ๋ถ€์กฑ

2. ๊ฐ€์ƒํ™” ๋ฐฐํฌ (Virtualized Deployment)

  • ํ•˜๋‚˜์˜ ์„œ๋ฒ„(OS) ์œ„์— ์—ฌ๋Ÿฌ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ(VM)๋ฅผ ์ƒ์„ฑ
  • ํ•˜์ดํผ๋ฐ”์ด์ €(Hypervisor)๊ฐ€ OS์™€ VM ์‚ฌ์ด ์ค‘๊ฐ„ ๊ณ„์ธต ์—ญํ• 
    • VM๋งˆ๋‹ค OS ์„ค์น˜ ๊ฐ€๋Šฅ โ†’ ํ”„๋กœ๊ทธ๋žจ ๋…๋ฆฝ ์‹คํ–‰
  • ์žฅ์ :
    1. ํ”„๋กœ๊ทธ๋žจ ์ถฉ๋Œ ๊ฒฉ๋ฆฌ ๊ฐ€๋Šฅ
    2. ์šด์˜์ฒด์ œ ๋‹จ์œ„๋กœ ํ™˜๊ฒฝ ๋ถ„๋ฆฌ
  • ๋‹จ์ :
    1. VM๋งˆ๋‹ค OS ํฌํ•จ โ†’ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰ ๋งŽ์Œ
    2. VM ๊ธฐ๋™ ์‹œ๊ฐ„ ๋А๋ฆผ

3. ์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌ (Container Deployment)

  • ํ•˜์ดํผ๋ฐ”์ด์ € โ†’ Container Runtime์œผ๋กœ ๋Œ€์ฒด
  • VM โ†’ Container๋กœ ๋Œ€์ฒด
  • ์ปจํ…Œ์ด๋„ˆ๋Š” OS๋ฅผ ๋งค๋ฒˆ ์„ค์น˜ํ•  ํ•„์š” ์—†์ด ์ปค๋„์„ ๊ณต์œ ํ•˜๋ฉด์„œ ํ”„๋กœ๊ทธ๋žจ ๊ฒฉ๋ฆฌ
  • ์žฅ์ :
    1. ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ„ โ†’ OS ์ „์ฒด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Œ
    2. ๋ฆฌ์†Œ์Šค ํšจ์œจ์  โ†’ ๋” ๋งŽ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ๊ฐ€๋Šฅ
    3. ๋ฐฐํฌ/ํ™•์žฅ ์šฉ์ด โ†’ ์ด๋ฏธ์ง€ ๊ธฐ๋ฐ˜, ๋น ๋ฅธ ์‹œ์ž‘
    4. ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ ์ œ๊ณต โ†’ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ์ถฉ๋Œ ์ตœ์†Œํ™”

Container Runtime: ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด

๋ฐฐํฌ ๋ฐฉ์‹OS ํฌํ•จ ์—ฌ๋ถ€๊ฒฉ๋ฆฌ ์ˆ˜์ค€๋ฆฌ์†Œ์Šค ํšจ์œจ๊ธฐ๋™ ์†๋„ํŠน์ง•
์ „ํ†ต์  ๋ฐฐํฌOS 1๊ฐœ๋‚ฎ์Œ๋‚ฎ์Œ๋น ๋ฆ„๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ™์€ OS์—์„œ ์‹คํ–‰
๊ฐ€์ƒํ™” ๋ฐฐํฌ (VM)VM๋งˆ๋‹ค OS ํฌํ•จ๋†’์Œ๋‚ฎ์Œ๋А๋ฆผํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ์ถฉ๋Œ ๋ฐฉ์ง€, OS ๋‹จ์œ„ ๊ฒฉ๋ฆฌ
์ปจํ…Œ์ด๋„ˆ ๋ฐฐํฌOS ๊ณต์œ , ์ปค๋„๋งŒ๋†’์Œ๋†’์Œ๋งค์šฐ ๋น ๋ฆ„ํ”„๋กœ๊ทธ๋žจ ๋‹จ์œ„ ๊ฒฉ๋ฆฌ, ๊ฒฝ๋Ÿ‰, ๋ฐฐํฌ/ํ™•์žฅ ์šฉ์ด

์ฆ‰, ์ปจํ…Œ์ด๋„ˆ๋Š” ๊ธฐ์กด ์ „ํ†ต์  ๋ฐฐํฌ์™€ ๊ฐ€์ƒํ™” ๋ฐฐํฌ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ณ ,
ํ”„๋กœ๊ทธ๋žจ ๋‹จ์œ„ ๊ฒฉ๋ฆฌ์™€ ๊ฐ€๋ฒผ์šด ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ,
๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด ํ˜„๋Œ€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ํ™˜๊ฒฝ์— ์ตœ์ ํ™”๋œ ๋ฐฐํฌ ๋ฐฉ์‹์„ ์ œ๊ณตํ•จ

1.3 ์ด๋ฏธ์ง€(Image)

์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์„ค๊ณ„๋„

  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰์— ํ•„์š”ํ•œ ์ฝ”๋“œ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ™˜๊ฒฝ ์„ค์ •, OS ๋ ˆ์ด์–ด ๋“ฑ ๋ชจ๋‘ ํฌํ•จ

์ด๋ฏธ์ง€ ํŠน์ง•

  1. ๊ณ„์ธต(Layer) ๊ตฌ์กฐ

    • Docker ์ด๋ฏธ์ง€๋Š” ์—ฌ๋Ÿฌ ๋ ˆ์ด์–ด(layer)๋กœ ๊ตฌ์„ฑ๋จ
    • ๊ฐ ๋ช…๋ น์–ด(RUN, COPY, ADD)๊ฐ€ ํ•˜๋‚˜์˜ ๋ ˆ์ด์–ด๋ฅผ ์ƒ์„ฑ
    • ๋ ˆ์ด์–ด ๋‹จ์œ„๋กœ ์บ์‹ฑ ๊ฐ€๋Šฅ โ†’ ๋นŒ๋“œ ์†๋„ ํ–ฅ์ƒ
  2. ๋ถˆ๋ณ€์„ฑ(Immutability)

    • Read-only
    • ์ด๋ฏธ์ง€ ์ž์ฒด๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ
    • ์ปจํ…Œ์ด๋„ˆ์—์„œ ํŒŒ์ผ ์ˆ˜์ •์€ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ด์–ด์—์„œ๋งŒ ์ ์šฉ
  3. ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ(Tagging)

    • myapp:1.0, python:3.11-slim์ฒ˜๋Ÿผ ํƒœ๊ทธ๋ฅผ ๋ถ™์—ฌ ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
    • ๋™์ผํ•œ ์ด๋ฏธ์ง€ ์ด๋ฆ„์ด๋ผ๋„ ํƒœ๊ทธ๋กœ ๊ตฌ๋ถ„
  4. ๋ฐฐํฌ ๋ฐ ๊ณต์œ  ๊ฐ€๋Šฅ

    • Docker Hub, ์‚ฌ์„ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์—…๋กœ๋“œ ๊ฐ€๋Šฅ
    • ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž, ์„œ๋ฒ„์—์„œ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›์•„ ์‹คํ–‰ ๊ฐ€๋Šฅ

1.4 Docker File

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ํŒŒ์ผ
== ์ด๋ฏธ์ง€์— ๋‹ด์„ Bash ๋ช…๋ น์–ด๋ฅผ ๋ชจ๋‘ ๋‚˜์—ดํ•œ ํŒŒ์ผ

# 1. ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€
FROM python:3.11-slim

# 2. ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (์ด๋ฏธ์ง€ ์ œ์ž‘์ž, ๋ฒ„์ „ ๋“ฑ)
LABEL maintainer="yourname@example.com"
LABEL version="1.0"
LABEL description="My Python App Docker Image"

# 3. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
ENV APP_ENV=production
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# 4. ์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ • (์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€)
WORKDIR /app

# 5. ์˜์กด์„ฑ ์„ค์น˜
#    requirements.txt๋ฅผ ๋ณต์‚ฌํ•˜๊ณ  pip๋กœ ์„ค์น˜
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 6. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์†Œ์Šค ์ฝ”๋“œ ๋ณต์‚ฌ
COPY . .

# 7. ํฌํŠธ ๋…ธ์ถœ
EXPOSE 8000

# 8. ๋ณผ๋ฅจ ์„ค์ • (๋ฐ์ดํ„ฐ ์˜์†์„ฑ)
VOLUME ["/app/data"]

# 9. ์‚ฌ์šฉ์ž ์„ค์ • (root ๋Œ€์‹  ์•ˆ์ „ํ•œ ์‚ฌ์šฉ์ž ์‹คํ–‰)
RUN useradd -m myuser
USER myuser

# 10. Entrypoint
#     ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ ์ดˆ๊ธฐํ™” ๋ช…๋ น
ENTRYPOINT ["python"]

# 11. CMD
#     ENTRYPOINT์— ์ „๋‹ฌ๋  ๊ธฐ๋ณธ ์ธ์ž
CMD ["app.py"]
๋ช…๋ น์–ด์„ค๋ช…
FROM <์ด๋ฏธ์ง€>๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€ ์ง€์ •. OS, ์–ธ์–ด ๋Ÿฐํƒ€์ž„, ํ”„๋ ˆ์ž„์›Œํฌ ํฌํ•จ
LABEL์ด๋ฏธ์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ • (์ž‘์„ฑ์ž, ๋ฒ„์ „, ์„ค๋ช… ๋“ฑ)
ENVํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
WORKDIR์ž‘์—… ๋””๋ ‰ํ† ๋ฆฌ ์„ค์ •. ์ดํ›„ ๋ช…๋ น(COPY, RUN ๋“ฑ)์— ๊ธฐ๋ณธ ๊ฒฝ๋กœ๋กœ ์‚ฌ์šฉ
COPYํŒŒ์ผ ๋˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ๋ณต์‚ฌ. COPY src dest
RUN์ด๋ฏธ์ง€ ๋นŒ๋“œ ์‹œ ๋ช…๋ น ์‹คํ–‰. ํŒจํ‚ค์ง€ ์„ค์น˜, OS ์—…๋ฐ์ดํŠธ ๋“ฑ
EXPOSE์ปจํ…Œ์ด๋„ˆ ์™ธ๋ถ€์— ๋…ธ์ถœํ•  ํฌํŠธ ์ง€์ •
VOLUME์ปจํ…Œ์ด๋„ˆ์™€ ํ˜ธ์ŠคํŠธ ๊ฐ„ ๊ณต์œ  ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ํ™•๋ณด
USER์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‚ฌ์šฉ์ž ์ง€์ •. root๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋กœ ์‹คํ–‰ ๊ถŒ์žฅ
ENTRYPOINT์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ํ•ญ์ƒ ์‹คํ–‰๋  ๋ช…๋ น์–ด ์ง€์ •
CMDENTRYPOINT์— ์ „๋‹ฌ๋  ๊ธฐ๋ณธ ์ธ์ž ๋˜๋Š” ๋‹จ๋… ๋ช…๋ น์–ด ์ง€์ •

2. Docker ๊ธฐ๋ณธ ๋ช…๋ น์–ด

๋ช…๋ น์–ด / Dockerfile์„ค๋ช…
docker --version์„ค์น˜๋œ Docker ๋ฒ„์ „ ํ™•์ธ
docker pull <์ด๋ฏธ์ง€>์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ
docker images๋กœ์ปฌ ์ด๋ฏธ์ง€ ํ™•์ธ
docker rmi <์ด๋ฏธ์ง€>์ด๋ฏธ์ง€ ์‚ญ์ œ
docker build -t <์ด๋ฏธ์ง€๋ช…> .ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ Dockerfile๋กœ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
docker tag <์ด๋ฏธ์ง€> <๋ ˆํฌ์ง€ํ† ๋ฆฌ/ํƒœ๊ทธ>์ด๋ฏธ์ง€์— ํƒœ๊ทธ ์ง€์ •, ๋ ˆํฌ์ง€ํ† ๋ฆฌ ์—…๋กœ๋“œ ์ „์šฉ
docker push <๋ ˆํฌ์ง€ํ† ๋ฆฌ/ํƒœ๊ทธ>์ด๋ฏธ์ง€ ์›๊ฒฉ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์—…๋กœ๋“œ
docker run <์˜ต์…˜> <์ด๋ฏธ์ง€>์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker ps์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ
docker ps -a๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ
docker stop <์ปจํ…Œ์ด๋„ˆ>์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ
docker start <์ปจํ…Œ์ด๋„ˆ>์ข…๋ฃŒ๋œ ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
docker restart <์ปจํ…Œ์ด๋„ˆ>์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
docker rm <์ปจํ…Œ์ด๋„ˆ>์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ
docker exec -it <์ปจํ…Œ์ด๋„ˆ> bash์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ์ ‘์†
docker logs <์ปจํ…Œ์ด๋„ˆ>์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ
docker inspect <์ปจํ…Œ์ด๋„ˆ>์ปจํ…Œ์ด๋„ˆ/์ด๋ฏธ์ง€ ์ƒ์„ธ ์ •๋ณด ํ™•์ธ
docker network lsDocker ๋„คํŠธ์›Œํฌ ๋ชฉ๋ก ํ™•์ธ
docker volume lsDocker ๋ณผ๋ฅจ ๋ชฉ๋ก ํ™•์ธ
docker volume create <๋ณผ๋ฅจ๋ช…>์ƒˆ๋กœ์šด ๋ณผ๋ฅจ ์ƒ์„ฑ
docker volume rm <๋ณผ๋ฅจ๋ช…>๋ณผ๋ฅจ ์‚ญ์ œ

3. Docker Compose

์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜์˜ ์„ค์ • ํŒŒ์ผ๋กœ ์ •์˜(์ปจํ…Œ์ด๋„ˆ๋ผ๋ฆฌ ํ†ต์‹  ํฌํ•จ)ํ•˜๊ณ , ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ

  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์›น ์„œ๋ฒ„, DB, ์บ์‹œ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค ๋“ฑ ๋‹ค์ˆ˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋™์‹œ์— ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋„คํŠธ์›Œํฌ, ๋ณผ๋ฅจ, ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋“ฑ ์„ค์ •์„ ํ†ตํ•ฉ ๊ด€๋ฆฌ

docker-compose.yml ์˜ˆ์‹œ (์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์„ฑ)

version: "3.9"

services:
  web:
    build: ./web           # ./web ํด๋”์˜ Dockerfile๋กœ ์ด๋ฏธ์ง€ ๋นŒ๋“œ (์ด๋ฏธ์ง€ ์—†์ด ์ง์ ‘ ๋นŒ๋“œ)
    container_name: myapp_web
    ports:
      - "8000:8000"       # ํ˜ธ์ŠคํŠธ 8000 โ†’ ์ปจํ…Œ์ด๋„ˆ 8000
    volumes:
      - ./web:/app        # ์†Œ์Šค ์ฝ”๋“œ ์‹ค์‹œ๊ฐ„ ๋ฐ˜์˜
    environment:
      - APP_ENV=development
    depends_on:
      - db
      - redis

  db:
    image: postgres:15
    container_name: myapp_db
    environment:
      POSTGRES_USER: myuser
      POSTGRES_PASSWORD: mypassword
      POSTGRES_DB: mydatabase
    ports:
      - "5432:5432"
    volumes:
      - db_data:/var/lib/postgresql/data  # ๋ฐ์ดํ„ฐ ์˜์†์„ฑ

  redis:
    image: redis:7
    container_name: myapp_redis
    ports:
      - "6379:6379"

volumes:
  db_data:                   # Postgres ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ๋ณผ๋ฅจ

์„ค๋ช…

  1. services

    • ๊ฐ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋ฅผ ์ •์˜
    • web, db, redis ๊ฐ๊ฐ์˜ ์ปจํ…Œ์ด๋„ˆ ์„ค์ • ํฌํ•จ
    • ๋„คํŠธ์›Œํฌ ์•ˆ์—์„œ๋Š” ๊ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์„œ๋น„์Šค ์ด๋ฆ„์„ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  2. build vs image

    • build: Dockerfile ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ง์ ‘ ๋นŒ๋“œ (web ์„œ๋น„์Šค)
    • image: ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ด๋ฏธ์ง€ ์‚ฌ์šฉ (db, redis)
  3. volumes

    • ์†Œ์Šค ์ฝ”๋“œ๋‚˜ DB ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ŠคํŠธ์™€ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์˜์†ํ™”
    • ./web:/app โ†’ ๊ฐœ๋ฐœ ์ค‘ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ฆ‰์‹œ ์ปจํ…Œ์ด๋„ˆ์— ๋ฐ˜์˜
    • db_data:/var/lib/postgresql/data โ†’ DB ๋ฐ์ดํ„ฐ ์˜์†์„ฑ ์œ ์ง€
  4. depends_on

    • ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์ˆœ์„œ๋ฅผ ์ง€์ •
    • web์€ db์™€ redis๊ฐ€ ๋จผ์ € ์‹œ์ž‘๋˜์–ด์•ผ ํ•จ
  5. ports

    • ํ˜ธ์ŠคํŠธ โ†” ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ ๋งคํ•‘
    • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ธŒ๋ผ์šฐ์ € ์ ‘์† ๋ฐ ์™ธ๋ถ€ ์„œ๋น„์Šค ์—ฐ๊ฒฐ ๊ฐ€๋Šฅ
  6. environment

    • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ณ„์ •, ์•ฑ ํ™˜๊ฒฝ ๋“ฑ ์ •์˜

์‹คํ–‰ ๋ฐฉ๋ฒ•

docker-compose up -d     # ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰
docker-compose logs -f   # ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ํ™•์ธ
docker-compose down      # ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ๋ฐ ๋„คํŠธ์›Œํฌ/๋ณผ๋ฅจ ์ •๋ฆฌ
  • -d: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰
  • logs -f: ๋กœ๊ทธ ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ
  • down์€ ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ + ๋„คํŠธ์›Œํฌ ์ œ๊ฑฐ, ๋ณผ๋ฅจ์€ ์œ ์ง€
profile
๋งŒ๋‘๋Š” ๋ชฉ๋ง๋ผ

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