[TIL-20260131] Docker ์ด๋ฏธ์ง€ ๋‹ค๋ฃจ๊ธฐ

2026. 1. 31. 22:28ยทToday I Learned ๐Ÿง

๐Ÿ€ 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
'Today I Learned ๐Ÿง' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [TIL-20260203] ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ - Linked List , ์ด์ง„ ํƒ์ƒ‰(Binary Search)
  • [TIL-20260202] Kotlin data class, enum class
  • [TIL-20260129] Docker ์ปจํ…Œ์ด๋„ˆ ๋‹ค๋ฃจ๊ธฐ
  • [TIL-20260128] Nginx Basic Auth, Github Actions๋กœ .htpasswd ์ƒ์„ฑ
ํ•ด๋‹ˆ ๐ŸŒฑ
ํ•ด๋‹ˆ ๐ŸŒฑ
๊ธฐ๋ก์ด ์ž์‚ฐ์ด๋‹ค ( •ฬ€แด—•ฬ )ูˆโœ๏ธ
  • ํ•ด๋‹ˆ ๐ŸŒฑ
    haeni.dev
    ํ•ด๋‹ˆ ๐ŸŒฑ
  • ๋งํฌ

    • github
    • velog
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (25)
      • ์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ (4)
      • Today I Learned ๐Ÿง (19)
      • ๋ถ„๋…ธ์˜ ํƒ€์ดํ•‘ ๋กœ๊ทธ ๐Ÿ”ฅ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์ฝ”ํ…Œ
    AWS
    ๊ฐœ๋ฐœ์ž
    til
    ๋ฐฑ์—”๋“œ
    ci/cd
    IT
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    springboot
    ๊ฐœ๋ฐœ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
ํ•ด๋‹ˆ ๐ŸŒฑ
[TIL-20260131] Docker ์ด๋ฏธ์ง€ ๋‹ค๋ฃจ๊ธฐ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”