[๐ŸณDocker] Node.js๋กœ Docker ์‹ค์Šตํ•˜๊ธฐ

Kimseongeunยท2022๋…„ 5์›” 24์ผ

docker

๋ชฉ๋ก ๋ณด๊ธฐ
1/5
post-thumbnail

Node.js๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹น์—ฐํžˆ Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผํ•œ๋‹ค.

Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผย npm install,ย npm init ๋˜๋Š”ย node server.js์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Node.js๋Š” ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€์—์„œ ์‰ฝ๊ฒŒ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์„ค์น˜๊ฐ€ ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œย node -v ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ค์น˜ ๋ฒ„์ „์ด ๋‚˜์˜จ๋‹ค๋ฉด ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ์€ Node.js ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์œผ๋กœ ์ด๋™ํ•ด์ค€๋‹ค. ๋‹ค์Œ์€ย npm init -yย ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์„œย package.jsonย ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.ย package.jsonย ํŒŒ์ผ์€ ์ข…์†์„ฑ์„ ๋ช…์‹œํ•œ ํŒŒ์ผ๋กœ ํŒŒ์ด์ฌ์˜ย requirements.txtย ํŒŒ์ผ๊ณผ ๋น„์Šทํ•œ ์—ญํ• ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

์ž๋™ ์ƒ์„ฑ๋˜๋Š”ย package.jsonย ํŒŒ์ผ์„ ์•ฝ๊ฐ„ ์ˆ˜์ •ํ•ด์ค€๋‹ค. index.js๋ฅผ server.js๋กœ ์ˆ˜์ •ํ•ด์ฃผ๊ณ ย express.jsย ๋ฅผย dependencies์— ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

npm install express์™€ npm install redis๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๊ณ  package.json์„ ํ™•์ธํ•ด์ฃผ์ž.

{
  "name": "docker-practice",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.18.1",
    "redis": "^3.0.2"
  }
}

๊ทธ ํ›„ server.js๋ฅผ ์ž‘์„ฑํ•ด์ค€๋‹ค.

const express=require('express');

const PORT=8080;

const app=express();

app.get('/', (req, res) => {
    res.send("๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค.");
})

app.listen(PORT, ()=>{
    console.log('Server is running');
})

๋„์ปคํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

๊ทธ ๋‹ค์Œ์€ ๋„์ปค ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.

FROM node:10

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]
  1. FROM node:10ย ์€ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋ฅผ ๋ช…์‹œํ•œ๋‹ค. node๋ผ๋Š” ์ด๋ฏธ์ง€์— ํƒœ๊ทธ๋Š” 10์ธ ์ด๋ฏธ์ง€๋ฅผ ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  2. COPY ./ ./ย ๋Š” ๋ช…๋ น์–ด ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌ๋ฅผ ๋ช…์‹œํ•œ๋‹ค.ย COPY <local file or directory> <image directoryย ๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œย COPY ./ ./ย ๋Š” local directory ์˜ย package.jsonย ,ย server.jsย ๋ฅผ ๊ทธ๋Œ€๋กœ image์˜ root directory์— ๋ณต์‚ฌํ•œ๋‹ค.
  3. npm installย ์€ ์„ค์น˜๋œ Node.js๋ฅผ ์ด์šฉํ•ด์„œย package.jsonย ์— ๋ช…์‹œ๋œ ์ข…์†์„ฑ์„ ์›น์—์„œ ์ž๋™์œผ๋กœ ๋‹ค์šด๋กœ๋“œ ๋ฐ›๋Š”๋‹ค. ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ย npmย ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ์ฆ‰,ย node:10ย ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€์— Node.js๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค.
  4. CMD ["node", "server.js"]ย ๋Š”ย server.js๋ฅผ ๊ตฌ๋™์‹œํ‚จ๋‹ค.

์ด์ œ Dockerfile์„ ์ด์šฉํ•ด์„œ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ๋นŒ๋“œํ•ด๋ณด์ž.

๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋ฐ ์‹คํ–‰

docker build . -t <์ด๋ฏธ์ง€ ์ด๋ฆ„:ํƒœ๊ทธ>

์œ„์˜ ๋ช…๋ น์–ด์—์„œย .ย ์€ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.ย -tย ๋Š” ๋„์ปค ์ด๋ฏธ์ง€์˜ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋ฅผ ๋ช…์‹œํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ์ด๋ฏธ์ง€ ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ์ด๋ฆ„๊ณผ ํƒœ๊ทธ๊ฐ€ย <none>์œผ๋กœ ์„ค์ •๋œ๋‹ค.

