Docker ์ ๋ฌธ — ์ปจํ ์ด๋·์ด๋ฏธ์ง·Compose ํ ๋ฒ์ ์ ๋ฆฌ. "๋ด ์ปดํจํฐ์์ ๋๋๋ฐ"๋ผ๋ ๋ง์ด ์ฌ๋ผ์ง๋ ์ด์ ๊ฐ Docker๋ค. ์ปจํ ์ด๋๊ฐ ๋ฌด์์ธ์ง๋ถํฐ ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ(Dockerfile), ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ๋ฌถ๋ docker compose๊น์ง, ์ค์ ๋ช ๋ น๊ณผ ์ถ๋ ฅ์ ํจ๊ป ์ ๋ฆฌํ๋ค.

๋ค์ด๊ฐ๋ฉฐ
์ ํ์์ด ๋ค์ด์๋ค. ํ๋ก์ ํธ๋ฅผ ๋ฐ์ ์คํํ๋ ค๋๋ฐ, Node ๋ฒ์ ์ด ์ ๋ง๊ณ , ๋ก์ปฌ PostgreSQL์ด ์๊ณ , ํ๊ฒฝ ๋ณ์๊ฐ ๋น ์ก๋ค. ๋ฐ๋์ ์ ํ๊ฒฝ ์ธํ ์ ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง์ ๋ฐฐํฌํ๋ฉด ๋ ํฐ์ง๋ค — "์ ์ปดํจํฐ์์ ๋๋๋ฐ์."
์ด ๊ณ ์ง์ ์ธ ๋ฌธ์ ๋ฅผ ๊ฑฐ์ ์ฌ๋ผ์ง๊ฒ ๋ง๋ ๋๊ตฌ๊ฐ Docker๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ทธ ์คํ ํ๊ฒฝ(OS ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ๋ฐํ์, ์์กด์ฑ, ์ค์ )๊น์ง ํต์งธ๋ก ์ปจํ ์ด๋(container)๋ผ๋ ์์์ ๋ด์, ์ด๋์๋ ๋๊ฐ์ด ์คํ๋๊ฒ ํ๋ค. ๊ฐ๋ฐ์ PC, ๋๋ฃ PC, ์ด์ ์๋ฒ์์ ๊ฐ์ ์์๊ฐ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋๋ค.
Docker์ ํต์ฌ ํ ์ค: ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ทธ ์คํ ํ๊ฒฝ์ ํ๋๋ก ๋ฌถ์ด, ์ด๋์๋ ๋์ผํ๊ฒ ์คํํ๋ค. ํ๊ฒฝ์ด ์ฝ๋๊ฐ ๋๋ ์๊ฐ, "๋ด ์ปดํจํฐ์์ ๋๋๋ฐ"๊ฐ ์ฌ๋ผ์ง๋ค.
์ด ๊ธ์์๋ ์ปจํ
์ด๋๊ฐ ๋ฌด์์ธ์ง(๊ฐ์ ๋จธ์ ๊ณผ ๋ฌด์์ด ๋ค๋ฅธ์ง)๋ถํฐ ์์ํด, ์ด๋ฏธ์ง·์ปจํ
์ด๋·๋ ์ง์คํธ๋ฆฌ ๊ฐ๋
์ ์ก๊ณ , Dockerfile๋ก ์ง์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ , ๋ณผ๋ฅจ·๋คํธ์ํฌ๋ฅผ ๋ค๋ฃจ๊ณ , ๋ง์ง๋ง์ผ๋ก docker compose๋ก ์ฌ๋ฌ ์ปจํ
์ด๋๋ฅผ ํ ๋ฒ์ ๋์ฐ๋ ๋ฐ๊น์ง ๊ฐ๋ค. ๋ชจ๋ ๋ช
๋ น์ ์ค์ ์ถ๋ ฅ๊ณผ ํจ๊ป ๋ณธ๋ค.
1. Docker๋ ๋ฌด์์ธ๊ฐ — ์ปจํ ์ด๋์ ๊ฐ๋
์ปจํ ์ด๋๋ ํธ์คํธ OS ์์์ ๊ฒฉ๋ฆฌ๋์ด ๋๋ ํ๋์ ํ๋ก์ธ์ค ๋ฌถ์์ด๋ค. ์๊ธฐ๋ง์ ํ์ผ ์์คํ , ๋คํธ์ํฌ, ํ๋ก์ธ์ค ๊ณต๊ฐ์ ๊ฐ์ง๋ง, ๊ทธ ์๋ ์ด์์ฒด์ ์ปค๋์ ํธ์คํธ์ ๊ณต์ ํ๋ค. ์ด "์ปค๋ ๊ณต์ "๊ฐ ๊ฐ์ ๋จธ์ (VM)๊ณผ์ ๊ฒฐ์ ์ ์ฐจ์ด๋ค.
๊ฐ์ ๋จธ์ ์ ํ์ดํผ๋ฐ์ด์ ์์ ์ฑ๋ง๋ค ๊ฒ์คํธ OS๋ฅผ ํต์งธ๋ก ์ฌ๋ฆฐ๋ค. ๊ทธ๋์ ๋ฌด๊ฒ๊ณ (์ GB), ๋ถํ ๋ ์์ญ ์ด ๊ฑธ๋ฆฐ๋ค. ๋ฐ๋ฉด ์ปจํ ์ด๋๋ ๊ฒ์คํธ OS ์์ด ํธ์คํธ ์ปค๋์ ํจ๊ป ์ฐ๋ฏ๋ก, ํฌ๊ธฐ๋ ์์ญ~์๋ฐฑ MB์ ์์์ ๋ณดํต 1์ด ์์ชฝ์ด๋ค.

