A A
[Docker] Docker Volume: ๋„์ปค ๋ณผ๋ฅจ, ์ปจํ…Œ์ด๋„ˆ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ๋Š” Docker Volume์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ๋‹ค๋ฃจ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค Docker Volume์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” Docker Volume์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์Šต ์˜ˆ์ œ๊นŒ์ง€ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


Docker Volume์ด๋ž€?

Docker Volume์€ ์ปจํ…Œ์ด๋„ˆ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ๊ณผ ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋Š” ์ผ์‹œ์ ์ธ ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ๋„ ํ•จ๊ป˜ ์‚ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Docker Volume์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ŠคํŠธ์— ์ €์žฅํ•จ์œผ๋กœ์จ, ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆ˜๋ช…๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์กดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์š” ํŠน์ง•

  • ๋ฐ์ดํ„ฐ ์˜์†์„ฑ: ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋”๋ผ๋„ ๋ณผ๋ฅจ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๊ณต์œ : ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ผํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฐฑ์—… ๋ฐ ๋ณต๊ตฌ ์šฉ์ด: ํ˜ธ์ŠคํŠธ์— ์ €์žฅ๋œ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ๋ฐฑ์—…ํ•˜๊ณ  ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ๋ฐ ๊ฒฉ๋ฆฌ: ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Docker Volume ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ

Docker Volume์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ณผ๋ฅจ ์ƒ์„ฑํ•˜๊ธฐ

๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด docker volume create ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
๋ณผ๋ฅจ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด Docker๊ฐ€ ์ž๋™์œผ๋กœ ๋žœ๋คํ•œ ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
docker volume create my-first-volume

์‹คํ–‰ ๊ฒฐ๊ณผ

my-first-volume

๋ณผ๋ฅจ ๋ชฉ๋ก ํ™•์ธํ•˜๊ธฐ

ํ˜„์žฌ Docker์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ๋ณผ๋ฅจ์„ ํ™•์ธํ•˜๋ ค๋ฉด docker volume ls ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

docker volume ls

์˜ˆ์‹œ ์ถœ๋ ฅ

DRIVER    VOLUME NAME
local     my-first-volume

๋ณผ๋ฅจ ์‚ญ์ œํ•˜๊ธฐ

๋ถˆํ•„์š”ํ•œ ๋ณผ๋ฅจ์„ ์‚ญ์ œํ•˜๋ ค๋ฉด docker volume rm ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‹จ, ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„์˜ ๋ณผ๋ฅจ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
docker volume rm my-first-volume

์‹คํ–‰ ๊ฒฐ๊ณผ

my-first-volume

๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ๋ณผ๋ฅจ์€ ์‚ญ์ œํ•  ์ˆ˜ ์—†์œผ๋ฉฐ, ์‚ญ์ œ ์‹œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

docker volume rm bridge

์‹คํ–‰ ๊ฒฐ๊ณผ

Error response from daemon: bridge is a pre-defined volume and cannot be removed

 


์ปจํ…Œ์ด๋„ˆ์— ๋ณผ๋ฅจ ๋งˆ์šดํŠธํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ -v ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋ณผ๋ฅจ ์ด๋ฆ„๊ณผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๋งˆ์šดํŠธํ•  ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ณผ๋ฅจ์„ ์ปจํ…Œ์ด๋„ˆ์— ์—ฐ๊ฒฐํ•˜๊ธฐ

์•„๋ž˜ ์˜ˆ์ œ์—์„œ๋Š” busybox-volume์ด๋ผ๋Š” ๋ณผ๋ฅจ์„ /data ๋””๋ ‰ํ† ๋ฆฌ์— ๋งˆ์šดํŠธํ•˜์—ฌ busybox ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
docker image pull busybox
Using default tag: latest
latest: Pulling from library/busybox
559c60843878: Pull complete 
Digest: sha256:2919d0172f7524b2d8df9e50066a682669e6d170ac0f6a49676d54358fe970b5
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
docker volume create busybox-volume
busybox-volume
[๋ณผ๋ฅจ ์ด๋ฆ„:์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๋งˆ์šดํŠธํ•  ๊ฒฝ๋กœ]
docker container run \
  --name busybox \
  --rm \
  -v busybox-volume:/data \
  -it \
  busybox \
  sh

