
๐ To Do List

๐ฉ๐ป๐ป Today I Learned ...
Docker Image ๊ตฌ์กฐ
Layer ์ํคํ ์ฒ โก๏ธ `Docker Image`๋ ํ๋์ ํ์ผ์ด ์๋๋ผ, ์ฌ๋ฌ ๊ฐ์ ๋ ์ด๊ฑฐ๊ฐ ์์์ ์๋๋ก ์์ธ ๊ตฌ์กฐ
์๋ฅผ๋ค์ด,
`nginx` ์ด๋ฏธ์ง๋
`ubuntu `์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง → `ubuntu` ๋ ์ด์ด์ `nginx` ๋ ์ด์ด๊ฐ ๋งจ ์์ ์์
`web app` ์ด๋ฏธ์ง๋
`ubuntu + nignx` ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง → `ubuntu + nignx` ๋ ์ด์ด์ `web app source` ๋ ์ด์ด๊ฐ ๋งจ ์์ ์์ด๊ฒ ๋จ
์ด๋ฏธ์ง ๋ ์ด์ด (Image Layer)
- ์ฝ๊ธฐ ์ ์ฉ (Read Only)
- Dockerfile์ ๊ฐ ๋ช ๋ น์ด(FROM, RUN, COPY ๋ฑ)๋ก ์์ฑ๋จ
- ์บ์ ๋ฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด ์ด๋ฏธ์ง ๋น๋์ ๋ฐฐํฌ๊ฐ ํจ์จ์
์ปจํ ์ด๋ ๋ ์ด์ด (Container Layer)
- ์ผ๊ธฐ / ์ฐ๊ธฐ(Read/Writre) ๊ฐ๋ฅ
- ์ด๋ฏธ์ง ์์ ์ปจํ ์ด๋ ์คํ ์ ๋์ ์ผ๋ก ์์ฑ๋จ
- ์ปจํ ์ด๋์ ์ข ์์ ์ธ ๋ ์ด์ด โก๏ธ ์ปจํ ์ด๋ ์ญ์ ์ ํจ๊ป ์ญ์ ๋จ




`ubuntu:focal` ์ด๋ฏธ์ง ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง `my-ubuntu:v1` ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด,
`ubuntu:focal`์ ์๋ `Layers`์ ์๋ก์ด `Layer`๊ฐ ์ถ๊ฐ๋จ์ ์ ์ ์๋ค.
Dockerfile ์์ด ์ด๋ฏธ์ง ์์ฑ
๊ธฐ์กด ์ปจํ ์ด๋๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์๋ค.
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

`ubuntu` ์ปจํ ์ด๋์ ํ์ฌ ์ํ๋ฅผ `my_ubuntu:v1` ์ด๋ฏธ์ง๋ก ์์ฑํ๋ค.
`-a` ์ต์ : ์ปค๋ฐ ์์ฑ์
- `m` ์ต์ : ์ปค๋ฐ ๋ฉ์ธ์ง ๋ด์ฉ
Dockerfile ์ด์ฉํ์ฌ ์ด๋ฏธ์ง ์์ฑ
docker build [OPTIONS] PATH
์ง์ ๋ ๊ฒฝ๋ก๋ฅผ ๋น๋ ์ปจํ ์คํธ๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ค.

`./` ๋๋ ํฐ๋ฆฌ๋ฅผ ๋น๋ ์ปจํ ์คํธ๋ก `my-app:v1` ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ค.

=> [internal] load build context 0.1s
=> => transferring context: 4.61MB 0.1s
๐ก build context
- ๋์ปค ๋น๋ ๋ช ๋ น ์ํ ์ ํ์ฌ ๋๋ ํ ๋ฆฌ(Current Working Directory)
- Dockerfile๋ก๋ถํฐ ์ด๋ฏธ์ง ๋น๋์ ํ์ํ ์ ๋ณด๋ฅผ ๋์ปค ๋ฐ๋ชฌ์๊ฒ ์ ๋ฌํ๊ธฐ ์ํ ๋ชฉ์
=> [1/5] FROM docker.io/library/node:12-alpine@sha256:d4b15b3d48f42059a15bd659be60afe21762aae9d6cbea6f1244 3.1s
=> => resolve docker.io/library/node:12-alpine@sha256:d4b15b3d48f42059a15bd659be60afe21762aae9d6cbea6f1244 0.0s
=> => sha256:d4b15b3d48f42059a15bd659be60afe21762aae9d6cbea6f124440895c27db68 1.43kB / 1.43kB 0.0s
=> => sha256:986203164452fed8963c8d09b82b81a02fb92acfc1ee89b3a47acb8669a9ef58 1.16kB / 1.16kB 0.0s
=> => sha256:da9807963ae700660d2cea811a47f17702c993bcede0e5b4e027d273315506d3 6.59kB / 6.59kB 0.0s
=> => sha256:9981e73032c8833e387a8f96986e560edbed12c38119e0edb0439c9c2234eac9 2.72MB / 2.72MB 0.6s
=> => sha256:47ab09d42056df167f4389cbfc7aa0bfaa0477c3895ed15cc34fee4241565c4e 24.80MB / 24.80MB 1.7s
=> => sha256:d291a579f2606d866152338f224fc9c9b19aa71b0af0749c8b3427f30e510e8b 2.44MB / 2.44MB 1.0s
=> => extracting sha256:9981e73032c8833e387a8f96986e560edbed12c38119e0edb0439c9c2234eac9 0.1s
=> => sha256:aa621928f77470ac279d0f61322fb0ffb9240d19a2b95cfbe3f61f092a89a529 449B / 449B 1.2s
=> => extracting sha256:47ab09d42056df167f4389cbfc7aa0bfaa0477c3895ed15cc34fee4241565c4e 1.2s
=> => extracting sha256:d291a579f2606d866152338f224fc9c9b19aa71b0af0749c8b3427f30e510e8b 0.0s
=> => extracting sha256:aa621928f77470ac279d0f61322fb0ffb9240d19a2b95cfbe3f61f092a89a529 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 4.61MB 0.1s
=> [2/5] RUN apk add --no-cache python3 g++ make 6.7s
=> [3/5] WORKDIR /app 0.0s
=> [4/5] COPY . . 0.1s
=> [5/5] RUN yarn install --production
Dockerfile์ ์๋ ๋ช ๋ น์ด๋ฅผ ํ ์ค์ฉ ์ฌ์ฉํ๋ค.
ํด๋น `Docker`์ ์๋ ๋ช ๋ น์ด๊ฐ 5์ค์ด๋ผ `[1/5] ... [5/5]` ์ด๋ ๊ฒ ํํ๋๋ค.