์ ๋ฆฌํ๋ฉด, ์ปจํ ์ด๋๋ "VM๋งํผ ๊ฒฉ๋ฆฌ๋๋ฉด์ ํ๋ก์ธ์ค๋งํผ ๊ฐ๋ฒผ์ด" ์ ์ถฉ์ ์ด๋ค. ๊ทธ๋์ ํ ์๋ฒ์ ์์ญ ๊ฐ๋ฅผ ๋์ฐ๊ณ , ์ด ๋จ์๋ก ์ผ๊ณ ๋๊ณ , ๋๊ฐ์ ๋ณต์ ๋ณธ์ ๋ฌดํ์ ์ฐ์ด๋ผ ์ ์๋ค. ์ด ํน์ฑ์ด ๋ง์ดํฌ๋ก์๋น์ค·CI/CD·์คํ ์ค์ผ์ผ๋ง์ ๊ฐ๋ฅํ๊ฒ ํ ํ ๋๋ค.
2. ํต์ฌ ๊ฐ๋ — ์ด๋ฏธ์ง, ์ปจํ ์ด๋, ๋ ์ง์คํธ๋ฆฌ
Docker๋ฅผ ์ดํดํ๋ ค๋ฉด ์ธ ๋จ์ด๋ง ์ก์ผ๋ฉด ๋๋ค.
- ์ด๋ฏธ์ง(Image) — ์คํ์ ํ์ํ ๋ชจ๋ ๊ฒ(๋ฒ ์ด์ค OS, ๋ฐํ์, ์ฝ๋, ์์กด์ฑ, ์ค์ )์ ๋ด์ ์ฝ๊ธฐ ์ ์ฉ ํ ํ๋ฆฟ. ํ ๋ฒ ๋ง๋ค๋ฉด ๋ณํ์ง ์๋๋ค.
- ์ปจํ ์ด๋(Container) — ์ด๋ฏธ์ง๋ฅผ ์คํํ ์ธ์คํด์ค. ๊ฐ์ ์ด๋ฏธ์ง๋ก ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋์ธ ์ ์๊ณ , ๊ฐ์ ๋ ๋ฆฝ์ ์ผ๋ก ๋๋ฉฐ, ์ญ์ ํ๋ฉด ์ฌ๋ผ์ง๋ค.
- ๋ ์ง์คํธ๋ฆฌ(Registry) — ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ·๊ณต์ ํ๋ ์ ์ฅ์. ๊ณต๊ฐ ๋ ์ง์คํธ๋ฆฌ๊ฐ Docker Hub์ด๊ณ ,
nginx·postgres๊ฐ์ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ๊ธฐ์ ๋ฐ๋๋ค(docker pull).
๊ฐ์ฒด์งํฅ์ ๋น๋๋ฉด ์ด๋ฏธ์ง๋ ํด๋์ค, ์ปจํ ์ด๋๋ ์ธ์คํด์ค๋ค. ํด๋์ค ํ๋๋ก ๊ฐ์ฒด๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฐ์ด๋ด๋ฏ, ์ด๋ฏธ์ง ํ๋๋ก ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ ๋ค. ์๋ฆฌ์ ๋น๋๋ฉด ์ด๋ฏธ์ง๋ ๋ ์ํผ, ์ปจํ ์ด๋๋ ๊ทธ ๋ ์ํผ๋ก ๋ง๋ ์๋ฆฌ๋ค.
3. ์ค์นํ๊ณ ์ฒซ ์ปจํ ์ด๋ ์คํํ๊ธฐ
์ค์น๋ ์ด์์ฒด์ ๋ณ Docker Desktop(Windows·macOS) ๋๋ Docker Engine(Linux)์ผ๋ก ํ๋ค. ์ค์น๋๋ฉด ๊ฐ์ฅ ๋จผ์ ๋์ ํ์ธ์ ํ๋ค.
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
์ด์ ์ง์ง ์๋ฒ ํ๋๋ฅผ ๋์๋ณด์. ์น ์๋ฒ nginx๋ฅผ ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํํ๋ค.
docker run -d -p 8080:80 --name web nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
... Pull complete
Status: Downloaded newer image for nginx:latest
9c2f3a1be1a3f0c8d4b7e6a5c1d2e3f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0
์ต์ ์ ์๋ฏธ๋ ์ด๋ ๋ค.
-d(detached) — ๋ฐฑ๊ทธ๋ผ์ด๋๋ก ์คํ. ํฐ๋ฏธ๋์ ์ ์ ํ์ง ์๋๋ค.-p 8080:80— ํธ์คํธ์ 8080 ํฌํธ๋ฅผ ์ปจํ ์ด๋์ 80 ํฌํธ๋ก ์ฐ๊ฒฐ. ๋ธ๋ผ์ฐ์ ์์localhost:8080์ผ๋ก ์ ์ํ๋ฉด ์ปจํ ์ด๋ ์ nginx๊ฐ ์๋ตํ๋ค.--name web— ์ปจํ ์ด๋์ ์ด๋ฆ ๋ถ์ฌ. ์ดํ ๋ช ๋ น์์ ์ด ์ด๋ฆ์ผ๋ก ๊ฐ๋ฆฌํจ๋ค.
๋ก์ปฌ์ ์ด๋ฏธ์ง๊ฐ ์์ผ๋ฉด Docker Hub์์ ์๋์ผ๋ก ๋ฐ์์จ๋ค(Unable to find ... locally → Pulling). ์คํ ์ค์ธ ์ปจํ
์ด๋๋ฅผ ํ์ธํ๋ค.
docker ps
CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
9c2f3a1be1a3 nginx "/docker-entrypoint.…" Up 5 seconds 0.0.0.0:8080->80/tcp web
์์ฃผ ์ฐ๋ ๊ธฐ๋ณธ ๋ช ๋ น์ ๋ค์๊ณผ ๊ฐ๋ค.
docker images # ๋ก์ปฌ์ ๋ฐ์๋ ์ด๋ฏธ์ง ๋ชฉ๋ก
docker logs web # ์ปจํ
์ด๋ web์ ๋ก๊ทธ ๋ณด๊ธฐ
docker exec -it web bash # ์คํ ์ค์ธ ์ปจํ
์ด๋ ์์ผ๋ก ์
ธ ์ง์
docker stop web # ์ปจํ
์ด๋ ์ค์ง
docker rm web # ์ค์ง๋ ์ปจํ
์ด๋ ์ญ์
docker rmi nginx # ์ด๋ฏธ์ง ์ญ์
์ฌ๊ธฐ์ ์ค์ํ ๊ฐ๊ฐ ํ๋. ์ปจํ ์ด๋๋ ์ธ์ ๋ ๋ฒ๋ฆด ์ ์๋ ์ผํ์ฉ์ด๋ผ๋ ์ ์ด๋ค. ๋ฌธ์ ๊ฐ ์๊ธฐ๋ฉด ๊ณ ์น๊ธฐ๋ณด๋ค ์ง์ฐ๊ณ ๋ค์ ๋์ด๋ค. ์ด "์ง์ฐ๊ณ ๋ค์ ๋ง๋ ๋ค"๊ฐ Docker ์ด์์ ๊ธฐ๋ณธ ํ๋๋ค.
4. ์ด๋ฏธ์ง ์ง์ ๋ง๋ค๊ธฐ — Dockerfile
๋จ์ด ๋ง๋ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์ ์ฐ๋ ๊ฑธ ๋์ด, ๋ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ด๋ฏธ์ง๋ก ๋ง๋ค์ด์ผ ์ง์ง ์์์ด๋ค. ๊ทธ ์ค๊ณ๋๊ฐ Dockerfile์ด๋ค. ํ๋ก์ ํธ ๋ฃจํธ์ Dockerfile์ด๋ผ๋ ํ์ผ์ ๋ง๋ค๊ณ ๋ช
๋ น์ ์์์ ์๋๋ก ์ ๋๋ค.
# 1. ๋ฒ ์ด์ค ์ด๋ฏธ์ง — Node.js 20 (๊ฐ๋ฒผ์ด alpine ๋ฒ์ )
FROM node:20-alpine
# 2. ์ปจํ
์ด๋ ์์์ ์์
ํ ๋๋ ํฐ๋ฆฌ
WORKDIR /app
# 3. ์์กด์ฑ ์ ์ ํ์ผ๋ถํฐ ๋ณต์ฌ (์บ์ ์ต์ ํ — ์๋ ์ค๋ช
)
COPY package*.json ./
RUN npm install
# 4. ๋๋จธ์ง ์์ค ์ฝ๋ ๋ณต์ฌ
COPY . .
# 5. ์ฑ์ด ์ฌ์ฉํ๋ ํฌํธ (๋ฌธ์ํ ๋ชฉ์ )
EXPOSE 3000
# 6. ์ปจํ
์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช
๋ น
CMD ["npm", "start"]
์ฃผ์ ๋ช ๋ น์ด์ ์ญํ ์ ์ด๋ ๋ค.
- FROM — ์ถ๋ฐ์ ์ด ๋๋ ๋ฒ ์ด์ค ์ด๋ฏธ์ง. ๋ชจ๋ Dockerfile์ ์ฌ๊ธฐ์ ์์ํ๋ค.
- WORKDIR — ์ดํ ๋ช ๋ น์ด ์คํ๋ ์์ ๋๋ ํฐ๋ฆฌ.
- COPY — ํธ์คํธ์ ํ์ผ์ ์ด๋ฏธ์ง ์์ผ๋ก ๋ณต์ฌ.
- RUN — ์ด๋ฏธ์ง๋ฅผ ๋ง๋๋ ์์ ์ ์คํํ ๋ช ๋ น(์์กด์ฑ ์ค์น ๋ฑ).
- EXPOSE — ์ปจํ
์ด๋๊ฐ ์ฌ์ฉํ๋ ํฌํธ๋ฅผ ๋ช
์(์ค์ ๊ฐ๋ฐฉ์
-p๋ก). - CMD — ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํํ ๊ธฐ๋ณธ ๋ช ๋ น.
์์ฑํ์ผ๋ฉด ๋น๋ํ๋ค. -t๋ก ์ด๋ฆ(ํ๊ทธ)์ ๋ถ์ด๊ณ , ๋ง์ง๋ง .์ ๋น๋ ์ปจํ
์คํธ(ํ์ฌ ํด๋)๋ค.
docker build -t myapp:1.0 .
[+] Building 12.3s (10/10) FINISHED
=> [internal] load build definition from Dockerfile
=> [1/4] FROM docker.io/library/node:20-alpine
=> [2/4] WORKDIR /app
=> [3/4] COPY package*.json ./
=> [4/4] RUN npm install
=> exporting to image
=> => naming to docker.io/library/myapp:1.0
๋น๋๊ฐ ๋๋๋ฉด docker run -d -p 8080:3000 myapp:1.0์ผ๋ก ๋ด ์ฑ ์ปจํ
์ด๋๋ฅผ ๋์ธ ์ ์๋ค.
๋ ์ด์ด์ ์บ์ — COPY ์์๊ฐ ์ค์ํ ์ด์
Dockerfile์ ๊ฐ ๋ช
๋ น์ ๋ ์ด์ด(layer) ํ๋๋ฅผ ๋ง๋ ๋ค. ์ด๋ฏธ์ง๋ ์ด ๋ ์ด์ด๋ค์ด ์์ธ ๊ฒฐ๊ณผ๋ฌผ์ด๊ณ , Docker๋ ๋ฐ๋์ง ์์ ๋ ์ด์ด๋ ์บ์ํด์ ์ฌ์ฌ์ฉํ๋ค. ๊ทธ๋์ ์ ์์ ์์ package*.json์ ๋จผ์ ๋ณต์ฌํ๊ณ npm install์ ํ ๋ค, ๋๋จธ์ง ์์ค๋ฅผ ๋์ค์ ๋ณต์ฌํ๋ค. ์์ค ์ฝ๋๋ง ๊ณ ์น๊ณ ์์กด์ฑ์ ๊ทธ๋๋ก์ผ ๋, npm install ๋ ์ด์ด๊ฐ ์บ์์ ์ ์คํด ๋น๋๊ฐ ๋ช ์ด๋ก ๋๋๊ธฐ ๋๋ฌธ์ด๋ค. ์์๋ฅผ ๋ฐ๋๋ก ํ๋ฉด ์ฝ๋ ํ ์ค๋ง ๋ฐ๊ฟ๋ ๋งค๋ฒ ์์กด์ฑ์ ์๋ก ์ค์นํ๋ค.