์‹คํ–‰ ๊ฒฐ๊ณผ

/ # cd /data/
 /data # touch busy.dat box.log
 /data # ls
 box.log   busy.dat
 /data #

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ณผ๋ฅจ ์‚ฌ์šฉํ•˜๊ธฐ

์œ„์—์„œ ์ƒ์„ฑํ•œ ๋ณผ๋ฅจ์€ /data ๋””๋ ‰ํ† ๋ฆฌ์— ๋งˆ์šดํŠธ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด, ํ˜ธ์ŠคํŠธ์˜ ๋ณผ๋ฅจ์—๋„ ๋™์ผํ•œ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
/data # touch newfile.txt
/data # ls
box.log   busy.dat  newfile.txt

๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋™์ผํ•œ ๋ณผ๋ฅจ ์‚ฌ์šฉํ•˜๊ธฐ

๋™์ผํ•œ ๋ณผ๋ฅจ์„ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์—์„œ๋„ ๋งˆ์šดํŠธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
docker container run \
  --name other-busybox \
  --rm \
  -v busybox-volume:/other-data \
  -it \
  busybox \
  sh

์‹คํ–‰ ๊ฒฐ๊ณผ

/ # cd /other-data/
 /other-data # ls
box.log   busy.dat  newfile.txt

์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ ์‹œ ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ ์œ ์ง€

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•ด๋„ ๋ณผ๋ฅจ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.
๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋™์ผํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๋ฉด ์ด์ „์— ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ (๋‹ค๋ฅธ ํ„ฐ๋ฏธ๋„์ฐฝ ์ƒ์„ฑ)ํ•ด์„œ ํ™•์ธ.
docker container run \
  --name busybox \
  --rm \
  -v busybox-volume:/data \
  -it \
  busybox \
  sh

์‹คํ–‰ ๊ฒฐ๊ณผ

other-busybox๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ ์•ˆ์— other-data ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋งˆ์šดํŠธ ๋œ๊ฑธ ๋ณผ์ˆ˜ ์žˆ์Œ.
/ # cd /data/
 /data # ls
box.log   busy.dat  newfile.txt

์ปจํ…Œ์ด๋„ˆ์— ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ํ•ด์ œํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ์™€ ๋ณผ๋ฅจ์˜ ์—ฐ๊ฒฐ์„ ํ•ด์ œํ•˜๋ ค๋ฉด, ๋จผ์ € ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์‚ญ์ œํ•œ ํ›„ ๋ณผ๋ฅจ์„ ์‚ญ์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๋˜๋Š” docker container inspect ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋งˆ์šดํŠธ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
docker container inspect busybox

์ฃผ์š” ์ •๋ณด ํ™•์ธ

