๐Ÿณ ๊ฐ€์ƒํ™” ํ”Œ๋žซํผ, Docker์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž - week12

seulg1004ยท2025๋…„ 3์›” 23์ผ
post-thumbnail

๐Ÿ’ก 12์ฃผ์ฐจ ์ด์ •๋ฆฌ
Linux์™€ Docker์— ๋Œ€ํ•ด์„œ ์ด๋ก ์„ ํŒŒ์•…ํ•˜๊ณ , ๊ด€๋ จ ์‹ค์Šต์„ ์ง„ํ–‰ํ•ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๊ทธ ๋™์•ˆ ์ด๋ฏธ์ง€ Build์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ•๋งŒ ์•Œ์•˜๋‹ค๋ฉด, Docker ๋‚ด๋ถ€ ๋™์ž‘ ๋ฐฉ์‹๊ณผ ๋„คํŠธ์›Œํฌ ๋“ฑ์— ๋Œ€ํ•ด์„œ ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด๋Š” ๊ธฐํšŒ๋ฅผ ๊ฐ€์ ธ์„œ ์ข‹์•˜๋‹ค.

1. Docker

1-1. Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์™€ ๋‹จ์ 

Docker๋Š” Go ์–ธ์–ด ๊ธฐ๋ฐ˜์˜ ๊ฐ€์ƒํ™” ํ”Œ๋žซํผ์ด๋‹ค. ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ ๊ฐœ๋ฐœ ๊ธฐ์ˆ ๋“ค์„ ๋ณ„๋„์˜ ํ™˜๊ฒฝ ์„ค์ • ์—†์ด ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ๊ฒฝ๋Ÿ‰ํ™”๋˜์—ˆ๊ณ  ๋น ๋ฅด๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ธํ”„๋ผ ๊ด€๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•˜๊ธฐ์— ์šฉ์ดํ•˜๋ฉฐ, ์•ˆ์ •์„ฑ์ด ๋†’๋‹ค.

Container๊ฐ€ ๊ฐ€์ƒ๋จธ์‹ ๊ณผ ๋‹ค๋ฅธ ์ ์€ Guest OS๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ณ , Host OS๋ฅผ ์„œ๋กœ ๊ณต์œ ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์ด๋‹ค.

๋ฐ˜๋ฉด์—, Docker๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜์ง€ ์•Š๋Š” Stateless ์†์„ฑ์„ ๊ฐ€์ง€๊ณค ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ๋งˆ์šดํŠธ๋ฅผ ํ•ด๋‘์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์†์‹ค๋  ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒฝ๋Ÿ‰ํ™”๋˜์—ˆ์ง€๋งŒ CPU๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿผ์—๋„ VM์— ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์†์‰ฝ๊ฒŒ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ์—์„œ, Docker๋Š” ์ž์ฃผ ์‚ฌ์šฉ๋˜๊ณ  ํ•„์ˆ˜์ ์ธ ๊ฐ€์ƒ ํ”Œ๋žซํผ ์ค‘ ํ•˜๋‚˜์ด๋‹ค.

์•„๋ž˜๋Š” Docker์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ช…๋ น์–ด ๊ตฌ์„ฑ์œผ๋กœ, Docker ๊ด€๋ จ ์‹ค์Šต์„ ์ˆ˜ํ–‰ ์‹œ ์™ธ์›Œ๋‘๋ฉด ์ข‹๋‹ค.

# ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ๋ชฉ๋ก ๋ณด๊ธฐ, -a ๋ถ™์ด๋ฉด ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์กฐํšŒ ๊ฐ€๋Šฅ
$docker ps

# ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด ๋ณด๊ธฐ
$docker inspect <container_id>

# ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ๋ณด๊ธฐ
$docker logs  -f <container_id>

# ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰์‹œํ‚ค๊ธฐ
$docker exec -it <container_id> <cmd>

1-2. Docker Hub์— ์ด๋ฏธ์ง€ ์—…๋กœ๋“œํ•˜๊ธฐ

Container ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ฐœ๋ฐœ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์ฃผ๋กœ ์ด๋ฏธ์ง€๋ฅผ pull ํ•ด์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฐœ๋ฐœํ•œ ์†Œ์Šค๋ฅผ ์ง์ ‘ Docker hub์— ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

  1. VSC์—์„œ remote ssh extension ๋‹ค์šด๋กœ๋“œ ๋ฐ›๊ธฐ

  2. remotes ๋ฉ”๋‰ด์—์„œ config ํŒŒ์ผ ์ˆ˜์ •ํ•˜๊ธฐ (C:/Users/2-34/.ssh/config)

  1. Ubuntu ์— ์ ‘์†ํ•ด์„œ docker hub ์— ๋กœ๊ทธ์ธํ•˜๊ธฐ
$docker login --u [์‚ฌ์šฉ์ž ์ด๋ฆ„]
  1. buildํ•˜๊ณ  Docker hub์— ์˜ฌ๋ฆฌ๊ธฐ
$docker build --tag [์‚ฌ์šฉ์ž ์ด๋ฆ„]/[Container Name]:[Version]
$docker push [์‚ฌ์šฉ์ž ์ด๋ฆ„]/[Container Name]:[Version]