๋น๋ ์ปจํ
์คํธ์์ ๋ถํ์ํ ํ์ผ(์: node_modules, .git, .env)์ ๋นผ๋ ค๋ฉด .dockerignore๋ฅผ ๋๋ค. ๋น๋๊ฐ ๋นจ๋ผ์ง๊ณ , ๋น๋ฐ ๊ฐ์ด ์ด๋ฏธ์ง์ ์์ฌ ๋ค์ด๊ฐ๋ ์ฌ๊ณ ๋ ๋ง๋๋ค.
node_modules
.git
.env
*.log
5. ๋ฐ์ดํฐ์ ํต์ — ๋ณผ๋ฅจ๊ณผ ๋คํธ์ํฌ
๋ณผ๋ฅจ — ์ฌ๋ผ์ง์ง ์๋ ๋ฐ์ดํฐ
์ปจํ ์ด๋๋ ์ผํ์ฉ์ด๋ผ, ์ญ์ ํ๋ฉด ๊ทธ ์์ ๋ฐ์ดํฐ๋ ํจ๊ป ์ฌ๋ผ์ง๋ค. DB๋ฅผ ์ปจํ ์ด๋๋ก ๋์ ๋ค๊ฐ ์ปจํ ์ด๋๋ฅผ ์ง์ฐ๋ฉด ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ๋ค๋ ๋ป์ด๋ค. ์ด๋ฅผ ๋ง์ผ๋ ค๊ณ ๋ฐ์ดํฐ๋ฅผ ์ปจํ ์ด๋ ๋ฐ๊นฅ์ ๋ณด๊ดํ๋ ์ฅ์น๊ฐ ๋ณผ๋ฅจ(volume)์ด๋ค.
# Docker๊ฐ ๊ด๋ฆฌํ๋ named volume ์์ฑ ํ ์ฐ๊ฒฐ
docker volume create pgdata
docker run -d --name db -v pgdata:/var/lib/postgresql/data postgres:17
-v pgdata:/var/lib/postgresql/data๋ ์ปจํ
์ด๋ ์ PostgreSQL ๋ฐ์ดํฐ ๊ฒฝ๋ก๋ฅผ ๋ณผ๋ฅจ์ ์ฐ๊ฒฐํ๋ค. ์ด์ ์ปจํ
์ด๋๋ฅผ ์ง์ฐ๊ณ ๋ค์ ๋ง๋ค์ด๋ ๋ฐ์ดํฐ๋ ๋ณผ๋ฅจ์ ๋จ์ ์๋ค. (ํธ์คํธ์ ํน์ ํด๋๋ฅผ ์ง์ ์ฐ๊ฒฐํ๋ bind mount -v $(pwd)/data:/... ๋ฐฉ์๋ ์๋ค.)
๋คํธ์ํฌ — ์ปจํ ์ด๋๋ผ๋ฆฌ ๋ํํ๊ธฐ
๊ธฐ๋ณธ์ ์ผ๋ก ์ปจํ ์ด๋๋ ๊ฒฉ๋ฆฌ๋ผ ์๋ค. ๊ฐ์ ์ฌ์ฉ์ ์ ์ ๋คํธ์ํฌ์ ๋ฌถ์ผ๋ฉด, ์๋ก์ ์ปจํ ์ด๋ ์ด๋ฆ์ ํธ์คํธ๋ช ์ฒ๋ผ ์จ์ ํต์ ํ ์ ์๋ค.
docker network create app-net
docker run -d --name db --network app-net postgres:17
docker run -d --name web --network app-net myapp:1.0
์ด์ web ์ปจํ
์ด๋ ์์์๋ DB ์ฃผ์๋ฅผ IP๊ฐ ์๋๋ผ ๊ทธ๋ฅ db๋ผ๋ ์ด๋ฆ์ผ๋ก ์ ์ํ ์ ์๋ค(postgres://user@db:5432/...). ์ด๋ฆ ๊ธฐ๋ฐ ํต์ ์ด ๊ฐ๋ฅํด์ง๋ ๊ฒ ํต์ฌ์ด๋ค.
๊ทธ๋ฐ๋ฐ ์ปจํ
์ด๋๊ฐ ๋์ธ ๊ฐ๋ก ๋๋ฉด ์ด run ๋ช
๋ น๋ค์ ๋งค๋ฒ ์์ ๋ง์ถฐ ์น๋ ๊ฒ ๋ฒ๊ฑฐ๋ก์์ง๋ค. ์ฌ๊ธฐ์ Compose๊ฐ ๋ฑ์ฅํ๋ค.
6. ์ฌ๋ฌ ์ปจํ ์ด๋ ํ ๋ฒ์ — Docker Compose
์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ณดํต ์ฌ๋ฌ ์ปจํ
์ด๋์ ๋ฌถ์์ด๋ค. ์น ์ฑ + DB + ์บ์(Redis)์ฒ๋ผ. ์ด๊ฑธ docker run์ผ๋ก ํ๋์ฉ ๋์ฐ๋ ค๋ฉด ๋คํธ์ํฌ ๋ง๋ค๊ณ , ๋ณผ๋ฅจ ๋ง๋ค๊ณ , ์์ ๋ง์ถฐ ์คํํ๊ณ … ๊ธ์ธ ๋ณต์กํด์ง๋ค. Docker Compose๋ ์ด ์ ์ฒด ๊ตฌ์ฑ์ YAML ํ์ผ ํ๋๋ก ์ ์ํ๊ณ , ๋ช
๋ น ํ ๋ฒ์ผ๋ก ์ ๋ถ ๋์ด๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ compose.yml(๋๋ docker-compose.yml)์ ๋ง๋ ๋ค.
# compose.yml
services:
web:
build: . # ํ์ฌ ํด๋์ Dockerfile๋ก ๋น๋
ports:
- "8080:3000" # ํธ์คํธ 8080 → ์ปจํ
์ด๋ 3000
environment:
- DATABASE_URL=postgres://user:pass@db:5432/app
depends_on:
- db
- cache
db:
image: postgres:17
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: app
volumes:
- db-data:/var/lib/postgresql/data # ๋ฐ์ดํฐ ์์ํ
cache:
image: redis:7
volumes:
db-data:
์ฝ๋ ๋ฒ์ ์ง๊ด์ ์ด๋ค. services ์๋ ์ปจํ
์ด๋ ์
(web, db, cache)์ ์ ์ํ๊ณ , web์ ํ๊ฒฝ ๋ณ์์์ DB ์ฃผ์๋ฅผ db๋ผ๋ ์๋น์ค ์ด๋ฆ์ผ๋ก ๊ฐ๋ฆฌํจ๋ค(Compose๊ฐ ๊ฐ์ ๋คํธ์ํฌ์ ๋ฌถ์ด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ฆ์ผ๋ก ์ ์๋๋ค). depends_on์ผ๋ก ์์ ์์๋ฅผ, volumes๋ก DB ๋ฐ์ดํฐ ์์ํ๋ฅผ ์ ์ธํ๋ค.

์ด์ ๋ช ๋ น ํ ๋ฒ์ผ๋ก ์ ๋ถ ๋์ด๋ค.
docker compose up -d
[+] Running 4/4
โ Network app_default Created
โ Container app-db-1 Started
โ Container app-cache-1 Started
โ Container app-web-1 Started
์ํ ํ์ธ·๋ก๊ทธ·์ข ๋ฃ๋ ํ ๊ณณ์์ ํ๋ค.
docker compose ps # ์ด ํ๋ก์ ํธ์ ์ปจํ
์ด๋ ์ํ
docker compose logs -f # ์ ์ฒด ๋ก๊ทธ ์ค์๊ฐ ํ์ธ
docker compose down # ์ ๋ถ ์ค์งํ๊ณ ์ ๋ฆฌ (๋ณผ๋ฅจ์ ๊ธฐ๋ณธ ์ ์ง)
ํํ ํจ์ — ์ค๋๋ ํํ ๋ฆฌ์ผ ์ฃผ์. ์์ ์๋ฃ๋ ํ์ผ ๋งจ ์์
version: "3.8"์ ์ ๊ณ , ๋ช ๋ น์docker-compose(ํ์ดํ)๋ฅผ ์ผ๋ค. ๋ ๋ค ์ ๋ฐฉ์์ด๋ค. ์ง๊ธ์ Compose V2์์versionํ๋๋ obsolete๋ผ ๊ทธ๋ฅ ๋นผ์ผ ํ๊ณ (๋ฃ์ผ๋ฉด ๊ฒฝ๊ณ ๊ฐ ๋ฌ๋ค), ๋ช ๋ น๋docker compose(๋์ด์ฐ๊ธฐ)๊ฐ ํ์ค์ด๋ค. ํ์ดํ ๋ฒ์ (docker-compose)์ ๋ ์ด์ ์ ์ง๋์ง ์๋๋ค.
7. ํ ๋จ๊ณ ๋ — ๋ฉํฐ์คํ ์ด์ง ๋น๋์ ๋ช ๋ น์ด ์ ๋ฆฌ
์ด๋ฏธ์ง๊ฐ ๋ฌด๊ฑฐ์ฐ๋ฉด ๋ฐฐํฌ๊ฐ ๋๋ฆฌ๊ณ ๋ณด์ ํ๋ฉด๋ ๋์ด์ง๋ค. ๋ฉํฐ์คํ ์ด์ง ๋น๋๋ ๋น๋์ฉ ๋จ๊ณ์ ์คํ์ฉ ๋จ๊ณ๋ฅผ ๋๋ , ์ต์ข ์ด๋ฏธ์ง์๋ ๊ฒฐ๊ณผ๋ฌผ๋ง ๋ด๋ ๊ธฐ๋ฒ์ด๋ค. ๋น๋ ๋๊ตฌ๋ ๋ฒ๋ฆฌ๊ณ ์ฐ์ถ๋ฌผ๋ง ๋จ๊ธด๋ค.
# 1๋จ๊ณ: ๋น๋ (๋ฌด๊ฑฐ์ด ๋น๋ ๋๊ตฌ ํฌํจ)
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 2๋จ๊ณ: ์คํ (๊ฒฐ๊ณผ๋ฌผ๋ง ๋ณต์ฌ → ์ต์ข
์ด๋ฏธ์ง๋ ๊ฐ๋ฒผ์)
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY package*.json ./
RUN npm install --omit=dev
CMD ["node", "dist/index.js"]
COPY --from=builder๊ฐ ํต์ฌ์ด๋ค. 1๋จ๊ณ์์ ๋ง๋ ์ฐ์ถ๋ฌผ(dist)๋ง 2๋จ๊ณ๋ก ๊ฐ์ ธ์ค๊ณ , ๋ฌด๊ฑฐ์ด ๋น๋ ์์กด์ฑ์ ์ต์ข
์ด๋ฏธ์ง์ ํฌํจ๋์ง ์๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์ฃผ ์ฐ๋ ๋ช ๋ น์ ํ ํ๋ก ์ ๋ฆฌํ๋ค.
| ๋ช ๋ น์ด | ํ๋ ์ผ |
docker ps / docker ps -a |
์คํ ์ค / ์ ์ฒด(๋ฉ์ถ ๊ฒ ํฌํจ) ์ปจํ ์ด๋ ๋ชฉ๋ก |
docker images |
๋ก์ปฌ ์ด๋ฏธ์ง ๋ชฉ๋ก |
docker build -t ์ด๋ฆ:ํ๊ทธ . |
Dockerfile๋ก ์ด๋ฏธ์ง ๋น๋ |
docker run -d -p 8080:80 ์ด๋ฏธ์ง |
์ปจํ ์ด๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ + ํฌํธ ์ฐ๊ฒฐ |
docker logs -f ์ด๋ฆ |
์ปจํ ์ด๋ ๋ก๊ทธ ์ค์๊ฐ ํ์ธ |
docker exec -it ์ด๋ฆ sh |
์คํ ์ค์ธ ์ปจํ ์ด๋ ์ ์ ธ ์ง์ |
docker stop / rm ์ด๋ฆ |
์ปจํ ์ด๋ ์ค์ง / ์ญ์ |
docker compose up -d |
Compose์ ์ ์๋ ์๋น์ค ์ ๋ถ ์คํ |
docker compose down |
์ ๋ถ ์ค์งํ๊ณ ์ ๋ฆฌ |
๋ง์น๋ฉฐ
Docker๋ "์ ํ๋ฆฌ์ผ์ด์
๊ณผ ๊ทธ ์คํ ํ๊ฒฝ์ ํ๋๋ก ๋ฌถ๋๋ค"๋ ๋จ์ํ ๋ฐ์์์ ์ถ๋ฐํ๋ค. ๊ทธ ๋ฌถ์์ด ์ด๋ฏธ์ง์ด๊ณ , ์ด๋ฏธ์ง๋ฅผ ์คํํ ๊ฒ ์ปจํ
์ด๋์ด๋ฉฐ, Dockerfile๋ก ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ docker compose๋ก ์ฌ๋ฌ ์ปจํ
์ด๋๋ฅผ ํ ๋ฒ์ ๋์ด๋ค. ์ด ๋ชจ๋ธ ์์์ "๋ด ์ปดํจํฐ์์ ๋๋๋ฐ"๊ฐ ์ฌ๋ผ์ง๊ณ , ๋ฐฐํฌ์ ํ์
์ด ๋จ์ํด์ง๋ค.
ํต์ฌ๋ง ๋ค์ ์ง์ผ๋ฉด, ์ด๋ฏธ์ง(ํ ํ๋ฆฟ) → ์ปจํ ์ด๋(์คํ) → Compose(๋ฌถ์) ์ ํ๋ฆ๊ณผ, ๋ฐ์ดํฐ๋ ๋ณผ๋ฅจ์ผ๋ก ์ด๋ฆฌ๊ณ , ์ปจํ ์ด๋๋ ์ด๋ฆ์ผ๋ก ํต์ ํ๋ค๋ ๋ ๊ฐ์ง๋ค. ์ฌ๊ธฐ๊น์ง ์ก์ผ๋ฉด ๋จ์ด ๋ง๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ๋จ๊ณ๋ฅผ ๋์ด, ๋ด ์๋น์ค๋ฅผ ์ปจํ ์ด๋๋ก ํจํค์งํ๊ณ ์ด์ํ๋ ์ถ๋ฐ์ ์ ์ ๊ฒ์ด๋ค.
๋ค์ ๋จ๊ณ๋ ์ด ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋น๋·๋ฐฐํฌํ๋ CI/CD, ๊ทธ๋ฆฌ๊ณ ์ปจํ ์ด๋๋ฅผ ์ฌ๋ฌ ์๋ฒ์ ๊ฑธ์ณ ์ด์ํ๋ ์ค์ผ์คํธ๋ ์ด์ (Kubernetes)์ด๋ค. ๊ทธ๊ฑด ๋ณ๋ ๊ธ์์ ์ด์ด๊ฐ๊ฒ ๋ค.
์ฐธ๊ณ ์ถ์ฒ
- Docker Docs — Get started — https://docs.docker.com/get-started/
- Docker Docs — Dockerfile reference — https://docs.docker.com/reference/dockerfile/
- Docker Docs — Docker Compose — https://docs.docker.com/compose/
- Docker Docs — Compose file reference — https://docs.docker.com/reference/compose-file/
- Docker Docs — Volumes — https://docs.docker.com/engine/storage/volumes/
- Docker — Logo, Icon, and Brand Guidelines — https://www.docker.com/company/newsroom/media-resources/
Docker ๋ฐ Docker ๋ก๊ณ (Moby Dock ๊ณ ๋)๋ Docker, Inc.์ ์ํ์ด๋ฉฐ, ๋ณธ ๊ธ์์๋ ์๋ณ·์ค๋ช ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉํ์ต๋๋ค.
'๐ Tech Stack > Database & Infra' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Kubernetes ์ ๋ฌธ (1) | 2026.06.30 |
|---|---|
| GitHub Actions๋ก CI/CD ํ์ดํ๋ผ์ธ ๋ง๋ค๊ธฐ (1) | 2026.06.29 |
| ์คํ๊ณํ(EXPLAIN) ํ ๋ฒ์ ์ฝ๊ธฐ (1) | 2026.06.26 |
| ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ๋ณด๋ ๊ฒ๋ค (0) | 2026.05.20 |