๊ทธ๋ ‡๊ฒŒ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด ์ž˜ ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ๋‚ด๊ฐ€ ์ •ํ•œ ์ด๋ฆ„์˜ nodeJs๋กœ ๋นŒ๋“œ๊ฐ€ ๋œ ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋˜์—ˆ๋‹ค.

๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

docker run -p 5000:8080 <์ด๋ฏธ์ง€์ด๋ฆ„>

-pย ์˜ต์…˜์€ ํฌํŠธ ๋งคํ•‘์„ ์˜๋ฏธํ•œ๋‹ค.ย server.js๋Š” ํฌํŠธ 8080 ๋ฒˆ์œผ๋กœ ์†Œํ†ตํ•œ๋‹ค. ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์™€ ์ปจํ…Œ์ด๋„ˆ ๋„คํŠธ์›Œํฌ๋Š” ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๋กœ์ปฌ์˜ 5000๋ฒˆ ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ 8080ํฌํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ํฌํŠธ ๋งคํ•‘์ด ํ•„์š”ํ•˜๋‹ค.

์ด๋ ‡๊ฒŒ server.js์—์„œ ์ฝ˜์†”๋กœ๊ทธ๋กœ ์„ค์ •ํ•ด์ค€ ๋ฉ”์„ธ์ง€๊ฐ€ ์ž˜ ๋œจ๋Š” ๊ฑฐ๋ฉด ์ด๋ฏธ์ง€๋ฅผ ์‹คํ–‰์‹œํ‚จ๊ฑฐ๋ผ ๋ณด๋ฉด ๋œ๋‹ค.

์„œ๋ฒ„๊ฐ€ ์ž˜ ๋Œ์•„๊ฐ€๊ณ  ์žˆ๋Š”์ง€ย localhost:5000์œผ๋กœ ์ ‘์†ํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

WORKDIR ์ด์šฉํ•˜๊ธฐ

WORKDIRย ์€ ๋„์ปค ์ด๋ฏธ์ง€ ๋‚ด์—์„œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ด๋™ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰ย cdย ์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•œ๋‹ค.

WORKDIRย ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ฃผ์š”ํ•œ ์ด์œ ๋Š” ๋ฎ์–ด์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋‹ค. ๋งŒ์•ฝ ๋กœ์ปฌ์—ย libย ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๊ณ  ๋„์ปค ์ด๋ฏธ์ง€ ๋‚ด๋ถ€์—๋„ย libย ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์žˆ๋Š” ์ƒํ™ฉ์—์„œย COPY ./ ./ย ๋ฅผ ๋ช…์‹œํ•˜๋ฉด ๋„์ปค ์•ˆ์˜ย lib์€ ๋ฎ์–ด์”Œ์›Œ์ง„๋‹ค. ์ฆ‰, ์‚ฌ๋ผ์ง„๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ทธ๋ž˜์„œย COPY๋ฅผ ํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ด๋™์‹œ์ผœ์ฃผ๋Š”ย WORKDIRย ์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ์ข‹๋‹ค.

์šฐ์„ ย WORKDIR์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์˜ ๋‚ด๋ถ€ ๋ชจ์Šต์„ ๋ณด์ž.

Dockerfile,ย server.js,ย package.json๋“ฑ์ด ์ปจํ…Œ์ด๋„ˆ์˜ root directory์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋ชจ์Šต์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฒˆ์—๋Š” Dockerfile์„ ์ˆ˜์ •ํ•ด์„œ ๋‹ค๋ฅธ ๋””๋ ‰ํ† ๋ฆฌ์—ย COPY๋ฅผ ์ง„ํ–‰ํ•ด๋ณด๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ž.

FROM node:10

WORKDIR /usr/src/app

COPY ./ ./

RUN npm install

CMD ["node", "server.js"]

ํ™•์‹คํžˆ WORKDIR์„ ์ถ”๊ฐ€์•ˆํ–ˆ์„ ๋•Œ์˜ ํŒŒ์ผ๊ตฌ์กฐ์™€ ํ–ˆ์„ ๋•Œ์˜ ํŒŒ์ผ ๊ตฌ์กฐ๊ฐ€ ํ™•์—ฐํžˆ ๋‹ค๋ฆ„์„ ์•Œ ์ˆ˜ ์žˆ๋”ฐ.

