์ฌ๋ด์์ ๊ณต๋ถํ๊ณ ์ฌ์ฉํ๊ณ ์๊ธด ํ์ง๋ง,
์ ํํ ๊ฐ๋
๋ ๋์ง์ด๋ณผ ๊ฒธ ์ ๋ฆฌ ๋ง๋์๋ ๋จ๊ฒจ๋๊ณ ์ถ์๋ค.
์ฒ์์ ์ด๋ ต๊ฒ๋ง ๋๊ปด์ก๋๋ฐ,
์ด์ "์ด๊ฒ ์์์ ๋ ์ด๋ป๊ฒ ๊ฐ๋ฐ ํ๊ฒฝ์ ๋ค ๋ง์ท๋?" ๋ผ๋ ์๊ฐ์ด ๋ ๋ค.
Go์ธ์ด๋ก ์์ฑ๋ ๋ฆฌ๋
์ค ์ปจํ
์ด๋ ๊ธฐ๋ฐ ์คํ์์ค ๊ฐ์ํ ํ๋ซํผ
โ ํน์ ํ ์๋น์ค๋ฅผ ํจํค์งํ๊ณ ๋ฐฐํฌํ๋๋ฐ ์ ์ฉํ ์คํ์์ค ํ๋ก๊ทธ๋จ
์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฏธ์ง(Image)๋ก ํจํค์งํ๊ณ , ์คํ ๊ฐ๋ฅํ ์ปจํ ์ด๋(Container)๋ก ๋์ฐ๋ ํ๋ซํผ
OS ์์ค์์ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ์ ๊ณตํด, ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ์ด์ ํ๊ฒฝ์ด ๋ฌ๋ผ๋ ๋์ผํ๊ฒ ๋์
๊ฐ์ ๋จธ์ (VM)๋ณด๋ค ํจ์ฌ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์คํ
ํ์ฉ ์์
์๋์ฐ์์๋ ๋์ปค ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊น?
- ์ปจํ ์ด๋๋ ๋ฆฌ๋ ์ค ์ปค๋ ๊ธฐ๋ฅ(Linux namespaces, cgroups ๋ฑ)์ ์ฌ์ฉํด์ ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ์ ๋ง๋ฆ
- Windows ์ปค๋์ ์ด๋ฐ ๊ธฐ๋ฅ์ ์ง์ํ์ง ์์
โ ๋ฐ๋ผ์ Windows์์ Docker๋ฅผ ์ฐ๋ ค๋ฉด Linux ์ปค๋์ด ํ์ํจ
โ ๋ณดํตWSL2(Windows Subsystem for Linux 2)๊ฐ์ํ ๊ธฐ์ ์ ์ฌ์ฉํจ
์ด๋ฏธ์ง๋ก๋ถํฐ ์์ฑ๋ ์คํ ๋จ์
์ปจํ ์ด๋๊ฐ ์๊ฒจ๋๊ฒ ๋ ์ญ์ฌ
1. ์ ํต์ ๋ฐฐํฌ (Traditional Deployment)
- ํ ๋์ ์ปดํจํฐ(์๋ฒ)์ ํ๋์ OS)๋ฅผ ์ค์นํ๊ณ ์ฌ๋ฌ ํ๋ก๊ทธ๋จ ์คํ
- ์: PC์ Windows ์ค์น โ ๊ฒ์, ์๋ํ๋ก์ธ์, ์ํ ๋ณด์ ํ๋ก๊ทธ๋จ ์ค์น
- ๋ฌธ์ ์ :
- ๋ณด์ ํ๋ก๊ทธ๋จ, ํ์ ํ๋ก๊ทธ๋จ ์ฆ๊ฐ โ ๋ฆฌ์์ค ์ฌ์ฉ๋ ์ฆ๊ฐ, ์๋ ์ ํ
- OS ๋จ์๋ก ๊ฒฉ๋ฆฌ๋์ง ์์ ํ๋ก๊ทธ๋จ ๊ฐ ์ถฉ๋ ๊ฐ๋ฅ
- ํ์ฅ/๋ฐฐํฌ ์ ์ฐ์ฑ ๋ถ์กฑ
2. ๊ฐ์ํ ๋ฐฐํฌ (Virtualized Deployment)
- ํ๋์ ์๋ฒ(OS) ์์ ์ฌ๋ฌ ๊ฐ์ ์ปดํจํฐ(VM)๋ฅผ ์์ฑ
- ํ์ดํผ๋ฐ์ด์ (Hypervisor)๊ฐ OS์ VM ์ฌ์ด ์ค๊ฐ ๊ณ์ธต ์ญํ
- VM๋ง๋ค OS ์ค์น ๊ฐ๋ฅ โ ํ๋ก๊ทธ๋จ ๋ ๋ฆฝ ์คํ
- ์ฅ์ :
- ํ๋ก๊ทธ๋จ ์ถฉ๋ ๊ฒฉ๋ฆฌ ๊ฐ๋ฅ
- ์ด์์ฒด์ ๋จ์๋ก ํ๊ฒฝ ๋ถ๋ฆฌ
- ๋จ์ :
- VM๋ง๋ค OS ํฌํจ โ ๋ฆฌ์์ค ์ฌ์ฉ๋ ๋ง์
- VM ๊ธฐ๋ ์๊ฐ ๋๋ฆผ
3. ์ปจํ ์ด๋ ๋ฐฐํฌ (Container Deployment)
- ํ์ดํผ๋ฐ์ด์ โ Container Runtime์ผ๋ก ๋์ฒด
- VM โ Container๋ก ๋์ฒด
- ์ปจํ ์ด๋๋ OS๋ฅผ ๋งค๋ฒ ์ค์นํ ํ์ ์์ด ์ปค๋์ ๊ณต์ ํ๋ฉด์ ํ๋ก๊ทธ๋จ ๊ฒฉ๋ฆฌ
- ์ฅ์ :
- ๊ฐ๋ณ๊ณ ๋น ๋ฆ โ OS ์ ์ฒด๋ฅผ ํฌํจํ์ง ์์
- ๋ฆฌ์์ค ํจ์จ์ โ ๋ ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์คํ ๊ฐ๋ฅ
- ๋ฐฐํฌ/ํ์ฅ ์ฉ์ด โ ์ด๋ฏธ์ง ๊ธฐ๋ฐ, ๋น ๋ฅธ ์์
- ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ ์ ๊ณต โ ํ๋ก๊ทธ๋จ ๊ฐ ์ถฉ๋ ์ต์ํ
Container Runtime: ์ปจํ ์ด๋๋ฅผ ์ค์ ๋ก ์คํํ๊ณ ๊ด๋ฆฌํ๋ ์ํํธ์จ์ด
๋ฐฐํฌ ๋ฐฉ์ OS ํฌํจ ์ฌ๋ถ ๊ฒฉ๋ฆฌ ์์ค ๋ฆฌ์์ค ํจ์จ ๊ธฐ๋ ์๋ ํน์ง ์ ํต์ ๋ฐฐํฌ OS 1๊ฐ ๋ฎ์ ๋ฎ์ ๋น ๋ฆ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ OS์์ ์คํ ๊ฐ์ํ ๋ฐฐํฌ (VM) VM๋ง๋ค OS ํฌํจ ๋์ ๋ฎ์ ๋๋ฆผ ํ๋ก๊ทธ๋จ ๊ฐ ์ถฉ๋ ๋ฐฉ์ง, OS ๋จ์ ๊ฒฉ๋ฆฌ ์ปจํ ์ด๋ ๋ฐฐํฌ OS ๊ณต์ , ์ปค๋๋ง ๋์ ๋์ ๋งค์ฐ ๋น ๋ฆ ํ๋ก๊ทธ๋จ ๋จ์ ๊ฒฉ๋ฆฌ, ๊ฒฝ๋, ๋ฐฐํฌ/ํ์ฅ ์ฉ์ด ์ฆ, ์ปจํ ์ด๋๋ ๊ธฐ์กด ์ ํต์ ๋ฐฐํฌ์ ๊ฐ์ํ ๋ฐฐํฌ์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ,
ํ๋ก๊ทธ๋จ ๋จ์ ๊ฒฉ๋ฆฌ์ ๊ฐ๋ฒผ์ด ๋ฆฌ์์ค ์ฌ์ฉ,
๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํด ํ๋ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์ ์ต์ ํ๋ ๋ฐฐํฌ ๋ฐฉ์์ ์ ๊ณตํจ
์ปจํ ์ด๋๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค๊ณ๋
๊ณ์ธต(Layer) ๊ตฌ์กฐ
RUN, COPY, ADD)๊ฐ ํ๋์ ๋ ์ด์ด๋ฅผ ์์ฑ๋ถ๋ณ์ฑ(Immutability)
๋ฒ์ ๊ด๋ฆฌ ๊ฐ๋ฅ(Tagging)
myapp:1.0, python:3.11-slim์ฒ๋ผ ํ๊ทธ๋ฅผ ๋ถ์ฌ ๋ฒ์ ๊ด๋ฆฌ ๊ฐ๋ฅ๋ฐฐํฌ ๋ฐ ๊ณต์ ๊ฐ๋ฅ

๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ํ์ผ
== ์ด๋ฏธ์ง์ ๋ด์ 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 | ์ปจํ ์ด๋ ์์ ์ ํญ์ ์คํ๋ ๋ช ๋ น์ด ์ง์ |
CMD | ENTRYPOINT์ ์ ๋ฌ๋ ๊ธฐ๋ณธ ์ธ์ ๋๋ ๋จ๋ ๋ช ๋ น์ด ์ง์ |
| ๋ช ๋ น์ด / 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 ls | Docker ๋คํธ์ํฌ ๋ชฉ๋ก ํ์ธ |
docker volume ls | Docker ๋ณผ๋ฅจ ๋ชฉ๋ก ํ์ธ |
docker volume create <๋ณผ๋ฅจ๋ช
> | ์๋ก์ด ๋ณผ๋ฅจ ์์ฑ |
docker volume rm <๋ณผ๋ฅจ๋ช
> | ๋ณผ๋ฅจ ์ญ์ |
์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ํ๋์ ์ค์ ํ์ผ๋ก ์ ์(์ปจํ ์ด๋๋ผ๋ฆฌ ํต์ ํฌํจ)ํ๊ณ , ํ ๋ฒ์ ์คํํ ์ ์๋ ๋๊ตฌ
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 ๋ฐ์ดํฐ ์์์ฑ ๋ณผ๋ฅจ
services
web, db, redis ๊ฐ๊ฐ์ ์ปจํ
์ด๋ ์ค์ ํฌํจbuild vs image
build: Dockerfile ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ง์ ๋น๋ (web ์๋น์ค)image: ์ด๋ฏธ ์กด์ฌํ๋ ์ด๋ฏธ์ง ์ฌ์ฉ (db, redis)volumes
./web:/app โ ๊ฐ๋ฐ ์ค ์ฝ๋ ๋ณ๊ฒฝ ์ฆ์ ์ปจํ
์ด๋์ ๋ฐ์db_data:/var/lib/postgresql/data โ DB ๋ฐ์ดํฐ ์์์ฑ ์ ์งdepends_on
web์ db์ redis๊ฐ ๋จผ์ ์์๋์ด์ผ ํจports
environment
docker-compose up -d # ๋ชจ๋ ์ปจํ
์ด๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ
docker-compose logs -f # ์ปจํ
์ด๋ ๋ก๊ทธ ์ค์๊ฐ ํ์ธ
docker-compose down # ์ปจํ
์ด๋ ์ข
๋ฃ ๋ฐ ๋คํธ์ํฌ/๋ณผ๋ฅจ ์ ๋ฆฌ
-d: ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํlogs -f: ๋ก๊ทธ ์ค์๊ฐ ์คํธ๋ฆฌ๋ฐdown์ ์ปจํ
์ด๋ ์ข
๋ฃ + ๋คํธ์ํฌ ์ ๊ฑฐ, ๋ณผ๋ฅจ์ ์ ์ง