"Mounts": [
    {
        "Type": "volume",
        "Name": "busybox-volume",
        "Source": "/var/lib/docker/volumes/busybox-volume/_data",
        "Destination": "/data",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
]

 


Dockerfile์—์„œ ๋ณผ๋ฅจ ์ง€์ •ํ•˜๊ธฐ

Dockerfile ๋‚ด์—์„œ VOLUME ์ง€์‹œ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•ด๋‹น ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ˜ธ์ŠคํŠธ๋‚˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.
# Node ์„ค์น˜. (์ด๋ฏธ์ง€ ๊ด€์  - ๋งจ ์•„๋ž˜ Layer (Base image))
# FROM ๋ฒ ์ด์Šค ์ด๋ฏธ์ง€
ARG NODE_VERSION
FROM node:${NODE_VERSION}

# ์†Œ์Šค์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ
# COPY <๋ณต์‚ฌํ•  ๊ฒฝ๋กœ> <๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•  ๊ฒฝ๋กœ>
COPY . /app

# ์†Œ์Šค์ฝ”๋“œ์˜ ์ตœ์ƒ๋‹จ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™
WORKDIR /app

# ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”ํ•œ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ (npm ci)
# ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋นŒ๋“œ (npm run build)
RUN npm ci \
  && npm run build

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ •์˜ (PORT)
ENV PORT=3000

# ๋งˆ์šดํŠธํ•  ๋””๋ ‰ํ† ๋ฆฌ ์ง€์ •
VOLUME /data

# ์†Œ์Šค์ฝ”๋“œ ์‹คํ–‰ (npm run start)
ENTRYPOINT ["npm", "run", "start"]

Dockerfile ์„ค๋ช…

  • VOLUME /data: ์ปจํ…Œ์ด๋„ˆ์˜ /data ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ณผ๋ฅจ์œผ๋กœ ์ง€์ •ํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๋‚˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ํ™œ์šฉํ•œ ๋ณผ๋ฅจ ์‚ฌ์šฉ

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

๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ ์‚ฌ์šฉ ์˜ˆ์ œ

ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
docker container run \
  --rm \
  -it \
  -v /Users/daehyunkim/Downloads/mbti-embedded-db/host-volume:/data \
  busybox \
  sh

์‹คํ–‰ ๊ฒฐ๊ณผ

/ # cd /data/
 /data # touch box.log
 /data # touch busy.dat
 /data # ls
box.log   busy.dat

์ด๋ ‡๊ฒŒ ์ƒ์„ฑํ• ๋•Œ ๋งˆ๋‹ค ์ƒ๊ธฐ๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ˜ธ์ŠคํŠธ์˜ /Users/daehyunkim/Downloads/mbti-embedded-db/host-volume ๋””๋ ‰ํ† ๋ฆฌ์— ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๋ฉด, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ /data ๋””๋ ‰ํ† ๋ฆฌ์—๋„ ๋™์ผํ•œ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

Example) MySQL ๋ฐ์ดํ„ฐ ์˜์†ํ™”

Docker Volume์„ ํ™œ์šฉํ•˜์—ฌ MySQL ๋ฐ์ดํ„ฐ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ ํ›„์—๋„ ์œ ์ง€๋˜๋„๋ก ์„ค์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Docker Volume์„ ์‚ฌ์šฉํ•œ MySQL ๋ฐ์ดํ„ฐ ์œ ์ง€

1. ๋ณผ๋ฅจ ์ƒ์„ฑ

๋จผ์ €, MySQL ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

docker volume create mysql-vol

2. MySQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

๋‹ค์Œ ์กฐ๊ฑด์— ๋งž๊ฒŒ MySQL ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„: mysql
  • ์ด๋ฏธ์ง€: mysql:8.3.0
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜:
    • MYSQL_ROOT_PASSWORD=pw_root
    • MYSQL_DATABASE=db_mbti
    • MYSQL_USER=user_mbti
    • MYSQL_PASSWORD=pw_mbti
  • ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์‹œ ์ž๋™ ์‚ญ์ œ: --rm
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰: -d
  • MySQL ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ: /var/lib/mysql
docker container run \
  --name mysql \
  --rm \
  -d \
  -e MYSQL_ROOT_PASSWORD=pw_root \
  -e MYSQL_DATABASE=db_mbti \
  -e MYSQL_USER=user_mbti \
  -e MYSQL_PASSWORD=pw_mbti \
  -v mysql-vol:/var/lib/mysql \
  mysql:8.3.0

3. MySQL ์„œ๋ฒ„์— ์ ‘์†

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด MySQL ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

docker container exec \
  -it \
  mysql \
  mysql -u user_mbti -p db_mbti

4. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…

MySQL ์„œ๋ฒ„์— ์ ‘์†ํ•œ ํ›„, ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE MBTI_TEST (
    mbti_type VARCHAR(4)
);
  • ๋ ˆ์ฝ”๋“œ ์ž…๋ ฅ
