2024-04-06.md
๐กDIL: ๋ชจ๋ ๋ฆฌ์กํธ ๋ฅ ๋ค์ด๋ธ, 5์ฃผ์ฐจ-6
์คํฐ๋: ์๊ฐ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์ค๋ ์งํ: ๊ฐ์ธ๊ณต๋ถ
DIL-week5-6_2024-04-06
| DIL ์ฃผ์ฐจ | ๋ฒ์ | ๋ด์ฉ | ์ค๋์ฐจ ์ง๋ | | -------- | ---- | -------------------------------------------------- | ----------- | | 5์ฃผ์ฐจ | 9์ฅ | ๋ชจ๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ ๋๊ตฌ๋ก ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ ํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ | 617~654p |
์ค๋ ์ฝ์ ๋ด์ฉ์ markdown์ผ๋ก ๊ฐ๋จํ ๋ฉ๋ชจ
๋์ปค๋ผ์ด์ฆ
- ์ ๋์ปค?
- ๋ณธ๊ฒฉ์ ์ผ๋ก ์ฌ์ฉ์์๊ฒ ์๋น์คํ๊ธฐ ์ํ ์น ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋น์คํ๋ ค๋ฉด? ์ปค์คํฐ๋ง์ด์ง์ด ํ์ํ๋ค ex) NGINX
- ์ ์ฐํ์ง ๋ชปํ ๋น์ฉ ์ฒด๊ณ
- ์ง์ ์ฅ๋น๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ด ์๋, ์ปจํ
์ด๋๋ก ๋ง๋ค์ด์ ๋น ๋ฅด๊ฒ ๋ฐฐํฌํ๋ ์ถ์ธ โ ์ปจํ
์ด๋๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ์ด ๋์ปค
- ์ข ์์ ์ด์ง ์์ ์ ์ฐํ ๊ด๋ฆฌ
- GCP, Google Cloud Platform
๋ฆฌ์กํธ ์ฑ ๋์ปค๋ผ์ด์ฆ
- ๋์ปค๋?
https://www.docker.com/ Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.
- ์ปจํ ์ด๋ ๋จ์ ํจํค์ง
- ๋ฆฌ์์ค ํ๋ณด, ์ด์์ฒด์ ์ค์น, Node.js ์ค์น, ๋น๋ etc
- ์ฉ์ด
| ์ฉ์ด | ๋ด์ฉ | ๋ฐฉ๋ฒ | | ---------- | --------------------------------------- | ------------------------------------------------------------------------------------------ | | image | ์ปจํ ์ด๋๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋๋ ํ ํ๋ฆฟ | Dockerfile์ ๋น๋ํ์ฌ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ฆ | | container | ๋์ปค์ ์ด๋ฏธ์ง๋ฅผ ์คํํ ์ํ | image๊ฐ ๋ชฉํํ๋ OS, FS, ๊ฐ์ข ์์, ๋คํธ์ํฌ๊ฐ ํ ๋น๋์ด ์คํ๋ ์ ์๋ ๋ ๋ฆฝ๋ ๊ณต๊ฐ | | Dockerfile | ์ด๋ค image ํ์ผ์ ๋ง๋ค์ง ์ ์ํ๋ ํ์ผ | dockerize(๋์ปค ์ด๋ฏธ์งํ)์์ ๊ฐ์ฅ ๋จผ์ ํ๋ ๊ฒ์ด Dockerfile ๋ง๋ค๊ธฐ | | tag | image๋ฅผ ์๋ณํ ์ ์๋ ๋ ์ด๋ธ ๊ฐ | โ์ด๋ฆ:ํ๊ทธ๋ช โ ex) ubuntu:latest | | repository | image๋ฅผ ๋ชจ์๋๋ ์ ์ฅ์ | ๋ค์ํ ํ๊ทธ๋ก ์ง์ ๋ ์ด๋ฏธ์ง๊ฐ ๋ชจ์ฌ์๋ ์ ์ฅ์ | | registry | repository์ ์ ๊ทผํ ์ ์๊ฒ ํ๋ ์๋น์ค | registry์๋ ๋ค์ํ repository๊ฐ ์์. ์์ ์ด ์ํ๋ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ์ ์ฌ์ฉ ex) Docker Hub |
- comman line interface
- https://docs.docker.com/reference/cli/docker/
| ๋ช
๋ น์ด | ๋ด์ฉ | ์์ | ์์ ๋์ | docs |
| ---------------- | ---------------------------------------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------- | ----------------------------------------------------------- |
| docker bulid | Dockerfile์ ๊ธฐ์ค์ผ๋ก image๋ฅผ ๋น๋ | docker build -t foo:bar ./
| ./์ ์๋ Dockerfile ๊ธฐ์ค์ผ๋ก image๋ฅผ ๋น๋ํ๊ณ , foo:bar
๋ผ๋ ํ๊ทธ๋ฅผ ๋ถ์ธ๋ค | https://docs.docker.com/reference/cli/docker/image/build/ |
| docker push | image๋ repository๋ฅผ ๋์ปค registry์ ์
๋ก๋ํ๋ ๊ณผ์ | docker push dusunax/foo:bar
| dusunax ์ฌ์ฉ์ ๊ณ์ ์ foo:bar
์ด๋ฏธ์ง๋ฅผ pushํ๋ค | https://docs.docker.com/reference/cli/docker/image/push/ |
| docker image tag | image์ tag๋ฅผ ์์ฑ | docker image tag ์๋ณธ์ด๋ฏธ์ง:ํ๊ทธ ๋ณ๊ฒฝํ ์ด๋ฏธ์ง:ํ๊ทธ
| ๊ธฐ์กด image์ ์๋ก์ด tag๋ฅผ ๋ถ์ธ๋ค. ํ๋์ ์ด๋ฏธ์ง์ ์ฌ๋ฌ๊ฐ์ ํ๊ทธ | https://docs.docker.com/reference/cli/docker/image/tag/ |
| docker inspect | image๋ container์ ์ธ๋ถ ์ ๋ณด ์ถ๋ ฅ | docker inspect {์ด๋ฏธ์ง๋ช
์ปจํ
์ด๋๋ช
}
| ์ธ๋ถ์ ๋ณด๋ฅผ ์ํ๋ ์ด๋ฏธ์ง๋ช
์ปจํ
์ด๋ | https://docs.docker.com/reference/cli/docker/inspect/ |
| docker run | image๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด container ์์ฑ | docker container run [OPTIONS] IMAGE [COMMAND] [ARG...] | | https://docs.docker.com/reference/cli/docker/container/run/ |
| docker ps | ๊ฐ๋ ์ค์ธ container ๋ชฉ๋ก ํ์ธ | docker stack ps [OPTIONS] STACK | | https://docs.docker.com/reference/cli/docker/container/ls/ |
| docker rm | ์ปจํ
์ด๋ ์ญ์ | docker container rm [OPTIONS] CONTAINER [CONTAINER...] | ์คํ ์ค์ธ ์ปจํ
์ด๋๋ฅผ ์ญ์ ํ๋ ค๋ฉด stop ํ ์ญ์ ํด์ผํจ | https://docs.docker.com/reference/cli/docker/container/rm/ |
Dockerfile
- ๋์ปคํ์ผ ์์๋ณด๊ธฐ
// Dockerfile
FROM node:18-alpine as build
# FROM ์ด๋ค ๋ฒ ์ด์ค image์์ ์คํ๋ ๊ฒ์ธ๊ฐ
# - base image: ์ด ์ด๋ฏธ์ง๋ฅผ ์คํํ๋ ๋ฐ ํ์ํ ์ด๋ฏธ์ง, docker๋ image์์ image๋ฅผ ์์ฑํ ์ ์๋ค.
# - node:18-alpine: Node.js 18๋ฒ์ ์ด ์ค์น๋์ด ์๋ ์ด๋ฏธ์ง๊ฐ alpine ์ด์์ฒด์ ์์์ ์คํ๋๋ค.
# ์ํ์ธ ๋ฆฌ๋
์ค
# - ๋ฆฌ๋
์ค๋ณด๋ค ๊ฐ๋ณ๊ณ ๋น ๋ฆ
# (ํ๋จ ํ ์ฐธ๊ณ )
WORKDIR /app # ์์
๋๋ ํ ๋ฆฌ
COPY package.json ./package.json
COPY package-lock.json ./package-lock.json
# ๋ณต์ฌํ๋ ์์น๋ WORKDIR, ./app
RUN npm ci
# ์ปจํ
์ด๋์์ ๋ช
๋ น์ด ์คํ
COPY . ./
# ๋น๋๋ฅผ ์ํ ๋ฆฌ์์ค๋ฅผ COPY like src, node_modules
RUN npm run build # ์ ํ๋ฆฌ์ผ์ด์
๋น๋
alpine linux๋ฅผ ์ฌ์ฉํ๋ ์ด์
| ์ด์ | ์ค๋ช | | --------------- | -------------------------------------------------------------------------------------------------------------------------------- | | ์ต์ํ์ ํจํค์ง | ์ํ์ธ ๋ฆฌ๋ ์ค๋ ์ต์ํ์ ํจํค์ง๋ง ํฌํจํ๊ณ ์์ด ์์คํ ์์์ ์ ๊ฒ ์ฌ์ฉํจ. ์ด๋ก์จ ๋ถํ ์๊ฐ์ด ์งง๊ณ ์์คํ ๋ฆฌ์์ค ์ฌ์ฉ๋์ด ์ ์ด์ง | | ์ ํ์ ์ค์น | ์ฌ์ฉ์๊ฐ ํ์ํ ํจํค์ง๋ง ์ค์นํ์ฌ ๋ถํ์ํ ํจํค์ง๋ฅผ ๋ฐฐ์ ํ๊ณ ์์คํ ์ ๊ฐ๋ณ๊ฒ ์ ์งํ ์ ์๊ฒ ํด์ค | | ๋์ปค์ ์ต์ ํ | ๋์ปค ์ปจํ ์ด๋์ ์ต์ ํ๋์ด ์์ด ๋์ปค ์ด๋ฏธ์ง์ ํฌ๊ธฐ๊ฐ ์๊ณ , ๋ถํ ์๊ฐ์ด ๋น ๋ฆ. ์ปจํ ์ด๋ ๊ธฐ๋ฐ ํ๊ฒฝ์์ ๋ง์ด ์ฌ์ฉ | | musl libc | ์ํ์ธ ๋ฆฌ๋ ์ค๋ glibc ๋์ musl libc๋ฅผ ์ฌ์ฉ. musl libc๋ ๊ฐ๋ณ๊ณ ์ต์ ํ๋์ด ์์ด์ ์ผ๋ฐ์ ์ธ ์์ฉ ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ํฅ์์ํด |
glibc์ musl libc๋? ๋ฆฌ๋ ์ค ์์คํ ์์ ์ฌ์ฉ๋๋ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ
| ํน์ง | glibc (GNU C ๋ผ์ด๋ธ๋ฌ๋ฆฌ) | musl libc | | --------- | -------------------------------------------- | ---------------------------------------------------- | | ํฌ๊ธฐ | ํฌ๊ณ ๋ค์ํ ๊ธฐ๋ฅ์ ํฌํจํจ | ์๊ณ ์ต์ ํ๋์ด ์์ | | ํฌ๊ด์ฑ | ๊ธฐ๋ฅ์ด ๋งค์ฐ ํ๋ถํ๊ณ ํฌ๊ด์ ์ | ๋จ์ํ๋ฉด์๋ ํ์ค์ ์๊ฒฉํ ์ค์ํจ | | ์ฌ์ฉ ์ฌ๋ก | ์ผ๋ฐ์ ์ธ ๋ฆฌ๋ ์ค ์์คํ ๋ฐ ์๋ฒ ํ๊ฒฝ์ ์ ํฉํจ | ๊ฒฝ๋ํ๋ ์์คํ , ์๋ฒ ๋๋ ์ฅ์น, ์ปจํ ์ด๋ ๋ฑ์ ์ ํฉํจ |
์ด๋ฏธ์ง ๋น๋ํด๋ณด๊ธฐ
- Node.js๋ง ์คํ๋๋ ์ด์ โ FROM node:18-alpine์
CMD [ "node" ]
๋์ปค์์ dangling ์ด๋ฏธ์ง๋?
- Docker dangling images๋ Docker์์ ์ฌ์ฉ๋๋ ์ฉ์ด ์ค ํ๋์ ๋๋ค. "Dangling"์ Docker ์ด๋ฏธ์ง์ ์ํ๋ฅผ ์ค๋ช ํ๋ ์ฉ์ด๋ก ์ฌ์ฉ๋ฉ๋๋ค.
- Docker ์ด๋ฏธ์ง๋ ํ์ผ ์์คํ ๋ ์ด์ด์ ์งํฉ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ๋ ์ด์ด๋ ๋ณ๊ฒฝ๋์ง ์๋ ์บ์๋ ์ด๋ฏธ์ง, ์ญ์ ๋ ์ด๋ฏธ์ง ๋ฑ ๋ค์ํ ์ํ๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. Dangling ์ด๋ฏธ์ง๋ ๋ค๋ฅธ ์ด๋ฏธ์ง์ ๋ถ๋ชจ๊ฐ ์๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ฆ, ๋ค๋ฅธ ์ด๋ฏธ์ง์์ ํ์๋์ง ์๊ณ ๋จ๊ฒจ์ง ์ด๋ฏธ์ง๋ฅผ ์๋ฏธํฉ๋๋ค.
- ์ด๋ฌํ dangling ์ด๋ฏธ์ง๋ค์ ๋ณดํต Docker ๋น๋ ํ๋ก์ธ์ค๋ ์ด๋ฏธ์ง ์ ๋ฐ์ดํธ ์์ ๋ฑ์์ ๋ฐ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Dockerfile์ ์์ ํ๊ณ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋น๋ํ๋ฉด ์ด์ ์ด๋ฏธ์ง์ dangling ๋ฒ์ ์ด ์์ฑ๋ ์ ์์ต๋๋ค.
- ์ผ๋ฐ์ ์ผ๋ก dangling ์ด๋ฏธ์ง๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก ์์คํ
๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์๋๋ฐ, ์ด๋ฅผ ์ ๋ฆฌํ์ง ์์ผ๋ฉด ๋์คํฌ ๊ณต๊ฐ์ ๋ญ๋นํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ๊ธฐ์ ์ผ๋ก ์ด๋ฌํ dangling ์ด๋ฏธ์ง๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
docker image prune
๋ช ๋ น์ ์ฌ์ฉํ์ฌ dangling ์ด๋ฏธ์ง๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
nginx ์ด๋ฏธ์ง
FROM nginx:1.23.2-alpine as start
# ๋น๋๋ ์ ์ ํ์ผ์ ์๋น์คํ๊ธฐ ์ํ ์ํ์ธ ๋ฆฌ๋
์ค ์ค์น
COPY ./nginx/nginx.conf /etc/nginx/nginx.conf # ๋น๋ํ ํ์ผ์ ์๋น์คํ ์ ์๋๋ก nginx ์ค์ ํ์ผ ๋ณต์ฌ
COPY --from=build /app/build /usr/share/nginx/html
# --from=build๋ ์์ as build๋ก ์ ์ธํ ๋จ๊ณ์์ ๋ณต์ฌํด ์จ๋ค๋ ๋ป
EXPOSE 3000
# ์ด์ด์ค ํฌํธ๋ ๋์ปค image๋ฅผ ์คํํ ๋, ํธ์คํธ ์ด์์ฒด์ ์์ ์คํ๋๋ค.
# - ๋์ปค๊ฐ ์ฝ๋ ์ ๋ณด๋ ์๋๊ณ , ์ด๋ค ํฌํธ๊ฐ ์ด๋ ค ์๋์ง ์์ฑ์๊ฐ ์๋ ค์ฃผ๋ ์ฉ๋๋ก ์ฌ์ฉ
ENTRYPOINT ["nginx", "-g", "daemon off;"]
# ์ปจํ
์ด๋๊ฐ ์์๋์ ๋ ๋จ ํ ๋ฒ ์คํํ ์ ์๋ ๋ช
๋ น ๊ฒฐ์
Next.js๋? ์๋ฒ ์คํ์ด ํ์ํ๋ค.
- ๋ง์ฝ next export๋ก ์ ์ ๋ฆฌ์์ค๋ง ๋ด๋ณด๋ด๋ ๊ฒฝ์ฐ, ์๋ฒ ์ฌ์ด๋ ๋๋๋ง์ด ์์ผ๋ฏ๋ก ์๋ฒ ๋์ปค๋ผ์ด์ฆ ๊ณผ์ ํ์x
- next.config.js { output: "standalone" }
- ํ๋ก๋์ ์ ํ์ํ ํ์ผ๋ง ๋ชจ์์ ๋ฐ๋ก ์คํํ ์ ์๋ ์ค๋น
# Step 1: deps
FROM node:18-alpine as deps
WORKDIR /app
COPY package.json ./package.json
COPY pnpm-lock.yaml ./pnpm-lock.yaml
RUN npm install -g pnpm && \
pnpm install
# Step 2: build
FROM node:18-alpine as build
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . ./
RUN npm install -g pnpm && \
pnpm build
# Step 3: runner
FROM node:18-alpine as runner
COPY --from=build /app/public ./public
COPY --from=build /app/.next/standalone ./public # CDN์ผ๋ก ๋ณ๋๋ก ์ ๊ณตํ๊ฑฐ๋, standalone ๋ด๋ถ์ ๋๊ฑฐ๋
COPY --from=build /app/.next/static ./.next/static
EXPOSE 3000
ENTRYPOINT ["node", "server.js"]
์ด๋ฏธ์ง ์ ๋ก๋ํ๊ธฐ
- ์
๋ก๋ ํ ์ ์๋ ์ฅ์
- AWS์ ECR, GCP์ Container Registry, Docker hub
- credential์ ์ป๊ณ , ์๊ฒฉ ์ด๋ฏธ์ง ์ ์ฅ์ ์ด๋ฆ์ ๋ง๊ฒ ํ๊ทธ๋ฅผ ๋ณ๊ฒฝํ๊ณ , ํธ์ํ๋ค
Google Cloud Platform ๊ฐ์ ํ๊ธฐ
- ๋ฐฐํฌ ์๋ฃ ๐: https://next-nmysy2cnia-uc.a.run.app/