๊ทธ ์ด์œ ๊ฐ€ ๋ฐ”๋กœย WORKDIR์„ ์‚ฌ์šฉํ•ด์„œ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ด๋™์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ˜„์žฌย c5353a37c500 ์ปจํ…Œ์ด๋„ˆ์˜ ๋””๋ ‰ํ† ๋ฆฌ๋Š” root ๊ฐ€ ์•„๋‹Œย /usr/src/app๋‹ค. ๊ทธ๋ž˜์„œ root ๋””๋ ‰ํ† ๋ฆฌ์—์„œ ๋ณด์—ฌ์ง€๋Š” ํŒŒ์ผ๊ณผ ํด๋”๋Š” ๋ณด์ด์ง€ ์•Š๊ณ  Node.js ํŒŒ์ผ๋“ค๊ณผ Dockerfile ๋งŒ ๋ณด์ด๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๋” ์ž์„ธํžˆ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ ‘์†ํ•ด์„œ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์•ฑ ์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ ์žฌ๋นŒ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์ž.

docker build -t nodej2

  • 2๋ฒˆ์—์„œ ์‚ดํŽด๋ณธ Dockerfile์€ ์ด๋ฏธ ํšจ์œจ์ ์ธ ์žฌ๋นŒ๋“œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ž‘์„ฑ๋œ ๊ฒƒ์ด๋‹ค.
  • ์–ด๋–ค ๋ถ€๋ถ„์ด ์žฌ๋นŒ๋“œ์˜ ํšจ์œจํ™”๊ฐ€ ์ ์šฉ๋œ ๊ฒƒ์ธ์ง€ ์งš์–ด๋ณด์ž.
  • Dockerfile์— COPY ํ‚ค์›Œ๋“œ๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค.
  • ์‹ค์ œ ์œ„์—์„œ ์ง„ํ–‰ํ–ˆ๋˜ ๋นŒ๋“œ ๋‚ด์šฉ์„ ๋ณด๋ฉด, RUN์˜ ์ „ํ›„๋กœ 1๋ฒˆ์”ฉ COPY๊ฐ€ ์ง„ํ–‰๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์‚ฌ์‹ค RUN ์ด์ „์—ย COPY ./ ./ย ๋ฅผ ํ•œ๋ฒˆ๋งŒ ์ž‘์„ฑํ•˜๋”๋ผ๋„ ์ดํ›„ ๊ณผ์ •์ด ์ง„ํ–‰๋˜๋Š” ๋ฐ์— ์žˆ์–ด ๋ฌด๋ฆฌ๊ฐ€ ์—†๋‹ค.
  • ๊ทธ๋Ÿผ์—๋„ ๊ตณ์ด COPY๋ฅผ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ž‘์„ฑํ•œ ์ด์œ ๋Š” ๋ญ˜๊นŒ?
    • ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์žฌ๋นŒ๋“œ ๊ณผ์ •์—์„œ์˜ ํšจ์œจํ™”๋ฅผ ์œ„ํ•œ ์•ˆ๋ฐฐ์ธ ๊ฒƒ์ด๋‹ค.
    • ๋นŒ๋“œ์‹œ์— RUN ์ปค๋งจ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ์š”๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
      • ์ฒซ์งธ, ์ตœ์ดˆ์˜ ๋นŒ๋“œ์ผ ๋•Œ -> ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋œ๋‹ค.
      • ๋‘˜์งธ, ์žฌ๋นŒ๋“œ ์ผ ๋•Œ -> ๋ณต์‚ฌ๋œ ์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ๋“ค ์ค‘ ๋‹จ ํ•˜๋‚˜๋ผ๋„ ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฉด ์‹คํ–‰๋œ๋‹ค. (์ฆ‰, ๋ณ€๋™์‚ฌํ•ญ์ด ์—†์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Œ)
    • ๋ฌธ์ œ๋Š” ํ•ด๋‹น ๋ช…๋ น์–ด๊ฐ€ npm install์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค package.json์ด ๋ณ€ํ™”ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ๊ตณ์ด npm install์„ ๋˜ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • ํ—ˆ๋‚˜ ๋งŒ์•ฝ ๋‹ค๋ฅธ ํŒŒ์ผ์— ๋ณ€๋™์‚ฌํ•ญ์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ๋ช…๋ น์–ด๊ฐ€ ๊ฐ•์ œ๋˜๋ฉด์„œ ๋ชจ๋“  ๋ชจ๋“ˆ(node_modules)์„ ๋‹ค์‹œ ๋ฐ›๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋ฐ–์— ์—†๋‹ค.
    • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, RUN ์ด์ „์—๋Š” package.json๋งŒ COPY๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , RUN ์ดํ›„์— ๋‚˜๋จธ์ง€ ๋‹ค๋ฅธ ์†Œ์Šค์ฝ”๋“œ ํŒŒ์ผ์„ COPY ํ•จ์œผ๋กœ์จ ๋ชจ๋“ˆ ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ฐ›๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ฒƒ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒ์„ฑํ•œ ์ด๋ฏธ์ง€๋กœ Node.js ์•ฑ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋„์›Œ๋ณด๊ณ  ๋กœ์ปฌ์—์„œ ์ ‘์†ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•ด๋ณด์ž.

