๐Ÿ“˜ [Docker] Docker ์‹œ์ž‘ํ•˜๊ธฐ & ๋ช…๋ น์–ด ์ •๋ฆฌ

๐Ÿ“˜ [Docker] Docker ์‹œ์ž‘ํ•˜๊ธฐ & ๋ช…๋ น์–ด ์ •๋ฆฌ

[Docker] Docker ์‹œ์ž‘ํ•˜๊ธฐ & ๋ช…๋ น์–ด ์ •๋ฆฌ

Docker desktop ๋‹ค์šด๋กœ๋“œ

Docker: Accelerated Container Application Development ๋„์ปค ์„ค์น˜

WSL ์„ค์น˜

$ wsl --install
  • Windows 10/11 Professional / Education / Enterprise ์—๋””์…˜
    • WSL2 ๊ธฐ๋ฐ˜ Docker Engine ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • Hyper-V ๊ธฐ๋ฐ˜ Docker Engine ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • Windows 10/11 Home ์—๋””์…˜
    • WSL2 ๊ธฐ๋ฐ˜ Docker Engine ์‚ฌ์šฉ ๊ฐ€๋Šฅ

WSL ๋ฒ„์ „ ๊ธฐ๋ณธ๊ฐ’์„ 2๋กœ ๋ณ€๊ฒฝ

$ wsl --set-default-version 2

WSL(Windows Subsystem for Linux)ย : ์œˆ๋„์šฐ์˜ ๊ฐ€์ƒํ™” ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด, ์œˆ๋„์šฐ์—์„œ ๋ฆฌ๋ˆ…์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋„๊ตฌ

WSL์€ ์œˆ๋„์šฐ์˜ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ  Hyper-V ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

  • WSL 1ย : ์‹ค์ œ Linux ์ปค๋„ ์—†์ด ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ชจ๋“  Linux ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง€์›ํ•˜์ง€ ์•Š์Œ.
  • WSL 2ย : VM์—์„œ Linux ์ปค๋„์„ ์‹คํ–‰ํ•ด ์™„์ „ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ ํ˜ธํ™˜์„ฑ์„ ์ œ๊ณต.

Hyper-v ํ™œ์„ฑํ™” ๋ฐฉ๋ฒ•

Terminal app์„ ์‹คํ–‰์‹œ์ผœ์„œ ์•„๋ž˜ ๋ช…๋ น์–ด ์‹คํ–‰

$ Enable-WindowsOptionalFeatureย -Onlineย -FeatureNameย Microsoft-Hyper-Vย -All

๋˜๋Š”

์ปจํŠธ๋กค + s ๋ˆŒ๋Ÿฌ์„œ windows ๊ธฐ๋Šฅ ์„ ํƒ Hyper-v ์ฒดํฌ๋ฐ•์Šค ์„ ํƒ

Hyper-V ๋น„ํ™œ์„ฑํ™” ๋ฐฉ๋ฒ•

// ๋น„ํ™œ์„ฑํ™”
$ bcdedit /set hypervisorlaunchtype off
// ์‚ญ์ œ
$ Disable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All
  • ํ™œ์„ฑํ™”์ค‘์ธ์ง€ ํ™•์ธ
    $ bcdedit /enum
    

React(vite) + docker ํ™˜๊ฒฝ ์…‹ํŒ…

react ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

[[2025-04-01-react-002]] ์ฐธ๊ณ 

ํ”„๋กœ์ ํŠธ ํด๋” ๋ฃจํŠธ ๊ฒฝ๋กœ์— Dockerfile ์ƒ์„ฑ

# node ๊ธฐ๋ฐ˜ docker ์ด๋ฏธ์ง€ ์ƒ์„ฑ
FROM node

# ๊ฒฝ๋กœ ์„ค์ •ํ•˜๊ธฐ
WORKDIR /app

# package.json์„ working ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌํ•œ๋‹ค. ย ./์€ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์˜๋ฏธ
COPY package.json .

# ์˜์กด์„ฑ ์„ค์น˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
RUN npm install

# ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ์„ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์˜ working ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ
COPY . .

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ ์šฉ
# hot reloading : ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋€ ์†Œ์Šค ์ฝ”๋“œ๋งŒ ๋น ๋ฅด๊ฒŒ ๊ต์ฒดํ•ด ์ค€๋‹ค.
# ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ hot reloading์ ์šฉ์ด ๋˜์ง€์•Š์„๋–„ CHOKIDAR_USEPOLLING=true
ENV CHOKIDAR_USEPOLLING=true

# ํ•ด๋‹น ํฌํŠธ ์™ธ๋ถ€์— ๋…ธ์ถœ
EXPOSE 5173

# npm run dev ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰
CMD ["npm", "run", "dev"]

Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ

docker build -t <์ด๋ฏธ์ง€ ์ด๋ฆ„> <๊ฒฝ๋กœ>
docker build -t test_image .
docker images
  • ์ด๋ฏธ์ง€๊ฐ€ ์ž˜ ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ ํ™•์ธ

Docker ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

// docker run -d -p <host port>:<container port> --name <tag> <์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€>
docker run -d -p 3000:5173 --name test_container test_image
  • ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑ
  • ๋กœ์ปฌ์ด๋ฏธ์ง€๊ฐ€ ์—†๋‹ค๋ฉด ์›๊ฒฉ ์ €์žฅ์†Œ url์„ ์ง€์ •ํ•˜๋ฉด ์›๊ฒฉ์ €์žฅ์†Œ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.
  • -d ์˜ต์…˜์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์‹คํ–‰
  • -p ์˜ต์…˜์€ ํ˜ธ์ŠคํŠธ ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•œ๋‹ค. (ํฌํŠธ ํฌ์›Œ๋”ฉ ์„ค์ •)
  • viteํ™˜๊ฒฝ์—์„œ๋Š” ๊ธฐ๋ณธport 5173์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๊ธฐ๋•Œ๋ฌธ์— 3000:5173์œผ๋กœ ์„ค์ •
docker: Error response from daemon: Ports are not available: exposing port TCP 0.0.0.0:3000 -> 127.0.0.1:0: listen tcp 0.0.0.0:3000: bind: An attempt was made to access a socket in a way forbidden by its access permissions.
  • ํ•ด๋‹น ํฌํŠธ๊ฐ€ ์—‘์„ธ์Šค๊ฐ€ ๋˜์ง€ ์•Š์•„์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒ ํ•  ๊ฒฝ์šฐ
netsh interface ipv4 show excludedportrange protocol=tcp
  • cmd์ฐฝ์— ํฌํŠธ ์ œ์™ธ ๋ฒ”์œ„๋ฅผ ํ™•์ธ 3000ํฌํŠธ๊ฐ€ ์ œ์™ธ ๋ฒ”์œ„์— ํฌํ•จ๋œ๋‹ค๋ฉด
net stop winnat
  • cmd ๊ด€๋ฆฌ์ž ๊ถŒํ•œ์œผ๋กœ ์‹คํ–‰ ๋ช…๋ น์–ด ์‹คํ–‰

ERR_EMPTY_RESPONSE http://localhost:3000/ ์ ‘์†์ด ์•ˆ๋˜๋Š”๊ฒฝ์šฐ

๋„์ปค ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ๊ณผ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์€ ๋…๋ฆฝ์ ์ธ ํ™˜๊ฒฝ์„ ๊ฐ€์ง„๋‹ค. ์ฆ‰ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ๊ณผ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์˜ localhost๋Š” ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์ด๋‹ค. ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ localhost์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์„œ๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋–„๋ฌธ์— vite.config.js์—์„œ ์„œ๋ฒ„ ์˜ต์…˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ํ•œ๋‹ค. server host 0.0.0.0 ์˜๋ฏธ๋Š” ย LAN์™€ ๊ณต์šฉ ์ฃผ์†Œ๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์ฃผ์†Œ๋ฅผ ์ˆ˜์‹ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

vite.config.js
export default defineConfig({
  plugins: [react()],
  server: {
    host: "0.0.0.0",
    port: 5137
  },
});

.dockerignore ์ž‘์„ฑ

๋นŒ๋“œ์‹œ ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ์ œ์™ธ .gitignore์™€ ๋™์ผ Docker ์ด๋ฏธ์ง€ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ๋ถˆํ•„์š”ํ•œ ํŒŒ์ผ ํฌํ•จ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งค์šฐ ์ค‘์š”ํ•˜๋‹ค.