1-3. Docker์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•, ๋งˆ์šดํŠธ

Stateless ์†์„ฑ์„ ๊ฐ€์ง„ Docker๋ฅผ ๋ณด์™„ํ•ด์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋งˆ์šดํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋งˆ์šดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ (Bind Mount)
    โ†’ Docker Host ํด๋”๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋งˆ์šดํŠธ
    โ†’ Container๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ host์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์Œ

    • Host์™€ Container ๋™๊ธฐํ™”
      • host์—์„œ ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • ์‹œ, Container ์ฆ‰๊ฐ ์ ์šฉ
      • Container์—์„œ ํŒŒ์ผ ์ƒ์„ฑ ๋ฐ ์ˆ˜์ • ์‹œ, Host์—์„œ๋„ ์ฆ‰๊ฐ์ ์šฉ
  2. ๋ณผ๋ฅจ ๋งˆ์šดํŠธ (Volume Mount)
    โ†’ Docker๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” Storage ๋ฐฉ์‹
    โ†’ Container๊ฐ€ ์‚ญ์ œ๋˜์–ด๋„ Volume์€ ์œ ์ง€๋จ

ํŠน์ง•Bind MountVolume Mount
์ •์˜ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ๋ฅผ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธDocker ๊ด€๋ฆฌ ํ•˜์— ๋…๋ฆฝ์ ์ธ ์Šคํ† ๋ฆฌ์ง€ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ
๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™๊ธฐํ™”๋˜๋ฉฐ ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ณ€๊ฒฝ์ด ์ฆ‰์‹œ ๋ฐ˜์˜, ์šฐ์„ ์ˆœ์œ„๊ฐ€ host ๋””๋ ‰ํ† ๋ฆฌDocker๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ํ˜ธ์ŠคํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”๋Š” ๋А๋ฆด ์ˆ˜ ์žˆ์Œ
์‚ฌ์šฉ ์˜ˆ์‹œ๊ฐœ๋ฐœ ์ค‘ ์†Œ์Šค ์ฝ”๋“œ๋‚˜ ์„ค์ • ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‚ฌ์šฉ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ๋กœ๊ทธ ํŒŒ์ผ ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐ์ดํ„ฐ ์ €์žฅ
์žฅ์ - ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ๊ฐ€๋Šฅ - ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ์œ ์šฉ- Docker๊ฐ€ ๊ด€๋ฆฌํ•˜์—ฌ ์‰ฝ๊ฒŒ ๋ฐฑ์—…/๋ณต์› ๊ฐ€๋Šฅ - ํ˜ธ์ŠคํŠธ์™€ ๋…๋ฆฝ์ ์ด์–ด์„œ ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
๋‹จ์ - ํ˜ธ์ŠคํŠธ์™€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์˜์กด์  - ํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ์˜ ๊ฒฝ๋กœ๋ฅผ ์•Œ์•„์•ผ ํ•จ- ์ปจํ…Œ์ด๋„ˆ์™€ ํ˜ธ์ŠคํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์— ๋А๋ฆผ - ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํ˜ธ์ŠคํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†์Œ
๋ณด์•ˆํ˜ธ์ŠคํŠธ ์‹œ์Šคํ…œ๊ณผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ์„ ์ˆ˜ ์žˆ์ŒDocker๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฏ€๋กœ ์ƒ๋Œ€์ ์œผ๋กœ ๋ณด์•ˆ์ด ๊ฐ•ํ™”๋จ

1-4. Container๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๋•Œ, ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ ๋™์ž‘ ์—ฌ๋ถ€ ํ™•์ธํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ, ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๋ฅผ ํ•˜๋ฉด ๋™์ผํ•˜๊ฒŒ ํด๋”๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์„์ง€ ํ™•์ธํ•ด๋ณธ๋‹ค.

# ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๋ฐ ์‹คํ–‰
$docker run --name mynginx01 -d -p 3001:80 -v $(pwd):/usr/share/nginx/html nginx
$docker run --name mynginx02 -d -p 3002:80 -v $(pwd):/usr/share/nginx/html nginx

# ์ปจํ…Œ์ด๋„ˆ bind ๋งˆ์šดํŠธ (๊ณต์œ  ํด๋” ์ง€์ •)
$docker exec -it 34d8d9ce635b sh -c 'ls /usr/share/nginx/html'
$docker exec -it 233df78330de sh -c 'ls /usr/share/nginx/html'

# bash๋กœ ์ ‘์†ํ•ด์„œ ๊ณต์œ  ํด๋” ํ™•์ธ
$docker exec -it 34d8d9ce635b bash
$docker exec -it 233df78330de bash

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

1-5. Container์— Network ์—ฐ๊ฒฐํ•ด์ฃผ๊ธฐ

Docker ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ฌ๋ฆด ๋•Œ, ์ฃผ๋กœ ํ˜ธ์ŠคํŠธ์˜ ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํฌํŠธ๋ฅผ ํฌํŠธ ๋ฐ”์ธ๋”ฉํ•ด์ฃผ์–ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.

$docker run -p 8088:80 nginx