**docker run -d -p 4000:8080 nodej2**

docker run -d -p {๋กœ์ปฌ ํฌํŠธ}:{์ปจํ…Œ์ด๋„ˆ ํฌํŠธ} {์ด๋ฏธ์ง€ ์ด๋ฆ„}

  • ๋„์ปค ํ™˜๊ฒฝ์—์„œ ๋„์šด ์„œ๋ฒ„๋ฅผ ๋กœ์ปฌ์—์„œ ์ ‘์†ํ•˜๊ธฐ ์œ„ํ•ด์„ , ์œ„์™€ ๊ฐ™์€ ์ปค๋งจ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์‹ค์Šต

docker run -d -p 4000:8080 bakumando/docker-test1

์„ ์ž…๋ ฅํ•ด๋ณด์•˜๋‹ค. ๋งŒ๋“ค์–ด ๋‘” bakumando/docker-test1 ์ด๋ฏธ์ง€๋ฅผ ํ† ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰ํ•˜๋Š” ์ปค๋งจ๋“œ์ด๋‹ค.

  • d: detach ์˜ต์…˜์œผ๋กœ์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰์ค‘์ธ ์ƒํƒœ๋กœ ๋‘๊ณ  ๋น ์ ธ๋‚˜์˜ค๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๋ถ™์ด์ง€ ์•Š์œผ๋ฉด ๋„์ปค ๋‚ด๋ถ€์—์„œ ์„œ๋ฒ„๋ฅผ ๋„์šด ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

  • p: ํฌํŠธ ๋ถ€์—ฌ ๋ฐ ์—ฐ๊ฒฐ์„ ์œ„ํ•œ ์˜ต์…˜์ด๋‹ค.

  • {๋กœ์ปฌ ํฌํŠธ}:{์ปจํ…Œ์ด๋„ˆ ํฌํŠธ}: ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๋„์›Œ์ง„ ์„œ๋ฒ„๋ฅผ ๋กœ์ปฌ์—์„œ ์•„๋ฌด๋Ÿฐ ์—ฐ๊ฒฐ์  ์—†์ด ์ ‘์†ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋กœ์ปฌ ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ์˜ ๋งคํ•‘์ด ํ•„์š”ํ•˜๋‹ค.ย {๋กœ์ปฌ ํฌํŠธ}:{์ปจํ…Œ์ด๋„ˆ ํฌํŠธ}ย ๊ทœ์น™์— ๋งž๊ฒŒ ๊ธฐ์ž…ํ•˜๋ฉด ์„œ๋กœ ๊ฐ„ ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง„๋‹ค. ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋Š” index.js์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋“ฏ์ด 8080์œผ๋กœ ์„ค์ •ํ•ด๋‘์—ˆ๊ณ , ๋กœ์ปฌ ํฌํŠธ๋Š” ๋งˆ์Œ๊ป ์ง€์ •ํ•ด๋„ ์ข‹๋‹ค. ์—ฌ๊ธฐ์„  4000์œผ๋กœ ํ•ด๋ณด์•˜๋‹ค.

  • ์ ‘์†์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋งˆ์ง€๋ง‰์—” ์—ญ์‹œย {์ด๋ฏธ์ง€ ์•„์ด๋””}๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค. ์ฆ‰,ย docker run๊ณผย {์ด๋ฏธ์ง€ ์•„์ด๋””}ย ์‚ฌ์ด์— ํฌํŠธ ์˜ต์…˜์„ ๋„ฃ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