# Docker ๋‚ด๋ถ€์—์„œ๋„ ๋ฌด์‹œ
docker-compose*.yml
Dockerfile
.dockerignore

# Node.js ์˜์กด์„ฑ ํด๋”
node_modules
npm-debug.log
yarn-debug.log
yarn-error.log

# ๋นŒ๋“œ ๊ฒฐ๊ณผ๋ฌผ
build
dist

# ํ™˜๊ฒฝ ์„ค์ •
.env

# ์šด์˜์ฒด์ œ๋‚˜ IDE ๊ด€๋ จ
.DS_Store
# Git
.git
.gitignore
  • .env ํŒŒ์ผ์€ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋ฏ€๋กœ ์ ˆ๋Œ€ ํฌํ•จ๋˜๋ฉด ์•ˆ๋œ๋‹ค.
  • build ๋˜๋Š” dist๋Š” ๊ฐœ๋ฐœ์šฉ Dockerfile์—์„  ๋ณดํ†ต ์ œ์™ธ, ์šด์˜์šฉ Dockerfile์—์„  ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • node_modules๋Š” ๋กœ์ปฌ์—์„  ๊ผญ ํ•„์š”ํ•˜์ง€๋งŒ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ๋Š” ๋ณดํ†ต npm install์„ ๋‹ค์‹œ ํ•˜๋ฏ€๋กœ ์ œ์™ธํ•ด์•ผ ํ•œ๋‹ค.

Docker Bind Mount & Volume

๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์†Œ์Šค ์ˆ˜์ •๋œ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์ด๋ฏธ์ง€ ๋นŒ๋“œ ๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•ด์•ผ ํ•œ๋‹ค. ๋ณ€๊ฒฝ๋œ ์†Œ์Šค๋ฅผ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์ฆ‰๊ฐ์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ๋กœ์ปฌ ํด๋”์™€ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ํด๋”๋ฅผ ๋งˆ์šดํŠธ ํ•˜์—ฌ ์—ฐ๊ฒฐ์‹œ์ผœ์•ผ ํ•œ๋‹ค.

docker run -v ${pwd}<๋กœ์ปฌํด๋”๊ฒฝ๋กœ>:<์ปจํ…Œ์ด๋„ˆํด๋”๊ฒฝ๋กœ> -d -p <host port>:<container port> --name <tag> <์‚ฌ์šฉํ•  ์ด๋ฏธ์ง€>
docker run -v ${pwd}/src:/app/src:ro -d -p 3000:5173 --name test_container test_image
  • ${pwd}๋Š” ํ˜„์žฌ๊ฒฝ๋กœ๋ฅผ ์˜๋ฏธ :ro ์ฝ๊ธฐ์ „์šฉ ๋ชจ๋“œ(์ปจํ„ฐ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์“ฐ๊ธฐx)
  • ํ˜„์žฌ๊ฒฝ๋กœ/src ํด๋”์™€ test_container /app/src ํด๋”์™€ ๋งˆ์šดํŠธ
  • -d ์˜ต์…˜์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์‹คํ–‰
  • -p ์˜ต์…˜์€ ํ˜ธ์ŠคํŠธ ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋ฅผ ๋ฐ”์ธ๋”ฉ ํ•œ๋‹ค. (ํฌํŠธ ํฌ์›Œ๋”ฉ ์„ค์ •)
  • ์œˆ๋„์šฐ ํ™˜๊ฒฝ์—์„œ Hot reloading๋˜์ง€ ์•Š์„๊ฒฝ์šฐ CHOKIDAR_USEPOLLING=true ์ถ”๊ฐ€

docker-compose.yml ์ž‘์„ฑ ๋ฐฉ๋ฒ•

docker-compose.yml์€ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ •์˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ • ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

services:
  react-app:
    # Dockerfile์ด ์žˆ๋Š” ๊ฒฝ๋กœ ์ง€์ •
    build:
      context: .
      dockerfile: Dockerfile
    # ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ๋ช…์‹œ
    container_name: "react_container"
    # ์‚ฌ์šฉํ•  docker์ด๋ฏธ์ง€ ์ง€์ •