INSERT INTO MBTI_TEST 
VALUES 
    ('ENTJ'),
    ('INTP');
  • ๋ ˆ์ฝ”๋“œ ํ™•์ธ
SELECT * FROM MBTI_TEST;

5. ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ ํ›„ ๋ฐ์ดํ„ฐ ํ™•์ธ

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•œ ํ›„, ๋™์ผํ•œ ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜์—ฌ ๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด์ „์— ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker container run \
  --name mysql \
  --rm \
  -d \
  -e MYSQL_ROOT_PASSWORD=pw_root \
  -e MYSQL_DATABASE=db_mbti \
  -e MYSQL_USER=user_mbti \
  -e MYSQL_PASSWORD=pw_mbti \
  -v mysql-vol:/var/lib/mysql \
  mysql:8.3.0
  • ๋‹ค์‹œ MySQL ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
docker container exec \
  -it \
  mysql \
  mysql -u user_mbti -p db_mbti
SELECT * FROM MBTI_TEST;

์‹คํ–‰ ๊ฒฐ๊ณผ

+-----------+
| mbti_type |
+-----------+
| ENTJ      |
| INTP      |
+-----------+
2 rows in set (0.00 sec)

๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์œ ์ง€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•œ MySQL ๋ฐ์ดํ„ฐ ์œ ์ง€

๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ๋””๋ ‰ํ† ๋ฆฌ์— MySQL ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” ํ˜ธ์ŠคํŠธ์—์„œ ์ง์ ‘ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

1. ํ˜ธ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ

ํ˜ธ์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

mkdir ~/mysql-bind-mount

2. MySQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

๋‹ค์Œ ์กฐ๊ฑด์— ๋งž๊ฒŒ MySQL ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„: mysql
  • ์ด๋ฏธ์ง€: mysql:8.3.0
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜:
    • MYSQL_ROOT_PASSWORD=pw_root
    • MYSQL_DATABASE=db_mbti
    • MYSQL_USER=user_mbti
    • MYSQL_PASSWORD=pw_mbti
  • ์ปจํ…Œ์ด๋„ˆ ์ข…๋ฃŒ ์‹œ ์ž๋™ ์‚ญ์ œ: --rm
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰: -d
  • MySQL ๋ฐ์ดํ„ฐ ์ €์žฅ ๊ฒฝ๋กœ: /var/lib/mysql
  • ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ: ํ˜ธ์ŠคํŠธ์˜ ~/mysql-bind-mount๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ /var/lib/mysql์— ๋งˆ์šดํŠธ
docker container run \
  --name mysql \
  --rm \
  -d \
  -e MYSQL_ROOT_PASSWORD=pw_root \
  -e MYSQL_DATABASE=db_mbti \
  -e MYSQL_USER=user_mbti \
  -e MYSQL_PASSWORD=pw_mbti \
  -v ~/mysql-bind-mount:/var/lib/mysql \
  mysql:8.3.0

3. MySQL ์„œ๋ฒ„์— ์ ‘์† ๋ฐ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ

์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋ฉด MySQL ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

docker container exec \
  -it \
  mysql \
  mysql -u user_mbti -p db_mbti
  • ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE MBTI_TEST (
    mbti_type VARCHAR(4)
);
  • ๋ ˆ์ฝ”๋“œ ์ž…๋ ฅ
INSERT INTO MBTI_TEST 
VALUES 
    ('ENTJ'),
    ('INTP');
  • ๋ ˆ์ฝ”๋“œ ํ™•์ธ
SELECT * FROM MBTI_TEST;

4. ์ปจํ…Œ์ด๋„ˆ ์‚ญ์ œ ํ›„ ๋ฐ์ดํ„ฐ ํ™•์ธ

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•œ ํ›„, ๋™์ผํ•œ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์ด์ „์— ์ €์žฅํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