์žฌ๋นŒ๋“œ ํšจ์œจํ™” ํ…Œ์ŠคํŠธ

  • ํ˜„์žฌ Dockerfile์˜ COPY ๋ถ€๋ถ„์€ RUN ์ด์ „๊ณผ ์ดํ›„๋กœ ๊ฐ๊ฐ ๋‚˜๋‰˜์–ด ์žˆ๋‹ค. (RUN ์ด์ „:ย COPY package.json ./, RUN ์ดํ›„:ย COPY ./ ./)
  • ๋˜ํ•œ index.js์˜ hello world๋ฅผ -> hi world๋กœ ๋ฐ”๊พธ์—ˆ๋‹ค

์ฆ‰, package.json์ด ์•„๋‹Œ ๋‹ค๋ฅธ ํŒŒ์ผ์˜ ์†Œ์Šค๋ฅผ ๋ณ€๊ฒฝํ•œ ์…ˆ์ด๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์ปค๋งจ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•˜์˜€๋‹ค.

docker build -t kse/docker-test ./

4๋ฒˆ ์Šคํ…์—์„œ npm install์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ณ , ์บ์‹ฑ๋งŒ ํ•œ ๋’ค ๋์ด ๋‚ฌ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. RUN ์ด์ „์— ๋ณต์‚ฌ๋œ ํŒŒ์ผ์ด ์ด์ „ ๋นŒ๋“œ์™€ ๋‹ฌ๋ผ์ง„ ๊ฒŒ ์—†๋‹ค๋ฉด RUN์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ index.js์˜ ์†Œ์Šค์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜์˜๋˜์—ˆ๋Š”์ง€๋„ ํฌํŠธ ์ ‘์†์„ ํ†ตํ•ด์„œ ํ™•์ธํ•ด๋ณด์ž.

์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ •์ƒ์ ์œผ๋กœ ์ด๋ฃจ์–ด์กŒ์Œ์ด ํ™•์ธ๋˜์—ˆ๋‹ค.

Docker Volume์„ ํ†ตํ•ด ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ํ•„์š” ์—†์ด, ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ง์ ‘ ์ฐธ์กฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•œ๋‹ค.

docker run -p 4000:8000 -v /usr/src/app/node_modules -v $(pwd):/usr/src/app kse/docker-test

  • ์ด์ „ ์ฑ•ํ„ฐ๋ฅผ ํ†ตํ•ด Dockerfile์˜ COPY ๊ตฌ์—ญ์„ RUN ์ด์ „๊ณผ ์ดํ›„๋กœ ๋‚˜๋ˆ„์–ด ์คŒ์œผ๋กœ์จ ์žฌ๋นŒ๋“œ ์‹œ์— ๋ถˆํ•„์š”ํ•œ ๋ชจ๋“ˆ ๋‹ค์šด์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด์•˜๋‹ค.
  • ๋‹ค๋งŒ ์•„์ง๋„ ๋ถˆํŽธํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด, ์†Œ์Šค์ฝ”๋“œ ๋ณ€๊ฒฝ์‹œ ๋งˆ๋‹ค ์žฌ๋นŒ๋“œ๋ฅผ ํ•ด์ฃผ๊ณ  ๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ด์ค˜์•ผ ๋ณ€๊ฒฝ๋œ ์†Œ์Šค๊ฐ€ ๋ฐ˜์˜๋œ๋‹ค๋Š” ์ ์ผ ๊ฒƒ์ด๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ์‹œ๊ฐ„์ ์œผ๋กœ๋‚˜ ๋น„์šฉ์ ์œผ๋กœ๋‚˜ ๋น„ํšจ์œจ์ ์ด๋ฉฐ, ์ด๋ฏธ์ง€๋ฅผ ์ง€์†ํ•ด์„œ ๋งŽ์ด ๋นŒ๋“œํ•˜๊ฒŒ ๋˜๋Š” ๋ฌธ์ œ์ ์ด ์žˆ๋‹ค.
  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ๋ฒ•์ด Docker Volume์ด๋‹ค.

Docker Volume

  • Docker Volume์€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ง์ ‘ ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ๋งคํ•‘(์ฐธ์กฐ)ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๋กœ์ปฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ์„ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