ย  ย  image: test
    # ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘ ์‹œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด
    # command:
    # ํฌํŠธ ํฌ์›Œ๋”ฉ ์„ค์ •
    ports:
      - "3000:5137"
    restart: always
    # ํ˜ธ์ŠคํŠธ ์ปจํ…Œ์ด๋„ˆ volume ๋งˆ์šดํŠธ
    volumes: 
	  - ./src:/app/src
    # -it ์˜ต์…˜์„ ์œ„ํ•ด ์‚ฌ์šฉ๋จ (ํ‘œ์ค€์ž…์ถœ๋ ฅ)
    stdin_open: true
    tty: true
    # ์ง์ ‘ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ช…์‹œ ๊ฐ€๋Šฅ
    environment:
      - CHOKIDAR_USEPOLLING=true
	#`.env` ํŒŒ์ผ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋“ค ์ž๋™ ๋กœ๋”ฉ
	# env_file:

docker-compose ์‹คํ–‰ ๋ช…๋ น์–ด

# ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ
docker compose up

# ์ด๋ฏธ์ง€๋ฅผ ์ƒˆ๋กœ ๋นŒ๋“œํ•ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ
docker compose -p <container name> up -d --build

# ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ
docker compose down

# ์ปจํ…Œ์ด๋„ˆ ์ค‘๋‹จ
docker compose stop

# ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
docker compose start

# ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
docker copmose restart

Docker ๋ช…๋ น์–ด ์ •๋ฆฌ

docker ps
docker ps -a
  • Docker ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ
  • Docker ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ํ™•์ธ
docker inspect <id or name>
  • Docker ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด ํ™•์ธ
docker rm <id or name>
  • Docker ์ปจํ…Œ์ด๋„ˆ ์ œ๊ฑฐ
docker start <id or name>
  • Docker ์ปจํ…Œ์ด๋„ˆ ์‹œ์ž‘
docker stop <id or name>
docker kill <id or name>
  • Docker ์ปจํ…Œ์ด๋„ˆ ์ •์ง€
  • Docker ์ปจํ…Œ์ด๋„ˆ ๊ฐ•์ œ์ข…๋ฃŒ
docker restart <id or name>
  • Docker ์žฌ์‹œ์ž‘
docker exec -it <id or name> bash
  • Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ช…๋ น ์‹คํ–‰
docker logs <id or name>
  • Docker ๋กœ๊ทธ ํ™•์ธ
docker login
  • Docker ๋กœ๊ทธ์ธ Docker Hub id,password ์ž…๋ ฅ
docker exec -it <id or name> /bin/bash
  • exec์—ย -itย ์˜ต์…˜์„ ์“ฐ๋Š” ์ด์œ 
    • -i: ํ‘œ์ค€ ์ž…์ถœ๋ ฅ STDIN์„ ์—ด๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
    • -t: ๊ฐ€์ƒ TTY(Pseudo TTY)๋ฅผ ํ†ตํ•ด ์ ‘์†ํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ
  • Docker ์ปจํ…Œ์ด๋„ˆ ์ ‘์†
docker pull username/repo-name:[:tag]
  • Docker ์ €์žฅ์†Œ ์ด๋ฏธ์ง€ pull
docker tag <๋กœ์ปฌ ์ด๋ฏธ์ง€๋ช…> username/repo-name:[:tag]
  • ์ด๋ฏธ์ง€ ํƒœ๊น… (Docker Hub์šฉ)
  • Docker Hub์—๋Š” username/repo-name[:tag] ํ˜•์‹์œผ๋กœ ํ‘ธ์‹œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํƒœ๊น…์ด ํ•„์š”
docker push username/repo-name:[:tag]
  • Docker Hub๋กœ ์ด๋ฏธ์ง€ ํ‘ธ์‹œ
docker rmi username/repo-name:[:tag]
  • ํ‘ธ์‹œํ•œ ํ›„ ๋กœ์ปฌ์—์„œ ์ด๋ฏธ์ง€ ์‚ญ์ œ

๐Ÿ“‘ Reference



Pagination


ยฉ 2025. All rights reserved.

Powered by Hydejack v9.2.1