์œ„์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ŠคํŠธ์˜ 8088 ํฌํŠธ์™€ nginx ์ปจํ…Œ์ด๋„ˆ์˜ 80 ํฌํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์–ด์„œ, ํ˜ธ์ŠคํŠธ์—์„œ nginx ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ˜ธ์ŠคํŠธ์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š”๋ฐ, Docker์— ๋”ฐ๋กœ ์–ด๋– ํ•œ ์„ค์ •๋„ ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ host์™€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ bridge๋กœ ํ˜ธ์ŠคํŠธ์™€ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ช…์‹œ์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜ธ์ŠคํŠธ์™€ ๋ชจ๋“  ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.

$docker run --network host nginx

๋˜ํ•œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Container๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋„คํŠธ์›Œํฌ๋ฅผ ๋”ฐ๋กœ ์‚ฌ์šฉํ•ด์ฃผ๊ฒŒ ๋˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹ ์„ ์ œ์–ดํ•˜์—ฌ ํŠน์ • ์ปจํ…Œ์ด๋„ˆ๋ผ๋ฆฌ๋งŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณด์•ˆ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

๋„คํŠธ์›Œํฌ๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ค„ ๋•Œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

# ๋„คํŠธ์›Œํฌ ๋งŒ๋“ค๊ธฐ
$docker network create mynetwork
# ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ ์„ค์ • ํ™•์ธํ•˜๊ธฐ
$docker inspect mynetwork

์•„๋ž˜์™€ ๊ฐ™์ด ifconfig ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ docker network ls ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์ƒˆ๋กœ ์ƒ๊ธด ๋„คํŠธ์›Œํฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ์„œ๋กœ Docker Name ์„ ๊ณต์œ ํ•˜๊ณ  ์†Œํ†ต๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, Spring Application์—์„œ DB๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด ip ์ฃผ์†Œ๋‚˜ ๋„๋ฉ”์ธ ๋Œ€์‹ , MySQL์˜ Container Name์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

spring.datasource.url=jdbc:mysql://mysqldb:3306/mydb?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true

2. Docker Compose

์—ฌ๋Ÿฌ ๊ฐœ์˜ Container๋ฅผ ํ•œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฌถ์–ด์„œ ์‚ฌ์šฉํ•  ๋•Œ, ์ผ์ผ์ด yml ํŒŒ์ผ๊ณผ Dockerfile์„ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค๋ฉด ์šด์˜ํ•˜๊ธฐ ๊ต‰์žฅํžˆ ๊นŒ๋‹ค๋กœ์›Œ์งˆ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ์—ฌ๋Ÿฌ ๊ฐœ์˜ Container๋ฅผ ํ•œ ๋ฒˆ์— ์‹คํ–‰/์ค‘์ง€/์‚ญ์ œ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ๋Š” ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ–ˆ๊ณ , ๊ทธ๊ฒƒ์ด Docker Compose ์ด๋‹ค.

Docker Compose ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด docker-compose up -d ๋ช…๋ น์–ด ํ•œ ๋ฒˆ์— Container๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ณ , ๊ฐ„ํŽธํ•˜๊ฒŒ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

2-1. ๐Ÿšจ Docker Compose ์‚ฌ์šฉ ์‹œ ์œ ์˜ํ•  ์ ?

๊ทธ๋ ‡๋‹ค๋ฉด Docker Compose๋ฅผ ์„ ํƒํ•˜๋ฉด ์ข‹์€ ์ ๋งŒ ์žˆ์„๊นŒ? Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ผญ ์œ ์˜ํ•ด์„œ health check๋ฅผ ํ•ด์ฃผ๊ณ  ์˜์กด์„ฑ ๊ด€๊ณ„์— ์‹ ๊ฒฝ์„ ์จ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” Spring ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ mySQL์„ Docker Compose๋กœ ๊ตฌ๋™์‹œํ‚จ๋‹ค๊ณ  ํ•  ๋•Œ, ๋จผ์ € ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๊ณ  mySQL์ด ์‹คํ–‰๋œ๋‹ค๋ฉด ๊ตฌ๋™ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ Depends on๊ณผ health check๋ฅผ ์‚ฌ์šฉํ•ด์„œ DB๊ฐ€ ์ค€๋น„๋œ ์ดํ›„์—๋งŒ ์‹คํ–‰๋˜๋„๋ก ์„ค์ •์„ ํ•ด๋‘๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ ์ด๋‹ค.

services:
  db:
    image: mysql
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U mysql"]
      interval: 10s
      retries: 5
  app:
    depends_on:
      db:
        condition: service_healthy

๋˜ํ•œ, ๋ณผ๋ฅจ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, NFS๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜๊ณ  Volume ๋งˆ์šดํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์–ด๋„ ์ข‹๋‹ค.

services:
  db:
    image: mysql
    volumes:
      - db-data:/var/lib/mysql/data
volumes:
  db-data:

์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•ด์ฃผ์–ด์•ผ db-data๋ผ๋Š” ๋ณผ๋ฅจ์ด ์œ ์ง€๋˜๋ฉด์„œ ๋ฐ์ดํ„ฐ์˜ ์†์‹ค์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

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