docker run -p 4000:8000 -v {๋งคํ•‘ํ•˜์ง€ ์•Š์„ ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ} -v $(pwd):{๋งคํ•‘ํ•  ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ} {์ด๋ฏธ์ง€ ์•„์ด๋””}

  • ์ฒซ๋ฒˆ์งธ -v์˜ต์…˜:ย -v ๋’ค์—, ๋กœ์ปฌ์—์„œย {๋งคํ•‘ํ•˜์ง€ ์•Š์„ ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ}๋ฅผ ๋„ฃ๋Š”๋‹ค. ๋ณดํ†ต ๋ชจ๋“ˆ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์—ฌ๊ธฐ์— ์ ์šฉํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ด์–ด์งˆย 
    -v $(pwd):{๋งคํ•‘ํ•  ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ}์—์„œ ๋กœ์ปฌ ๊ฒฝ๋กœ์˜ ๋ชจ๋“ˆ ํŒŒ์ผ๋„ ๋งคํ•‘์— ํ•ด๋‹น๋  ๊ฒƒ์ด๋‹ค. ๋ฌธ์ œ๋Š” ๋กœ์ปฌ์—์„  npm install์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์—node_modules(๋ชจ๋“ˆ ํŒŒ์ผ)์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.

!! ์ฒซ๋ฒˆ์งธ -v์˜ต์…˜์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค

๋”ฐ๋ผ์„œ ์ฒซ๋ฒˆ์งธ -v์˜ต์…˜์„ ์ ์šฉํ•จ์œผ๋กœ์จ ์—๋Ÿฌ ๋ฐœ์ƒ์„ ๋ฐฉ์ง€ํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ๋ชจ๋“ˆ ํŒŒ์ผ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

  • ๋‘ ๋ฒˆ์งธ -v์˜ต์…˜: :(์ฝœ๋ก ) ์„ ๊ฒฝ๊ณ„๋กœ$(pwd)์™€ {๋งคํ•‘ํ•  ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ}๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

  • pwd๋Š” ๋กœ์ปฌ์˜ ํ˜„์žฌ ๊ฒฝ๋กœ ๊ฐ’์„ ๋œปํ•œ๋‹ค.

  • :(์ฝœ๋ก )์€ ํฌํŠธ ์—ฐ๊ฒฐ์—์„œ๋„ ํ™•์ธํ–ˆ๋“ฏ์ด ์ „ํ›„๋ฅผ ๋งคํ•‘ํ•  ๋•Œ ์“ฐ์ด๋Š” ํ‚ค์›Œ๋“œ์ด๋‹ค.

  • ์ฆ‰,ย pwd(๋กœ์ปฌ์˜ ํ˜„์žฌ ๊ฒฝ๋กœ)์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์ดย {๋งคํ•‘ํ•  ์ปจํ…Œ์ด๋„ˆ ๊ฒฝ๋กœ}์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์„ ๋Œ€์ฒดํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  • volume์€ ๋‹ค ์ข‹์ง€๋งŒ ์•„๋ฌด๋ž˜๋„ ๋งคํ•‘ ๊ด€๊ณ„์˜ ๋””ํ…Œ์ผํ•œ ์„ค์ •์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปค๋งจ๋“œ๊ฐ€ ๊ต‰์žฅํžˆ ๊ธธ์–ด์ง„๋‹ค๋Š” ์ ์€ ๋‹จ์ ์ด ์žˆ๋‹ค.

    • ๋‚˜์ค‘์— ๋ฐฐ์šฐ์ง€๋งŒ docker-compose์™€ yml ํŒŒ์ผ์„ ํ†ตํ•ด ์ด๋Ÿฌํ•œ ๋‹จ์ ์„ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์Šต

  • server.js์˜ hi world๋ฅผ hello hi world๋กœ ๋ฐ”๊ฟ”๋ณด์•˜๋‹ค.
const express=require('express');

const PORT=8080;

const app=express();

app.get('/', (req, res) => {
    res.send("hello hi world");
})

app.listen(PORT, ()=>{
    console.log('Server is running');
})
  • ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์•˜๋‹ค.
  • docker run -p 5500:8080 -v /usr/src/app/node_modules -v ${pwd}:/usr/src/app kse/docker-test1

  • hello hi world๊ฐ€ ํ™•์ธ๋˜์—ˆ๋‹ค.
  • ์žฌ๋นŒ๋“œํ•˜์ง€ ์•Š์•˜์Œ์—๋„ ๋ณ€๊ฒฝ๋œ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋Š”๋ฐ ์„ฑ๊ณตํ•œ ๊ฒƒ์ด๋‹ค.
profile
๊น€์„ฑ์€์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€