=> CACHED [2/5] RUN apk add --no-cache python3 g++ make 0.0s
=> CACHED [3/5] WORKDIR /app 0.0s
=> [4/5] COPY . .
Dockefile ์ด๋ฏธ์ง๋ฅผ ์์ ํ ๋ค์ ๋น๋ํ์ ๋, ์ด์ ๋น๋์ ๋์ผํ ๋ช ๋ น์ด๋ ์บ์ ์ฌ์ฉ๋์ด ๋น๋ ์๊ฐ์ ๋จ์ถ์ํฌ ์ ์๋ค.
๐พ nodejs ์ด๋ฏธ์ง ๋น๋

#
# nodejs-server
#
# build:
# docker build --force-rm -t nodejs-server .
# run:
# docker run --rm -it --name nodejs-server nodejs-server
#
FROM node:16 # ๋ฒ ์ด์ค ์ด๋ฏธ์ง ์ฌ์ฉ
LABEL maintainer="FastCampus Park <fastcampus@fastcampus.com>" #์ด๋ฏธ์ง์ ๋ฉํ ๋ฐ์ดํฐ ์ค์ (์ต์
๋์ด๋ผ ํ์๋ ์๋)
LABEL description="Simple server with Node.js"
# Create app directory
WORKDIR /app # working directory ์ค์ ํ๋ค.
# Install app dependencies
# A wildcard is used to ensure both package.json AND package-lock.json are copied
# where available (npm@5+)
COPY package*.json ./ # COPY [SRC] [DEST] ํธ์คํธ ์ ๊ฒฝ๋ก์ ์๋ ํ์ผ์ WORKDIR๋ก ์ค์ ํ ์ด๋ฏธ์ง ์์ ๊ฒฝ๋ก๋ก ๋ณต์ฌํ๋ค.
RUN npm install #๋์ปค ์ด๋ฏธ์ง ๋น๋ ์์์ ํด๋น ๋ช
๋ น์ด๋ฅผ ์คํํ๋ค.
# If you are building your code for production
# RUN npm ci --only=production
# Bundle app source
COPY . . # ํ์ฌ ๋๋ ํฐ๋ฆฌ ์์ ๋ชจ๋ ํ์ผ๊ณผ ๋๋ ํฐ๋ฆฌ๋ฅผ app ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ณต์ฌํ๋ค. (์์ค ์ฝ๋ ๋ณ๊ฒฝ์ฌํญ ๋ฐ์)
EXPOSE 8080 # ํด๋น ๋์ปค ์ด๋ฏธ์ง๊ฐ 8080 ํฌํธ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋ฌธ์ํ -> -p ๋ช
๋ น์ด ์ฌ์ฉํด์ผ ํผ๋ธ๋ฆฌ์ฑ ๋จ
CMD [ "node", "server.js" ] # ์ปจํ
์ด๋์ ์ฃผ์ ํ๋ก์ธ์ค๋ฅผ ๊ฒฐ์ ํจ


์ฐธ๊ณ :
Dockerfile reference
Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.
docs.docker.com
'Today I Learned ๐ง' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [TIL-20260203] ์ฝ๋ฉ ํ ์คํธ - Linked List , ์ด์ง ํ์(Binary Search) (0) | 2026.02.03 |
|---|---|
| [TIL-20260202] Kotlin data class, enum class (0) | 2026.02.02 |
| [TIL-20260129] Docker ์ปจํ ์ด๋ ๋ค๋ฃจ๊ธฐ (0) | 2026.01.30 |
| [TIL-20260128] Nginx Basic Auth, Github Actions๋ก .htpasswd ์์ฑ (0) | 2026.01.28 |
| [TIL-20260127] @AuthenticationPrincipal , Swagger JWT ์ธ์ฆ ์ค์ (0) | 2026.01.27 |