Ver2.0 ๐ณ ๋์ปค๋ฅผ ์ด์ฉํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์๋ํ ๐

๐ณ ๋์ปค๋ฅผ ์ด์ฉํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์๋ํ ๐
๊ฐ๋ฐ์์ ์ถ์ ํธํ๊ฒ ๋ง๋ค์ด์ฃผ๋ ๋์ปค ๋ฐฐํฌ ์๋ํ ์์ ์ ๋ณต!
๐ ์๋ ํ์ธ์, ๋์ปค ์ธ๊ณ๋ก ์ค์ ๊ฒ์ ํ์ํฉ๋๋ค!
์ฌ๋ฌ๋ถ~ ์๋ ํ์ธ์! ์ค๋์ ์ ๋ง ํซํ ์ฃผ์ ์ธ ๋์ปค(Docker)๋ฅผ ์ด์ฉํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์๋ํ์ ๋ํด ํจ๊ป ์์๋ณผ๊ฒ์! ใ ใ ใ ์ด๋ ต๊ฒ ๋ค๋ฆด ์ ์์ง๋ง ๊ฑฑ์ ๋ ธ๋ ธ~! ์ด๋ณด์๋ ์ดํดํ๊ธฐ ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์! ๐ค
์์ฆ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์ "๋์ปค ์ ์ฐ๋ฉด ์๊ณ ์ ์๋" ์ด๋ผ๋ ๋ง์ด ์์ ์ ๋๋ก ๋์ปค๋ ํ์ ์คํฌ์ด ๋์์ด์. ํนํ ์น ๊ฐ๋ฐ์๋ผ๋ฉด ๋์ปค๋ฅผ ํ์ฉํ ๋ฐฐํฌ ์๋ํ๋ ์ง์ง ๊ฟํ ์ค์ ๊ฟํ! ์ฌ๋ฅ๋ท ๊ฐ์ ํ๋ซํผ์์๋ ๋์ปค ๊ด๋ จ ์ฌ๋ฅ์ด ์์ฒญ ์ธ๊ธฐ๋ผ๋๋ผ๊ตฌ์. ๊ฐ๋ฐ์๋ค์ ์๊ฐ์ ํ ์ค์ฌ์ฃผ๋๊น์! ๐
์ด ๊ธ์ ๋ค ์ฝ๊ณ ๋๋ฉด ์ฌ๋ฌ๋ถ๋ "๋์ปค ๋ง์คํฐ"๊ฐ ๋ ์ ์์ ๊ฑฐ์์! ์, ๊ทธ๋ผ ์์ํด๋ณผ๊น์? ๐
๐ณ ๋์ปค๊ฐ ๋ญ๊ธธ๋ ๋ค๋ค ๋๋ฆฌ์ธ๊ฐ์?
๋์ปค๊ฐ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋ค๊ณ ์? ๊ฑฑ์ ๋ง์ธ์! ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์! ๐ค
๋์ปค๋ ๊ฐ๋จํ ๋งํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋๋ผ๋ ์์์ ๋ด์์ ์ด๋์๋ ๋๊ฐ์ด ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ์ ์ด์์. ๋ง์น ์ฌ๋ฌ๋ถ์ด ์ด์ฌํ ๋ ์ง์ ๋ฐ์ค์ ๋ด์์ ์ฎ๊ธฐ๋ ๊ฒ์ฒ๋ผ์! ๐ โก๏ธ๐ข
๋์ปค๊ฐ ์๋ ์์ ์๋ ๊ฐ๋ฐ์๋ค์ด ์ด๋ฐ ๋ง์ ์์ฃผ ํ์ด์. "๋ด ์ปดํจํฐ์์๋ ์ ๋๋๋ฐ...?" ใ ใ ใ ๋๋ฌด ์ต์ํ ๋ง์ด์ฃ ? ๐
ํ์ง๋ง ๋์ปค๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ฌธ์ ๊ฐ ์น~ ์ฌ๋ผ์ ธ์! ์๋ํ๋ฉด ๋์ปค ์ปจํ ์ด๋๋ ํ์ํ ๋ชจ๋ ๊ฒ(์ฝ๋, ๋ฐํ์, ์์คํ ๋๊ตฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ)์ ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ด์์. ๊ทธ๋์ ๊ฐ๋ฐ ํ๊ฒฝ์ด๋ , ํ ์คํธ ํ๊ฒฝ์ด๋ , ์ค์ ์๋น์ค ํ๊ฒฝ์ด๋ ์ด๋์๋ ๋์ผํ๊ฒ ์๋ํ๋ต๋๋ค! ๐
๐ค ๋์ปค๊ฐ ํ์ํ ์ด์
์ฌ๋ฌ๋ถ! ์ ๋์ปค๋ฅผ ์จ์ผ ํ ๊น์? ๊ทธ ์ด์ ๋ฅผ ์์๋ด ์๋ค! ๐ง
- ์ผ๊ด์ฑ ์๋ ํ๊ฒฝ: "๋ด ์ปดํจํฐ์์๋ ๋๋๋ฐ..." ๋ผ๋ ๋ง ์ด์ ์๋ ~ ๐ ๋ชจ๋ ํ๊ฒฝ์์ ๋์ผํ๊ฒ ์๋ํด์.
- ๋น ๋ฅธ ๋ฐฐํฌ: ์ปจํ ์ด๋๋ ๊ฐ๋ณ๊ณ ์์์ด ๋นจ๋ผ์ ๋ฐฐํฌ ์๊ฐ์ด ์์ฒญ ๋จ์ถ๋ผ์! โก
- ๊ฒฉ๋ฆฌ๋ ํ๊ฒฝ: ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋ฆฝ์ ์ธ ํ๊ฒฝ์์ ์คํ๋์ด ์ถฉ๋ ๊ฑฑ์ ์์! ๐ก๏ธ
- ํ์ฅ์ฑ: ํธ๋ํฝ์ด ์ฆ๊ฐํ๋ฉด ์ปจํ ์ด๋๋ฅผ ์ฝ๊ฒ ๋๋ฆด ์ ์์ด์. ๋๋ฐ! ๐
- ๋ฒ์ ๊ด๋ฆฌ: ์ปจํ ์ด๋ ์ด๋ฏธ์ง์ ๋ฒ์ ์ ๋งค๊ฒจ์ ๊ด๋ฆฌํ๊ธฐ ์ฌ์์. ๋กค๋ฐฑ๋ ๊ฐ๋ฅ! ๐
์ด๋ฐ ์ฅ์ ๋ค ๋๋ฌธ์ ์์ฆ ๊ฐ๋ฐ์๋ค ์ฌ์ด์์๋ "๋์ปค ๋ชจ๋ฅด๋ฉด ๊ฐ๋ฐ์ ์๋" ์ด๋ผ๋ ๋ง์ด ๋์ฌ ์ ๋๋๋๋ค! ๊ณผ์ฅ์ด๊ธด ํ์ง๋ง, ๊ทธ๋งํผ ์ค์ํ๋ค๋ ๊ฑฐ์ฃ ! ๐
๐ ๏ธ ๋์ปค ์ค์นํ๊ธฐ
์, ์ด์ ๋์ปค๋ฅผ ์ค์นํด๋ณผ๊น์? ์ด์์ฒด์ ๋ณ๋ก ์ค์น ๋ฐฉ๋ฒ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์! ๐ฅ๏ธ
Windows์ ์ค์นํ๊ธฐ
์๋์ฐ ์ ์ ๋ผ๋ฉด Docker Desktop for Windows๋ฅผ ๋ค์ด๋ก๋ํ์ธ์. WSL 2๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ข์์! ์ค์น ํ ์ฌ๋ถํ ํ๋ฉด ๋! ์ฝ์ฃ ? ใ ใ ใ
Mac์ ์ค์นํ๊ธฐ
๋งฅ ์ ์ ๋ผ๋ฉด Docker Desktop for Mac์ ๋ค์ด๋ก๋ํ์ธ์. ์ค์น ํ์ผ์ ์คํํ๊ณ Applications ํด๋๋ก ๋๋๊ทธํ๋ฉด ๋! ์ ํ ๋ต๊ฒ ์ฌํํ์ฃ ? ๐
Linux์ ์ค์นํ๊ธฐ
๋ฆฌ๋ ์ค ์ ์ ๋ผ๋ฉด ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์ธ์:
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io
์ค์น๊ฐ ์๋ฃ๋์๋ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ก ๋์ปค๊ฐ ์ ๋๋ก ์ค์น๋์๋์ง ํ์ธํด๋ณผ๊น์?
docker --version
๋ฒ์ ์ ๋ณด๊ฐ ๋์จ๋ค๋ฉด ์ฑ๊ณต์ด์์! ๐
๐ฆ ๋์ปค ๊ธฐ๋ณธ ๊ฐ๋ ์ดํดํ๊ธฐ
๋์ปค๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ช ๊ฐ์ง ํต์ฌ ๊ฐ๋ ์ ์์์ผ ํด์! ์ด๋ ต์ง ์์ผ๋ ๊ฑฑ์ ๋ง์ธ์~ ๐
1. Dockerfile
Dockerfile์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ค๊ณ๋์์. ์ฌ๊ธฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๋ช ๋ น์ด๊ฐ ํฌํจ๋์ด ์์ด์. ๋ง์น ์๋ฆฌ ๋ ์ํผ ๊ฐ์ ๊ฑฐ์ฃ ! ๐ณ
2. ์ด๋ฏธ์ง (Image)
์ด๋ฏธ์ง๋ Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์ฝ๊ธฐ ์ ์ฉ ํ ํ๋ฆฟ์ด์์. ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ฒ(์ฝ๋, ๋ฐํ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ํ๊ฒฝ ๋ณ์ ๋ฑ)์ ํฌํจํ๊ณ ์์ด์. ๋ง์น ์๋ฆฌ์ ์ฌ๋ฃ๋ฅผ ๋ชจ๋ ์ค๋นํด๋์ ์ํ๋๊น์? ๐ฅ๐ง ๐ฅฉ
3. ์ปจํ ์ด๋ (Container)
์ปจํ ์ด๋๋ ์ด๋ฏธ์ง์ ์คํ ๊ฐ๋ฅํ ์ธ์คํด์ค์์. ์ด๋ฏธ์ง๋ฅผ ์คํํ๋ฉด ์ปจํ ์ด๋๊ฐ ์์ฑ๋ผ์. ์๋ฆฌ๋ก ์น๋ฉด ์์ฑ๋ ์๋ฆฌ ํ ์ ์๋ผ๊ณ ํ ์ ์์ฃ ! ๐ฒ
4. ๋ณผ๋ฅจ (Volume)
๋ณผ๋ฅจ์ ์ปจํ ์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ณต๊ฐ์ด์์. ์ปจํ ์ด๋๊ฐ ์ญ์ ๋์ด๋ ๋ณผ๋ฅจ์ ์ ์ฅ๋ ๋ฐ์ดํฐ๋ ์ ์ง๋ผ์. ๋์ฅ๊ณ ์ ๋จ์ ์์์ ๋ณด๊ดํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ ! ๐ง
5. ๋ ์ง์คํธ๋ฆฌ (Registry)
๋ ์ง์คํธ๋ฆฌ๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ณ ๊ณต์ ํ๋ ์ ์ฅ์์์. Docker Hub๊ฐ ๊ฐ์ฅ ์ ๋ช ํ์ฃ ! ๋ง์น ์๋ฆฌ ๋ ์ํผ๋ฅผ ๊ณต์ ํ๋ ์น์ฌ์ดํธ ๊ฐ์ ๊ฑฐ์์! ๐
์ด ๊ฐ๋ ๋ค๋ง ์ดํดํ๋ฉด ๋์ปค์ ๊ธฐ๋ณธ์ ๋ง์คํฐํ ๊ฑฐ๋ ๋ค๋ฆ์์ด์! ์ฝ์ฃ ? ใ ใ ใ ๐
๐ ์ฒซ ๋ฒ์งธ Dockerfile ๋ง๋ค๊ธฐ
์ด์ ์ค์ ๋ก Dockerfile์ ๋ง๋ค์ด๋ณผ๊น์? ๊ฐ๋จํ Node.js ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ก ๋ค์ด๋ณผ๊ฒ์! ๐
๋จผ์ , ํ๋ก์ ํธ ํด๋์ Dockerfile์ด๋ผ๋ ์ด๋ฆ์ ํ์ผ์ ๋ง๋ค๊ณ ๋ค์ ๋ด์ฉ์ ์์ฑํด๋ณด์ธ์:
# Node.js ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํจ
FROM node:14
# ์ฑ ๋๋ ํ ๋ฆฌ ์์ฑ
WORKDIR /usr/src/app
# ์ฑ ์์กด์ฑ ์ค์น
# package.json๊ณผ package-lock.json์ ๋ชจ๋ ๋ณต์ฌ
COPY package*.json ./
RUN npm install
# ์ฑ ์์ค ๋ณต์ฌ
COPY . .
# ์ฑ์ด ์ฌ์ฉํ ํฌํธ ์ค์
EXPOSE 8080
# ์ฑ ์คํ ๋ช
๋ น
CMD [ "node", "app.js" ]
์ฐ์! ์ฒซ ๋ฒ์งธ Dockerfile์ ๋ง๋ค์์ด์! ๐ ์ด๊ฒ ๋ฌด์จ ๋ป์ธ์ง ํ๋์ฉ ์ค๋ช ํด๋๋ฆด๊ฒ์:
- FROM node:14: Node.js ๋ฒ์ 14 ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ๋ค๋ ๋ป์ด์์.
- WORKDIR /usr/src/app: ์ปจํ ์ด๋ ๋ด์์ ์์ ํ ๋๋ ํ ๋ฆฌ๋ฅผ ์ค์ ํด์.
- COPY package*.json ./: package.json ํ์ผ์ ์ปจํ ์ด๋๋ก ๋ณต์ฌํด์.
- RUN npm install: ์์กด์ฑ ํจํค์ง๋ฅผ ์ค์นํด์.
- COPY . .: ํ์ฌ ๋๋ ํ ๋ฆฌ์ ๋ชจ๋ ํ์ผ์ ์ปจํ ์ด๋๋ก ๋ณต์ฌํด์.
- EXPOSE 8080: ์ปจํ ์ด๋๊ฐ 8080 ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ์๋ ค์ค์.
- CMD [ "node", "app.js" ]: ์ปจํ ์ด๋๊ฐ ์์๋ ๋ ์คํํ ๋ช ๋ น์ด์์.
์ด๋ ๊ฒ ํ๋ฉด Node.js ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค ์ ์์ด์! ์ฌ๋ฅ๋ท์์๋ ์ด๋ฐ ๋์ปค ๊ด๋ จ ์ง์์ ๊ณต์ ํ๋ ๋ถ๋ค์ด ๋ง๋ค๊ณ ํ๋๋ผ๊ตฌ์. ์ญ์ ํซํ ๊ธฐ์ ์ด์ฃ ! ๐ฅ
๐๏ธ ๋์ปค ์ด๋ฏธ์ง ๋น๋ํ๊ธฐ
Dockerfile์ ์์ฑํ์ผ๋ ์ด์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด๋ณผ๊น์? ํฐ๋ฏธ๋์์ ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํด๋ณด์ธ์:
docker build -t my-node-app .
์ด ๋ช
๋ น์ด๋ ํ์ฌ ๋๋ ํ ๋ฆฌ(.)์ ์๋ Dockerfile์ ์ฌ์ฉํด์ my-node-app์ด๋ผ๋ ์ด๋ฆ์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด์. -t ์ต์
์ ์ด๋ฏธ์ง์ ํ๊ทธ(์ด๋ฆ)๋ฅผ ๋ถ์ด๋ ์ญํ ์ ํด์! ๐
๋น๋๊ฐ ์๋ฃ๋๋ฉด ๋ค์ ๋ช ๋ น์ด๋ก ์ด๋ฏธ์ง๊ฐ ์ ์์ฑ๋์๋์ง ํ์ธํด๋ณผ๊น์?
docker images
๋ชฉ๋ก์ my-node-app์ด ๋ณด์ธ๋ค๋ฉด ์ฑ๊ณต์ด์์! ์ง์ง์ง! ๐
๐ ๋์ปค ์ปจํ ์ด๋ ์คํํ๊ธฐ
์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์์ผ๋ ์ด์ ์ปจํ ์ด๋๋ฅผ ์คํํด๋ณผ๊น์? ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด๋ณด์ธ์:
docker run -p 8080:8080 my-node-app
์ด ๋ช
๋ น์ด๋ my-node-app ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ปจํ
์ด๋๋ฅผ ์คํํ๊ณ , ํธ์คํธ์ 8080 ํฌํธ๋ฅผ ์ปจํ
์ด๋์ 8080 ํฌํธ์ ์ฐ๊ฒฐํด์. ์ด์ ๋ธ๋ผ์ฐ์ ์์ http://localhost:8080์ ์ ์ํ๋ฉด ์ฌ๋ฌ๋ถ์ ์ฑ์ ๋ณผ ์ ์์ด์! ๋๋ฐ! ๐ฒ
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๊ณ ์ถ๋ค๋ฉด -d ์ต์
์ ์ถ๊ฐํด๋ณด์ธ์:
docker run -d -p 8080:8080 my-node-app
์คํ ์ค์ธ ์ปจํ ์ด๋๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด๋ณด์ธ์:
docker ps
์ปจํ ์ด๋๋ฅผ ์ค์งํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด๋ณด์ธ์:
docker stop [CONTAINER_ID]
์ฌ๊ธฐ์ [CONTAINER_ID]๋ docker ps ๋ช
๋ น์ด๋ก ํ์ธํ ์ปจํ
์ด๋ ID์์. ์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ์ปจํ
์ด๋๋ฅผ ์คํํ๊ณ ๊ด๋ฆฌํ ์ ์์ด์! ์ฝ์ฃ ? ใ
ใ
ใ
๐
๐ ๋์ปค ์ปดํฌ์ฆ๋ก ์ฌ๋ฌ ์ปจํ ์ด๋ ๊ด๋ฆฌํ๊ธฐ
์ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณดํต ์ฌ๋ฌ ์๋น์ค(์น ์๋ฒ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์บ์ ๋ฑ)๋ก ๊ตฌ์ฑ๋์ด ์์ด์. ์ด๋ฐ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ ๋๊ตฌ๊ฐ ๋ฐ๋ก Docker Compose์์! ๐จโ๐ฉโ๐งโ๐ฆ
ํ๋ก์ ํธ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ docker-compose.yml ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋ณด์ธ์:
version: '3'
services:
web:
build: .
ports:
- "8080:8080"
depends_on:
- db
db:
image: mongo
ports:
- "27017:27017"
volumes:
- mongo-data:/data/db
volumes:
mongo-data:
์ด ํ์ผ์ ๋ ๊ฐ์ ์๋น์ค(web, db)๋ฅผ ์ ์ํ๊ณ ์์ด์:
- web: ํ์ฌ ๋๋ ํ ๋ฆฌ์ Dockerfile์ ์ฌ์ฉํด ๋น๋ํ๊ณ , 8080 ํฌํธ๋ฅผ ๋ ธ์ถํด์.
- db: MongoDB ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ๊ณ , 27017 ํฌํธ๋ฅผ ๋ ธ์ถํ๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๋ณผ๋ฅจ์ ์ ์ฅํด์.
์ด์ ๋ค์ ๋ช ๋ น์ด๋ก ๋ชจ๋ ์๋น์ค๋ฅผ ํ ๋ฒ์ ์์ํ ์ ์์ด์:
docker-compose up
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋ ค๋ฉด -d ์ต์
์ ์ถ๊ฐํ์ธ์:
docker-compose up -d
๋ชจ๋ ์๋น์ค๋ฅผ ์ค์งํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ธ์:
docker-compose down
์ด๋ ๊ฒ Docker Compose๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ๋ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ด์! ์ง์ง ๊ฐ๋ฐ์์ ์ถ์ ์ง์ด ํ ์ฌ๋ผ๊ฐ๋ ๋๋! ๐
๐ CI/CD ํ์ดํ๋ผ์ธ์ ๋์ปค ํตํฉํ๊ธฐ
์ด์ ๋์ปค๋ฅผ CI/CD(์ง์์ ํตํฉ/์ง์์ ๋ฐฐํฌ) ํ์ดํ๋ผ์ธ์ ํตํฉํด๋ณผ๊น์? ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋ ๋ณ๊ฒฝ๋ถํฐ ๋ฐฐํฌ๊น์ง ์๋ํํ ์ ์์ด์! ๐ค
์ฌ๊ธฐ์๋ GitHub Actions๋ฅผ ์๋ก ๋ค์ด๋ณผ๊ฒ์. ํ๋ก์ ํธ ๋ฃจํธ์ .github/workflows/docker-deploy.yml ํ์ผ์ ๋ง๋ค๊ณ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋ณด์ธ์:
name: Docker Deploy
on:
push:
branches: [ main ]
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Login to DockerHub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
tags: yourusername/your-app:latest
- name: Deploy to server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.HOST }}
username: ${{ secrets.USERNAME }}
key: ${{ secrets.SSH_KEY }}
script: |
docker pull yourusername/your-app:latest
docker stop your-app || true
docker rm your-app || true
docker run -d -p 8080:8080 --name your-app yourusername/your-app:latest
์ด ์ํฌํ๋ก์ฐ๋ ๋ค์๊ณผ ๊ฐ์ ์ผ์ ํด์:
- main ๋ธ๋์น์ ํธ์๊ฐ ๋ฐ์ํ๋ฉด ์ํฌํ๋ก์ฐ๊ฐ ์์๋ผ์.
- DockerHub์ ๋ก๊ทธ์ธํด์.
- ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ DockerHub์ ํธ์ํด์.
- SSH๋ฅผ ํตํด ์๋ฒ์ ์ ์ํ๊ณ , ์ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์์ ์คํํด์.
์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๋ฅผ ํธ์ํ ๋๋ง๋ค ์๋์ผ๋ก ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ ธ์! ๊ฐ๋ฐ์์ ๊ฟ์ด ํ์ค์ด ๋๋ ์๊ฐ์ด์ฃ ! ๐
๐ ๋์ปค ์ปจํ ์ด๋ ๋ชจ๋ํฐ๋งํ๊ธฐ
๋์ปค ์ปจํ ์ด๋๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด ๋ชจ๋ํฐ๋ง์ด ํ์ํ ๋๊ฐ ์์ด์. ์ฌ๋ฌ ๋๊ตฌ ์ค์์ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ ๊ฒ๋ค์ ์๊ฐํ ๊ฒ์! ๐
1. Docker Stats
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ก, ๋ค์ ๋ช ๋ น์ด๋ก ์คํํ ์ ์์ด์:
docker stats
์ด ๋ช ๋ น์ด๋ ์ค์๊ฐ์ผ๋ก ์ปจํ ์ด๋์ CPU, ๋ฉ๋ชจ๋ฆฌ, ๋คํธ์ํฌ ์ฌ์ฉ๋ ๋ฑ์ ๋ณด์ฌ์ค์.
2. cAdvisor
Google์์ ๋ง๋ ์ปจํ ์ด๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ก, ๋ค์ ๋ช ๋ น์ด๋ก ์คํํ ์ ์์ด์:
docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach=true \
--name=cadvisor \
google/cadvisor:latest
์คํ ํ http://localhost:8080์ ์ ์ํ๋ฉด ์น ์ธํฐํ์ด์ค๋ฅผ ํตํด ๋ชจ๋ํฐ๋งํ ์ ์์ด์.
3. Prometheus + Grafana
๋ ๊ฐ๋ ฅํ ๋ชจ๋ํฐ๋ง์ ์ํ๋ค๋ฉด Prometheus์ Grafana๋ฅผ ์กฐํฉํด์ ์ฌ์ฉํด๋ณด์ธ์. Docker Compose๋ก ์ฝ๊ฒ ์ค์ ํ ์ ์์ด์:
version: '3'
services:
prometheus:
image: prom/prometheus
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
grafana:
image: grafana/grafana
ports:
- "3000:3000"
depends_on:
- prometheus
์ด๋ ๊ฒ ๋ชจ๋ํฐ๋ง ์์คํ ์ ๊ตฌ์ถํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๊ฐ์งํ ์ ์์ด์! ์ง์ง ํ๋ก ๊ฐ๋ฐ์์ ํ์ ์คํฌ์ด์ฃ ! ๐
๐ ๋์ปค ๋ณด์ ๊ฐํํ๊ธฐ
๋์ปค ์ปจํ ์ด๋๋ฅผ ์ด์ํ ๋ ๋ณด์์ ์ ๋ง ์ค์ํด์! ๋ช ๊ฐ์ง ๋ณด์ ๊ฐํ ํ์ ์๋ ค๋๋ฆด๊ฒ์! ๐ก๏ธ
- ์ต์ ๊ถํ ์์น: ์ปจํ
์ด๋์ ํ์ํ ๊ถํ๋ง ๋ถ์ฌํ์ธ์.
--cap-drop=ALL๋ก ๋ชจ๋ ๊ถํ์ ์ ๊ฑฐํ๊ณ ํ์ํ ๊ฒ๋ง--cap-add๋ก ์ถ๊ฐํ์ธ์. - ๋น๋ฃจํธ ์ฌ์ฉ์ ์ฌ์ฉ: Dockerfile์์
USER์ง์๋ฌธ์ ์ฌ์ฉํด ๋น๋ฃจํธ ์ฌ์ฉ์๋ก ์คํํ์ธ์. - ์ด๋ฏธ์ง ์ค์บ๋: Trivy, Clair ๊ฐ์ ๋๊ตฌ๋ก ์ด๋ฏธ์ง์ ์ทจ์ฝ์ ์ ์ค์บํ์ธ์.
- ๊ณต์ ์ด๋ฏธ์ง ์ฌ์ฉ: ๊ฒ์ฆ๋ ๊ณต์ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ์ธ์.
- ์ํฌ๋ฆฟ ๊ด๋ฆฌ: ๋ฏผ๊ฐํ ์ ๋ณด๋ Docker Secrets๋ ํ๊ฒฝ ๋ณ์๋ก ๊ด๋ฆฌํ์ธ์.
์๋ฅผ ๋ค์ด, ๋น๋ฃจํธ ์ฌ์ฉ์๋ฅผ ์ฌ์ฉํ๋ Dockerfile์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ด์:
FROM node:14
# ์ฑ ๋๋ ํ ๋ฆฌ ์์ฑ
WORKDIR /usr/src/app
# ์ฑ ์์กด์ฑ ์ค์น
COPY package*.json ./
RUN npm install
# ์ฑ ์์ค ๋ณต์ฌ
COPY . .
# ๋น๋ฃจํธ ์ฌ์ฉ์ ์์ฑ ๋ฐ ์ ํ
RUN groupadd -r appuser && useradd -r -g appuser appuser
RUN chown -R appuser:appuser /usr/src/app
USER appuser
EXPOSE 8080
CMD [ "node", "app.js" ]
์ด๋ ๊ฒ ํ๋ฉด ์ปจํ ์ด๋๊ฐ ํดํน๋๋๋ผ๋ ํผํด๋ฅผ ์ต์ํํ ์ ์์ด์! ๋ณด์์ ์๋ฌด๋ฆฌ ๊ฐ์กฐํด๋ ์ง๋์น์ง ์์ฃ ! ๐
๐ก ๋์ปค ์ฌ์ฉ ์ ๊ฟํ
๋ง์ง๋ง์ผ๋ก, ๋์ปค๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๊ฟํ์ ๋ช ๊ฐ์ง ์๋ ค๋๋ฆด๊ฒ์! ๐ฏ
- ์ด๋ฏธ์ง ํฌ๊ธฐ ์ต์ํ: ๋ฉํฐ ์คํ ์ด์ง ๋น๋๋ฅผ ์ฌ์ฉํด ์ด๋ฏธ์ง ํฌ๊ธฐ๋ฅผ ์ค์ด์ธ์. ์๋ฅผ ๋ค์ด:
# ๋น๋ ์คํ
์ด์ง
FROM node:14 AS build
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# ์คํ ์คํ
์ด์ง
FROM node:14-alpine
WORKDIR /app
COPY --from=build /app/dist ./dist
COPY --from=build /app/node_modules ./node_modules
EXPOSE 8080
CMD [ "node", "dist/app.js" ]
- ์บ์ ํ์ฉ: Dockerfile์ ๋ช ๋ น์ด ์์๋ฅผ ์ ๋ฐฐ์นํด ์บ์๋ฅผ ์ต๋ํ ํ์ฉํ์ธ์. ์์ฃผ ๋ณ๊ฒฝ๋๋ ํ์ผ์ ๋์ค์ ๋ณต์ฌํ์ธ์.
- ๋ณผ๋ฅจ ์ฌ์ฉ: ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํ๊ณ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ๋ณผ๋ฅจ์ ์ฌ์ฉํ์ธ์.
- ํ๊ฒฝ ๋ณ์ ํ์ฉ: ํ๊ฒฝ๋ณ๋ก ๋ค๋ฅธ ์ค์ ์ ์ ์ฉํ๊ธฐ ์ํด ํ๊ฒฝ ๋ณ์๋ฅผ ํ์ฉํ์ธ์.
- ํฌ์ค ์ฒดํฌ ์ถ๊ฐ:
HEALTHCHECK์ง์๋ฌธ์ ์ฌ์ฉํด ์ปจํ ์ด๋์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ์ธ์.
์ด๋ฐ ํ๋ค์ ํ์ฉํ๋ฉด ๋์ปค๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์! ์ฌ๋ฅ๋ท์์๋ ์ด๋ฐ ๋์ปค ํ์ฉ ํ์ ๊ณต์ ํ๋ ๊ฐ๋ฐ์๋ค์ด ๋ง๋ค๊ณ ํ๋, ์ฐธ๊ณ ํด๋ณด์ธ์! ๐
๐ฏ ๋ง๋ฌด๋ฆฌ: ๋์ปค๋ก ๊ฐ๋ฐ ์์ฐ์ฑ ๋์ด๊ธฐ
์ง๊ธ๊น์ง ๋์ปค๋ฅผ ์ด์ฉํ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์๋ํ์ ๋ํด ์์๋ดค์ด์! ์ ๋ง ๋ง์ ๋ด์ฉ์ ๋ค๋ค์ฃ ? ใ ใ ใ ๐
๋์ปค๋ ์ฒ์์๋ ์ด๋ ต๊ฒ ๋๊ปด์ง ์ ์์ง๋ง, ์ต์ํด์ง๋ฉด ๊ฐ๋ฐ ์์ฐ์ฑ์ ์์ฒญ๋๊ฒ ํฅ์์์ผ์ค์! "์๋ํ๊ธด ํ๋๋ฐ ์ ์๋ํ๋์ง ๋ชจ๋ฅด๊ฒ ์ด..."๋ผ๋ ์ํฉ์ ํฌ๊ฒ ์ค์ฌ์ฃผ์ฃ ! ๐
์์ฝํ์๋ฉด:
- ๋์ปค๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋ํํด์ ์ด๋์๋ ๋์ผํ๊ฒ ์คํํ ์ ์๊ฒ ํด์ค์.
- Dockerfile๋ก ์ด๋ฏธ์ง๋ฅผ ์ ์ํ๊ณ , ์ด๋ฏธ์ง๋ก ์ปจํ ์ด๋๋ฅผ ์คํํด์.
- Docker Compose๋ก ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ํ ๋ฒ์ ๊ด๋ฆฌํ ์ ์์ด์.
- CI/CD ํ์ดํ๋ผ์ธ์ ๋์ปค๋ฅผ ํตํฉํด ๋ฐฐํฌ๋ฅผ ์๋ํํ ์ ์์ด์.
- ๋ชจ๋ํฐ๋ง๊ณผ ๋ณด์์ ์ ๊ฒฝ ์จ์ ์์ ์ ์ธ ์ด์ ํ๊ฒฝ์ ๊ตฌ์ถํด์ผ ํด์.
๋์ปค๋ ์ด์ ๊ฐ๋ฐ์์ ํ์ ๋๊ตฌ๊ฐ ๋์์ด์. ํนํ ์น ๊ฐ๋ฐ์์๋ ๋์ฑ ๊ทธ๋ ์ฃ ! ๋์ปค๋ฅผ ๋ง์คํฐํ๋ฉด ๊ฐ๋ฐ๋ถํฐ ๋ฐฐํฌ๊น์ง ์ ๊ณผ์ ์ด ํจ์ฌ ์์ํด์ง ๊ฑฐ์์! ๐
์ฌ๋ฌ๋ถ๋ ๋์ปค๋ฅผ ํ์ฉํด ๊ฐ๋ฐ ์์ฐ์ฑ์ ๋์ฌ๋ณด์ธ์! ์ด๋ ค์ด ์ ์ด ์๋ค๋ฉด ์ฌ๋ฅ๋ท์์ ๋์ปค ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ์๋ณด๋ ๊ฒ๋ ์ข์ ๋ฐฉ๋ฒ์ด์์! ํจ๊ป ์ฑ์ฅํ๋ ๊ฐ๋ฐ ๋ฌธํ, ์ ๋ง ๋ฉ์ง์ง ์๋์? ๐
์ด์ ์ฌ๋ฌ๋ถ๋ ๋์ปค ๋ง์คํฐ์ ๊ธธ๋ก ํ ๊ฑธ์ ๋ ๋์๊ฐ์ด์! ํ์ดํ ! ๐ช
๊ด๋ จ ํค์๋
๋๊ธ ์์ฑ
์ด ๊ธ์ ๋ํ ์ฌ๋ฌ๋ถ์ ์๊ฐ์ ๋ค๋ ค์ฃผ์ธ์
๋ก๊ทธ์ธ์ด ํ์ํฉ๋๋ค
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ ๋ก๊ทธ์ธํด์ฃผ์ธ์.
๋๊ธ 0
์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์์ง ๋๊ธ์ด ์์ต๋๋ค.