docker container run \
  --name mysql \
  --rm \
  -d \
  -e MYSQL_ROOT_PASSWORD=pw_root \
  -e MYSQL_DATABASE=db_mbti \
  -e MYSQL_USER=user_mbti \
  -e MYSQL_PASSWORD=pw_mbti \
  -v ~/mysql-bind-mount:/var/lib/mysql \
  mysql:8.3.0
  • ๋‹ค์‹œ MySQL ์„œ๋ฒ„์— ์ ‘์†ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด๋ณด์„ธ์š”.
docker container exec \
  -it \
  mysql \
  mysql -u user_mbti -p db_mbti
SELECT * FROM MBTI_TEST;

์‹คํ–‰ ๊ฒฐ๊ณผ

+-----------+
| mbti_type |
+-----------+
| ENTJ      |
| INTP      |
+-----------+
2 rows in set (0.00 sec)

๋ฐ์ดํ„ฐ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์œ ์ง€๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์ถ”๊ฐ€ ํŒ ๋ฐ ์ฃผ์˜์‚ฌํ•ญ

Docker Volume์„ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํŒ๊ณผ ์ฃผ์˜์‚ฌํ•ญ์„ ์•Œ์•„๋‘๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •์˜ ๋ณผ๋ฅจ ์‚ฌ์šฉ ๊ถŒ์žฅ

  • ๋ช…ํ™•ํ•œ ๋„ค์ด๋ฐ: ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•  ๋•Œ ์˜๋ฏธ ์žˆ๋Š” ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ ๊ด€๋ฆฌ์˜ ํŽธ์˜์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ: ๋ณผ๋ฅจ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์˜ ๋ณด์•ˆ ์„ค์ •์„ ์ ์ ˆํžˆ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋ณผ๋ฅจ๊ณผ ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ์˜ ์ฐจ์ด ์ดํ•ดํ•˜๊ธฐ

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

๋ณผ๋ฅจ ๋ฐฑ์—… ๋ฐ ๋ณต์›

๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—…ํ•˜๊ณ  ๋ณต์›ํ•˜๋ ค๋ฉด docker run ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์‹œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณผ๋ฅจ ๋ฐฑ์—…

docker container run --rm -v mysql-vol:/data -v $(pwd):/backup busybox tar czf /backup/mysql-vol-backup.tar.gz /data

๋ณผ๋ฅจ ๋ณต์›

docker container run --rm -v mysql-vol:/data -v $(pwd):/backup busybox tar xzf /backup/mysql-vol-backup.tar.gz -C /

์ต๋ช… ๋ณผ๋ฅจ ์‚ฌ์šฉ ํ”ผํ•˜๊ธฐ

์ต๋ช… ๋ณผ๋ฅจ์€ ๋ณผ๋ฅจ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ง€ ์•Š์•„ Docker๊ฐ€ ์ž๋™์œผ๋กœ ์ด๋ฆ„์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ด€๋ฆฌ์˜ ์–ด๋ ค์›€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๊ฐ€๋Šฅํ•œ ํ•œ ๋ช…ํ™•ํ•œ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์—ฌ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ณผ๋ฅจ ๋“œ๋ผ์ด๋ฒ„ ํ™œ์šฉ

ํŠน์ • ์Šคํ† ๋ฆฌ์ง€ ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณผ๋ฅจ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, NFS, AWS EBS ๋“ฑ ๋‹ค์–‘ํ•œ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ†ตํ•ด ๋ณผ๋ฅจ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Docker Volume์€ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ ์˜์†์„ฑ์„ ํ™•๋ณดํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ณผ๋ฅจ์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋˜๋”๋ผ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋˜์ง€ ์•Š๊ณ , ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์–ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์œ ์—ฐ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Docker Volume์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์ƒ์„ฑ, ๋งˆ์šดํŠธ, ์‹ค์Šต ์˜ˆ์ œ๊นŒ์ง€ ์ƒ์„ธํžˆ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ํ™œ์šฉํ•œ ๋ณผ๋ฅจ ์‚ฌ์šฉ๋ฒ•๊ณผ ์‹ค์ „ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ์˜ ํ™œ์šฉ ๋ฐฉ๋ฒ•์„ ์ตํ˜”์Šต๋‹ˆ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