๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Container/Docker

[Docker] ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๊ด€๋ฆฌํ•˜์ž, Docker Compose

๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.

 

Docker


์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” (์ด์ „์— ์–•๊ฒŒ๋‚˜๋งˆ ๋ฐฐ์› ๋˜) ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋กœ ์ •์˜ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ฌถ์Œ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—… ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” ๋„์ปค ์ปดํฌ์ฆˆ์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž.

1. ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ?

๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฐฐ์šฐ๊ธฐ์— ์•ž์„œ ๊ทผ๋ณธ์ ์ธ ์งˆ๋ฌธ๋ถ€ํ„ฐ ํ•ด๋ณด์ž. ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ์ด์œ ๋Š” ๋ฐ”๋กœ ํ•˜๋‚˜์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋น„์Šค๋Š” ๋ณดํ†ต ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šค๋“ค์ด ๋™์‹œ์— ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์ธ ๋„์ปค ์—”์ง„์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋กœ ์ œ์–ดํ•  ๋•Œ๋„, ๋„์ปค ์Šค์›œ์„ ๋ฐฐ์šธ ๋•Œ๋„ ํ•˜๋‚˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋Œ€ํ•œ ๋™์ž‘๋งŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด MySQL DB ์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ, ์šฐ๋ฆฌ๋Š” MySQL ์ปจํ…Œ์ด๋„ˆ 1๊ฐœ ๋งŒ์„ ์ œ์–ดํ•˜๊ฑฐ๋‚˜, ๋„์ปค ์Šค์›œ์—์„œ MySQL ์ปจํ…Œ์ด๋„ˆ๋“ค๋กœ ๊ตฌ์„ฑ๋œ ์„œ๋น„์Šค๋“ค๋งŒ ์ œ์–ดํ–ˆ์—ˆ๋‹ค. 

 

ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค๋กœ ๋™์ž‘ํ•œ๋‹ค. ์ผ๋ก€๋กœ, ์›Œ๋“œ ํ”„๋ ˆ์Šค ๋ธ”๋กœ๊ทธ ์›น ํŽ˜์ด์ง€ ์„œ๋น„์Šค๋ฅผ ๊ฐœ๋ฐœํ•œ๋‹ค๊ณ  ์ณ๋„, ์›น ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์›น์„œ๋ฒ„ ์—ญํ•  ์ปจํ…Œ์ด๋„ˆ์™€ ์›น ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” MySQL ์„œ๋ฒ„ ์ด 2๊ฐœ ์ข…๋ฅ˜์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์‹œ์— ๋™์ž‘ํ•ด์•ผ ํ•œ๋‹ค.

 

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

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋„์ปค ์ปดํฌ์ฆˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ด์šฉํ•œ ์„œ๋น„์Šค์˜ ๊ฐœ๋ฐœ๊ณผ CI(Continuous Integration, ์ง€์†์  ํ†ตํ•ฉ)๋ฅผ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜์˜ ํ”„๋กœ์ ํŠธ๋กœ์„œ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์ž‘์—… ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ, ๋„์ปค ์ปดํฌ์ฆˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ์˜ต์…˜๊ณผ ํ™˜๊ฒฝ์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด ๋†“์€ ํŒŒ์ผ(์ด์ „์— ๋ฐฐ์› ๋˜ Dockerfile ์ฒ˜๋Ÿผ)์„ ์ฝ์–ด์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ์‹คํ–‰์‹œํ‚จ๋‹ค. ์‹ฌ์ง€์–ด ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์ˆœ์„œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ์˜์กด์„ฑ, ๋„คํŠธ์›Œํฌ, ๋ณผ๋ฅจ ๋“ฑ ์šฐ๋ฆฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‹ค๋ฃจ๊ธฐ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์› ๋˜ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ธฐ๋Šฅ๋“ค๋„ ๋ฏธ๋ฆฌ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ๋„์ปค ์ปดํฌ์ฆˆ๋Š” ๋ฏธ๋ฆฌ ์ •์˜ํ•ด ๋†“์€ ํŒŒ์ผ ์•ˆ์— ํŠน์ • ์„œ๋น„์Šค์˜ ์—ญํ• ์„ ํ•  ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„์ปค ์Šค์›œ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ์˜ ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆ˜๋ฅผ ์œ ๋™์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜๊ฐ€ ์žˆ์œผ๋ฉฐ, ์‹ ๊ธฐํ•˜๊ฒŒ๋„ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๋Š” ์ž‘์—… ๋ฐœ๊ฒฌ(Service Discovery)๋„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

์ด ์ •๋„๋ฉด ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์‚ฌ์šฉํ•  ๋งŒํ•œ ์ด์œ ๋ฅผ ์ถฉ๋ถ„ํžˆ ์ฐพ์€ ๊ฒƒ ๊ฐ™๋‹ค. ์ด์ œ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž. 

2. ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž

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

 

$ curl -L https://github.com/docker/compose/releases/download/1.11.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose

 

์ž˜ ์„ค์น˜ํ–ˆ๋‹ค๋ฉด ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์„œ ๋„์ปค ์ปดํฌ์ฆˆ์˜ ๋ฒ„์ „์„ ํ™•์ธํ•ด๋ณด์ž.

 

$ docker-compose -v

 

๋„์ปค ์ปดํฌ์ฆˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ์„ค์ •์ด ์ •์˜๋œ YAML ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋„์ปค ์—”์ง„์„ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ YAML ํŒŒ์ผ์€ (์–ด๋– ํ•œ ์„ค์ •๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด)๋ฐ˜๋“œ์‹œ docker-compose.yml ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ๋กœ ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ YAML ํŒŒ์ผ ์ž‘์„ฑ ์‹œ ๋“ค์—ฌ์“ฐ๊ธฐ๋ฅผ ํ•  ๋•Œ๋Š” ํƒญ(Tab)์„ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ํƒญ์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํƒญ ๋Œ€์‹  2๊ฐœ์˜ ๊ณต๋ฐฑ์„ ์‚ฌ์šฉํ•ด์„œ ํ•˜์œ„ ํ•ญ๋ชฉ์„ ๊ตฌ๋ถ„ํ•ด ํŒŒ์ผ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋„๋ก ํ•˜์ž.

 

YAML ํŒŒ์ผ์„ ๋ณด๊ธฐ ์ „์—, ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์ธ์ง€ YAML ํŒŒ์ผ ๋Œ€์‹  docker run ๋ช…๋ น์–ด๋กœ ๋จผ์ € ์‚ดํŽด๋ณด์ž.

 

$ docker run -d \
--name mysql \
alicek106/composetest:mysql \
mysqld

$ docker run -d \
-p 80:80 \
--link mysql:db --name web \
alicek106/composetest:web \
apachectl -DFOREGROUND

 

์œ„ ๋‚ด์šฉ์„ docker-compose.yml ํŒŒ์ผ ํ˜•์‹์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

version: '3.0'
services:
  web:
    image: alicek106/composetest:web
    ports:
      - "80:80"
    links:
      - mysql:db
    command: apachectl -DFOREGROUND
  mysql:
    image: alicek106/composetest:mysql
    command: mysqld

 

์œ„์™€ ๊ฐ™์€ ๋‚ด์šฉ์˜ YAML ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  ํ•ด๋‹น ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด์ž.

 

$ docker-compose up -d

 

๊ทธ๋ฆฌ๊ณ  docker ps ๋ช…๋ น์–ด๋ฅผ ์ณ์„œ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด YAML ํŒŒ์ผ์—์„œ ์ •ํ•œ ์ปจํ…Œ์ด๋„ˆ 2๊ฐœ๊ฐ€ ์‹คํ–‰์ค‘์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์œ„์—์„œ ์ •์˜ํ•œ YAML ํŒŒ์ผ ๋‚ด์šฉ์˜ ํ‚ค์›Œ๋“œ ์˜๋ฏธ์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

 

ํ‚ค์›Œ๋“œ ์˜๋ฏธ ํŠน์ง•
version YAML ํŒŒ์ผ์˜ ํฌ๋งท ๋ฒ„์ „์„ ์˜๋ฏธ ๋ฒ„์ „์—๋Š” 1.0, 2.0, 3.0 ๋“ฑ์ด ์žˆ์œผ๋ฉฐ ๋„์ปค ์ปดํฌ์ฆˆ 1.8์€ ๋ฒ„์ „ 2.0์„, ๋„์ปค ์ปดํฌ์ฆˆ 1.9๋Š” ๋ฒ„์ „ 2.1์„ ์‚ฌ์šฉ. ํ˜„์žฌ ๋ฒ„์ „ 1.0์€ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ 
services ์ƒ์„ฑ๋  ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฌถ์–ด๋†“์€ ๋‹จ์œ„ ์„œ๋น„์Šค ํ•˜์œ„ ํ•ญ๋ชฉ๋“ค์—๋Š” ์ƒ์„ฑ๋  ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ์‹œํ‚ฌ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ต์…˜, ์„ค์ •์„ ๋ช…์‹œ
(์œ„ ์˜ˆ์‹œ์—์„œ์˜) web, mysql ์ƒ์„ฑ๋  ์„œ๋น„์Šค์˜ ์ด๋ฆ„ ์ด ํ‚ค์›Œ๋“œ์˜ ๋ฐ”๋กœ ํ•˜์œ„ ํ•ญ๋ชฉ์— ํ•ด๋‹น ์„œ๋น„์Šค ์—ญํ• ์„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์— ๋Œ€ํ•œ ์„ค์ • ๊ฐ’์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Œ

 

๋‹ค์Œ์€ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•Œ์•„๋‘์–ด์•ผ ํ•  ๊ฐœ๋…๋“ค ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž. ์šฐ์„  ์œ„์—์„œ ์‹ค์Šต์„ ํ•˜๋ฉด์„œ ์ƒ์„ฑ๋œ ๋‘ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์„ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด์ž. ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด๋ผ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค.

 

 

์ด๋ฆ„์„ ์ž˜ ๋ณด๋ฉด dockercompose_web_1 , dockercompose_mysql_1 ์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ์ด๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์„ ๋”ฐ๋ฅธ๋‹ค.

[ํ”„๋กœ์ ํŠธ ์ด๋ฆ„]_[์„œ๋น„์Šค ์ด๋ฆ„]_[์„œ๋น„์Šค ๋‚ด ์ปจํ…Œ์ด๋„ˆ ๋ฒˆํ˜ธ]

 

์ฆ‰, ์ด๋ฆ„์˜ web, mysql ์ด๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋ณด๋ฉด, ๋„์ปค ์ปดํฌ์ฆˆ๋Š” ์ƒ์„ฑ๋  ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ์ด๋ฆ„์„ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์ž๋™์ƒ์„ฑํ•œ๋‹ค. ๋˜ํ•œ ์•ž์— dockercompose๋ผ๋Š” ๋‹จ์–ด๋Š” ํ˜„์žฌ YAML ํŒŒ์ผ์ด ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์ด๋‹ค. ์ด๋ฅผ ํ”„๋กœ์ ํŠธ๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์„œ๋น„์Šค? ํ”„๋กœ์ ํŠธ? ์•„๋‹ˆ ๋„์ปค ์Šค์›œ์ผ ๋•Œ๋„ ์„œ๋น„์Šค๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์—ˆ๋Š”๋ฐ..? ์ ์  ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.. ์ด ์ฏค์—์„œ ๋„์ปค ์ปดํฌ์ฆˆ์—์„œ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ๋ถ„ ๋‹จ์œ„์ธ ํ”„๋กœ์ ํŠธ, ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ฐœ๋…์„ ๋ฐฐ์›Œ๋ณด์ž.

 

์šฐ์„  ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ํ˜„์žฌ web์ด๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ์™€ mysql ์ด๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 1๊ฐœ์”ฉ ์ƒ์„ฑ๋œ ์ƒํ™ฉ์ž„์„ ๊ฐ€์ •ํ•˜๊ณ  ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

 

docker-compose์˜ ํ”„๋กœ์ ํŠธ, ์„œ๋น„์Šค, ์ปจํ…Œ์ด๋„ˆ ๊ฐœ๋…์„ ์•Œ์•„๋ณด์ž

 

์šฐ์„  ํ”„๋กœ์ ํŠธ, ์„œ๋น„์Šค, ์ปจํ…Œ์ด๋„ˆ ์ค‘ ๊ฐ€์žฅ ์ƒ์œ„(?)๊ฐœ๋…์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์ด๋‹ค. ํ”„๋กœ์ ํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋น„์Šค๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ์œ„์—์„œ ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„์ด DockerCompose ๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค. ์œ„ ์˜ˆ์‹œ์—์„œ ํ„ฐ๋ฏธ๋„ ํ™”๋ฉด์„ ๋ณด๋ฉด docker-compose.yaml ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์ด ๋ฐ”๋กœ DockerCompose์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์œ„์—์„œ ์šฐ๋ฆฌ๋Š” docker-compose up -d ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ–ˆ๋Š”๋ฐ, ์ด ๋•Œ ์•„๋ฌด๋Ÿฐ ์ธ์ž๋กœ๋„ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์„ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ docker-compose.yaml ํŒŒ์ผ์ด ์žˆ๋Š” ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ๊ทธ ์ƒ์œ„์˜ ๋””๋ ‰ํ† ๋ฆฌ ์ด๋ฆ„์„ ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ƒ์œ„์˜ ๋””๋ ‰ํ† ๋ฆฌ์—ฌ๋„ ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ์•Œ์•„์„œ ์ฐพ๋Š” ์ ์ด Dockerfile ๋•Œ์™€๋Š” ์ฐจ์ด์ ์ด ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค. ๋„์ปค ์ปดํฌ์ฆˆ๋Š” docker-compose ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, docker-compose.yaml ํŒŒ์ผ์ด ๋ฐ˜๋“œ์‹œ ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ์—๋งŒ ์—†์œผ๋ฉด ์•Œ์•„์„œ ์ฐพ๋Š”๋‹ค. 

 

์ด์ œ ์„œ๋น„์Šค๋ฅผ ์•Œ์•„๋ณด์ž. ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์„œ๋น„์Šค ์•ˆ์— ๋‹ด๊ฒจ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋ชจ๋‘ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด๋‹ค. ์ฆ‰, ์œ„ ์˜ˆ์‹œ์—์„œ๋Š” web ์ด๋ผ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„ ๋‚ด์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋ชจ๋‘ ์›น์„œ๋ฒ„ ์—ญํ• ๋งŒ์„ ํ•˜๊ณ , mysql ์ด๋ผ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„ ๋‚ด์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋ชจ๋‘ DB์—ญํ•  ๋งŒ์„ ํ•œ๋‹ค.

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์ปจํ…Œ์ด๋„ˆ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๊ทธ ์ปจํ…Œ์ด๋„ˆ์˜ ๊ฐœ๋…์ด ๋งž๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์— ์ฃผ๋ชฉํ•ด๋ณด์ž. ์œ„ ๊ทธ๋ฆผ์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์ด dockercompose_web_1 ์ด๋ผ๊ณ  ๋˜์–ด ์žˆ๋‹ค. ์ด์ œ ์ถ”์ธกํ•  ์ˆ˜ ์žˆ๋‹ค์‹œํ”ผ ์•ž์˜ dockercompose ๋ผ๋Š” ๋‹จ์–ด๋Š” ํ”„๋กœ์ ํŠธ์˜ ์ด๋ฆ„(ํ”„๋กœ์ ํŠธ ์ด๋ฆ„์— ๋Œ€๋ฌธ์ž๊ฐ€ ๋“ค์–ด๊ฐ€๊ธด ํ•˜์ง€๋งŒ ๋ชจ๋‘ ์†Œ๋ฌธ์žํ™”๋˜์–ด์„œ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์— ๋ถ™์Œ)์ด๋ฉฐ ๊ทธ๋ฆฌ๊ณ  web ์€ ์„œ๋น„์Šค์˜ ์ด๋ฆ„์ด๋‹ค. ๋งˆ์ง€๋ง‰์˜ 1 ์ด๋ผ๋Š” ๋ฒˆํ˜ธ๋Š” ํ•ด๋‹น ์„œ๋น„์Šค ๋‚ด์— ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ฒˆํ˜ธ์ด๋‹ค. ์œ„์—์„œ ๋นจ๊ฐ„์ƒ‰ ์ ์„  ๋„ค๋ชจ์นธ์œผ๋กœ ๋‘˜๋Ÿฌ์‹ผ ์ปจํ…Œ์ด๋„ˆ 2๊ฐœ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์„œ๋น„์Šค ๋‚ด์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ 2๊ฐœ ์ถ”๊ฐ€์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋ฉด ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ ์ด๋ฆ„์€ dockercompose_web_2, dockercompose_web_3 ๊ฐ€ ๋˜๊ฒ ๋‹ค. ์ฐธ๊ณ ๋กœ ๋„์ปค ์Šค์›œ ๋•Œ์ฒ˜๋Ÿผ docker-compose ๋ช…๋ น์–ด๋กœ๋„ ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆซ์ž๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 

$ docker-compose scale [์„œ๋น„์Šค]=[์ปจํ…Œ์ด๋„ˆ์ˆซ์ž]
$ docker-compose sacle web=3

 

docker-compose ๊ด€๋ จ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ ์ถ”๊ฐ€์ ์œผ๋กœ ์•Œ์•„๋ณผ ๊ฒŒ 2๊ฐ€์ง€ ์žˆ๋‹ค. ์šฐ์„ ์€ ์œ„์—์„œ yaml ํŒŒ์ผ๋กœ ๋ช…์‹œํ•œ ๊ฒƒ์€ ์ด 2๊ฐœ ์ข…๋ฅ˜์˜ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ผ๊ณ  ๋˜์–ด ์žˆ์ง€๋งŒ, docker-compose ๋ช…๋ น์–ด๋กœ ํŠน์ • ์„œ๋น„์Šค๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค.

 

$ docker-compose up -d [์„œ๋น„์Šค]
$ docker-compose up -d mysql

 

๋‘ ๋ฒˆ์งธ๋กœ๋Š” docker-compose ๋ช…๋ น์–ด๋„ ๋‹จ์ˆœํ•œ docker ๋ช…๋ น์–ด์ฒ˜๋Ÿผ run ์„ ๋ถ™์—ฌ ํŠน์ • ์„œ๋น„์Šค์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ๋„ ์žˆ๋‹ค. ํŠน์ง•์€ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒ ์…ธ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์œ„ํ•ด ๋‹จ์ˆœ docker ๋ช…๋ น์–ด์™€๋Š” ๋‹ฌ๋ฆฌ -it ์˜ต์…˜์„ ๋ถ™์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

 

$ docker-compose run [SERVICE] [COMMAND]
$ docker-compose run web /bin/bash

 

์ด์ œ ๋„์ปค ์ปดํฌ์ฆˆ๋กœ ์ƒ์„ฑ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•ด๋ณด์ž. ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ๋‹จ, ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•œ๋‹ค๋ฉด ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ์„œ๋น„์Šค ๋‚ด์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ๋ชจ๋‘ ์ •์ง€๋œ ํ›„ ์‚ญ์ œ๋จ์„ ์•Œ์•„๋‘์ž.

 

$ docker-compose down
$ docker-compose down -p [PROJECT]

 

๊ธฐ๋ณธ์ ์œผ๋กœ docker-compose down ๋ช…๋ น์–ด๋Š” ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ์˜ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œํ•œ๋‹ค. ํ•˜์ง€๋งŒ -p(--project-name) ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ์–ด ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•  ํŠน์ • ํ”„๋กœ์ ํŠธ๋ฅผ ๋ช…์‹œํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ -p ์˜ต์…˜์„ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ docker-compose.yaml ํŒŒ์ผ์„ ๊ฐ–๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋“ค ์ค‘ ๋‚ด๊ฐ€ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๊ณ  ์‹ถ์€ ํŠน์ • ํ”„๋กœ์ ํŠธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ Dockerfile ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ -f(--file) ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ docker-compose.yaml ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ๋ฅผ ๋ช…์‹œํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

3. ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•ด๋ณด๊ธฐ

์ด์ œ ๋„์ปค ์ปดํฌ์ฆˆ์˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์„ ์ตํ˜€๋ณด์•˜๋‹ค. ์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ ๋ถ€ํ„ฐ๋Š” ์‹ค์ œ ํ™˜๊ฒฝ ๋˜๋Š” ์‹ค๋ฌด์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋  ๋ฒ•ํ•œ ๋„์ปค ์ปดํฌ์ฆˆ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž. ํฌ๊ฒŒ 2๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ๋ฐฐ์›Œ๋ณผ ์˜ˆ์ •์ธ๋ฐ, ์šฐ์„  ์ฒซ ๋ฒˆ์งธ๋Š” YAML ํŒŒ์ผ์— ์ข€ ๋” ๋‹ค์–‘ํ•œ ์˜ต์…˜ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋ฒ•, ๋‘ ๋ฒˆ์งธ๋Š” ๋„์ปค ์ปดํฌ์ฆˆ ์ž์ฒด๋ฅผ ์ž˜ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. 

3-1. YAML ํŒŒ์ผ์„ ์ข€ ๋” ์•Œ์ฐจ๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ

YAML ํŒŒ์ผ์—์„œ ๋ช…์‹œํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์˜ต์…˜๋“ค์€ ๋‹จ์ง€ docker run ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ์— ์„ค์ •ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์„ YAML ํŒŒ์ผ์— ์˜ฎ๊ฒจ ์ ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. YAML ํŒŒ์ผ์€ ํฌ๊ฒŒ YAML ํŒŒ์ผ์˜ ํฌ๋งท ๋ฒ„์ „ ์ •์˜, ์„œ๋น„์Šค ์ •์˜, ๋ณผ๋ฅจ ์ •์˜, ๋„คํŠธ์›Œํฌ ์ •์˜ ์ด 4๊ฐ€์ง€ ํ•ญ๋ชฉ์œผ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. ๊ทธ ์ค‘ ๊ฐ€์žฅ ์ž์ฃผ ์ž‘์„ฑํ•˜๋Š” ๋ถ€๋ถ„์€ ์„œ๋น„์Šค ์ •์˜ ๋ถ€๋ถ„์ด๋‹ค.

3-1-1. ๋ฒ„์ „ ์ •์˜

์—ฌ๊ธฐ์„œ์˜ ๋ฒ„์ „์ด๋ผ ํ•จ์€ YAML ํŒŒ์ผ์˜ ํฌ๋งท ๋ฒ„์ „์ด๋‹ค. YAML ํŒŒ์ผ์˜ ํฌ๋งท์€ ๋„์ปค ์ปดํฌ์ฆˆ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ๋˜๋Š” ๊ฒƒ์ด ์žˆ๊ณ  ์•„๋‹Œ ๊ฒƒ์ด ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉํ•˜๋Š” ๋„์ปค ์ปดํฌ์ฆˆ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜์ด ๋˜๋Š” YAML ํŒŒ์ผ์˜ ํฌ๋งท ๋ฒ„์ „์„ ์ ์ ˆํžˆ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

# docker-compose.yaml
version: '3.0'

3-1-2. ์„œ๋น„์Šค ์ •์˜

๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ์ƒ์„ฑํ•  ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์— ๋Œ€ํ•œ ์˜ต์…˜์„ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ์˜ต์…˜์„ ์„œ๋น„์Šค ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋™์ผํ•œ ์ด๋ฏธ์ง€ ์ฆ‰, ๋™์ผํ•œ ์—ญํ• ๊ณผ ์„ค์ • ๊ฐ’์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ๋งŒ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•ญ๋ชฉ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.

 

๋จผ์ € image์ด๋‹ค. image ํ•ญ๋ชฉ์€ ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์ƒ์„ฑํ•  ๋•Œ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” ์ด๋ฏธ์ง€์ด๋‹ค. ์ด๋ฏธ์ง€ ์ด๋ฆ„ ํฌ๋งท์€ docker๊ฐ€ ์ ‘๋‘์–ด๋กœ ๋ถ™๋Š” ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•  ๋•Œ์™€ ๋™์ผํ•˜๊ฒŒ ๋ช…์‹œํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: httpd:latest
  mysql:
    image: mysql:latest

 

๋‹ค์Œ์€ links ํ•ญ๋ชฉ์ด๋‹ค. ์ด์ „์— ์ปจํ…Œ์ด๋„ˆ ๋‹ค๋ฃจ๊ธฐ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์šด --link ์˜ต์…˜๊ณผ ๊ฐ™๋‹ค. ๊ทธ ๋•Œ ๋‹น์‹œ --link ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํŠน์ •ํ•œ ๋ณ„์นญ(alias)๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค. ํ˜•์‹์€ [SERVICE]:[alias] ๋กœ ์ •์˜ํ•œ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: httpd:latest
    links:
      mysql:db  # mysql ์„œ๋น„์Šค๋ฅผ `db`๋ผ๋Š” ๋ณ„์นญ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  mysql:
    image: mysql:latest

 

์ฐธ๊ณ ๋กœ links ์˜ต์…˜์€ ์œ„์™€ ๊ฐ™์ด ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋ณ„์นญ์„ ๋ช…์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•”๋ฌต์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์˜ ์‹คํ–‰ ์ˆœ์„œ ์ฆ‰, ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.

 

๋‹ค์Œ์€ environment ํ•ญ๋ชฉ์ด๋‹ค. docker ์ ‘๋‘์–ด ๋ช…๋ น์–ด์—์„œ -e ์˜ต์…˜์„ ์ค€ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. YAML ํŒŒ์ผ์—์„œ๋Š” ๋ฐฐ์—ด ํ˜•ํƒœ ๋˜๋Š” ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ช…์‹œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.(๋งŒ์•ฝ YAML ํŒŒ์ผ์—์„œ์˜ ๋ฐฐ์—ด์ด ๋ฌด์—‡์ธ์ง€ ์ž˜ ๋ชจ๋ฅด๋ฉด ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์ž. ์„ค๋ช…์ด ์ž˜ ๋˜์–ด ์žˆ๋‹ค)

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: httpd:lates
    links:
      mysql:db
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=1234
      - MYSQL_DATABASE_NAME=zedd_db
   (๋˜๋Š”)
    environment:
      MYSQL_ROOT_PASSWORD : 1234
      MYSQL_DATABASE_NAME : zedd_db

 

๋‹ค์Œ์€ command ํ•ญ๋ชฉ์ด๋‹ค. ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋  ๋•Œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์–ด ์„ค์ •๊ฐ’์ด๋‹ค. docker run ๋ช…๋ น์–ด์˜ ๋งˆ์ง€๋ง‰ ์ธ์ž์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋˜๋Š” Dockerfile ์—์„œ์˜ RUN ๋ช…๋ น์–ด์ฒ˜๋Ÿผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ช…์‹œํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: httpd:lates
    links:
      mysql:db
    command: /bin/bash
    (๋˜๋Š”)
    command: [/bin/bash]
  mysql:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWROD=1234
      - MYSQL_DATABASE_NAME=zedd_db

 

๋‹ค์Œ์€ depends_on ํ•ญ๋ชฉ์ด๋‹ค. ์ด๋Š” ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋ฐฉ๊ธˆ ์œ„์—์„œ ์‚ดํŽด๋ณด์•˜๋˜ links ํ•ญ๋ชฉ์ด ํ•˜๋Š” ์—ญํ•  ์ค‘ ํ•˜๋‚˜์™€ ๋น„์Šทํ•˜๋‹ค. ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์˜๋ฏธํ•˜๊ธฐ๋„ ํ•œ๋‹ค. depends_on: ๋’ค์— ์„œ๋น„์Šค ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๋ฉด ๋˜๋Š”๋ฐ, ์ด๋Š” depends_on ๋’ค์— ๋‚˜์˜ค๋Š” ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค. ํ•˜์ง€๋งŒ links ํ•ญ๋ชฉ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ง€๋งŒ depends_on๋„ ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋ช…์‹œํ•˜์ง€๋งŒ ๋จผ์ € ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์ธ์ง€๋ฅผ ๋ณด์žฅํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค.

 

์ด๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํ•œ ๊ฐ€์ง€ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A์™€ B๋ผ๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  B ์„œ๋น„์Šค ํ•ญ๋ชฉ์— ์•„๋ž˜์ฒ˜๋Ÿผ A์— ์˜์กดํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

version: '3.0'
services:
  A:
    image: mysql:latest
  B:
    image: httpd:latest
    depends_on:
      A

 

YAML ํŒŒ์ผ ์ •๋ณด๊ฐ€ ์œ„์™€ ๊ฐ™๋‹ค๊ณ  ํ•  ๋•Œ, ๋ฐฉ๊ธˆ ๋งํ•œ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๊ธฐ ์œ„ํ•ด์„œ B ์„œ๋น„์Šค ํ•ญ๋ชฉ์— ํŠน์ • ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋Š” ๋ช…๋ น์–ด๋ฅผ entrypoint ํ•ญ๋ชฉ์— ๋„ฃ์–ด์ฃผ์ž. ์—ฌ๊ธฐ์„œ entrypoint ํ•ญ๋ชฉ์€ Dockerfile์—์„œ ๋ฐฐ์šด ENTRYPOINT์™€ ๋™์ผํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ํ•ด๋‹น ํ•ญ๋ชฉ์ด ์ถ”๊ฐ€๋œ YAML ํŒŒ์ผ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

version: '3.0'
services:
  A:
    image: mysql:latest
  B:
    image: httpd:latest
    depends_on:
      A
    entrypoint: ./sync.sh

 

์œ„์—์„œ ๋ช…์‹œํ•œ sync.sh ์…ธ ์Šคํฌ๋ฆฝํŠธ์˜ ๋‚ด์šฉ์€ ๋Œ€์ถฉ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. ์„œ๋น„์Šค A ์ปจํ…Œ์ด๋„ˆ์— ํŠน์ • ๋ช…๋ น์–ด(ex. curl ๊ณผ ๊ฐ™์€)๋ฅผ ๋‚ ๋ ค์„œ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ์ •์ƒ ๋™์ž‘ ๊ฒฐ๊ณผ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋ฉด ๊ทธ ๋•Œ ๋ถ€ํ„ฐ A ์„œ๋น„์Šค์™€ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. sync.sh ์…ธ ์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์€ ์ง์ ‘ ์ž‘์„ฑํ•ด์ฃผ์–ด์—ฌ ํ•˜๋ฉฐ ์…ธ ์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์ด์šฉํ•ด ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค. ์ด์™€ ๋น„์Šทํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ dockerize, wait-for-it.sh ์…ธ ์Šคํฌ๋ฆฝํŠธ ๋„๊ตฌ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. 

 

์ฐธ๊ณ ๋กœ ์œ„์™€ ๊ฐ™์ด depends_on ํ•ญ๋ชฉ์ด ์ž‘์„ฑ๋˜์–ด ์žˆ๋Š” ์„œ๋น„์Šค ๋‚ด์—์„œ ์˜์กด์„ฑ์ด ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ ์ƒ์„ฑํ•˜๋ ค๋ฉด --no-deps ์˜ต์…˜์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

$ docker-compose up --no-deps [SERVICE]
$ docker-compose up --no-deps B

 

๋‹ค์Œ์€ ports ํ•ญ๋ชฉ์ด๋‹ค. docker ์ ‘๋‘์–ด ๋ช…๋ น์–ด์—์„œ์˜ -p ์˜ต์…˜๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ ์ฆ‰, ๊ฐœ๋ฐฉํ•  ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ๋ฅผ ๋ช…์‹œํ•ด์ค€๋‹ค. ํฌํŠธ๋ฅผ ๋ช…์‹œํ•ด์ฃผ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํฌ๊ฒŒ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: httpd:latest
    ports:
      - "8080"       # ์ปจํ…Œ์ด๋„ˆ์˜ 8080๋ฒˆ ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉ
      - "8081-8085"  # ์ปจํ…Œ์ด๋„ˆ์˜ 8081~8085๋ฒˆ ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉ
      - "80:80"      # ํ˜ธ์ŠคํŠธ์˜ 80๋ฒˆ ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ 80๋ฒˆ ํฌํŠธ๋ฅผ ์„œ๋กœ ๊ฐœ๋ฐฉํ•ด ํฌํŠธ ํฌ์›Œ๋”ฉ

 

์œ„ YAML ํŒŒ์ผ ํ˜•์‹์—์„œ "80:80" ์ฒ˜๋Ÿผ ํ˜ธ์ŠคํŠธ์˜ ํŠน์ • ํฌํŠธ์™€ ์ปจํ…Œ์ด๋„ˆ์˜ ํŠน์ • ํฌํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ํ˜•์‹์ด ์žˆ๋‹ค. ๋งŒ์•ฝ ์œ„ YAML ํŒŒ์ผ ํ˜•์‹์„ ์ฝ์–ด๋“ค์—ฌ์„œ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์ˆ˜ํ–‰ํ•  ํ™˜๊ฒฝ์ด ๋‹จ์ผ ํ˜ธ์ŠคํŠธ(1๊ฐœ์˜ ๋จธ์‹ ) ํ™˜๊ฒฝ์ด๋ผ๋ฉด ์ดํ›„์— ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๋Š”(scale) ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋Š” ๋ชปํ•œ๋‹ค. ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ์—์„œ ํ•˜๋‚˜์˜ ํฌํŠธ๋ฒˆํ˜ธ(ex. 80๋ฒˆ ํฌํŠธ)๋Š” ํ•˜๋‚˜์˜ ์ปจํ…Œ์ด๋„ˆ๋งŒ ์ ์œ ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

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

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    build: ./dockerfile_path     # Dockerfile ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” ๊ฒฝ๋กœ
    context: ./dockerfile_path   # ๋นŒ๋“œ ์ปจํ…์ŠคํŠธ ๊ฒฝ๋กœ
    dockerfile: zeddDockerfile   # Dockerfile ํŒŒ์ผ ์ด๋ฆ„
    args:
      HOST_NAME: web_zedd
      HOST_CONFIG: web_config

 

build ํ•ญ๋ชฉ์—์„œ ์ถ”๊ฐ€๋กœ ์•Œ์•„๋‘˜์–ด์•ผ ํ•  ์ ์ด ์žˆ๋‹ค. ์œ„์ฒ˜๋Ÿผ build ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜์—ฌ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์ˆ˜ํ–‰ํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ ๋‹ค์Œ, ์ดํ›„์— ์‚ฌ์šฉํ•œ Dockerfile ๋‚ด์šฉ์„ ์ดํ›„์— ์ˆ˜์ •ํ•œ ๋’ค ๋‹ค์‹œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•ด๋„ ์ด๋ฏธ์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋นŒ๋“œํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๋งŒ์•ฝ Dockerfile์— ์ˆ˜์ •์„ ๊ฐ€ํ•˜๊ณ  ๋‚œ ๋‹ค์Œ ์ด๋ฏธ์ง€๋ฅผ ์ƒˆ๋กญ๊ฒŒ ๋นŒ๋“œํ•˜๋„๋ก ํ•˜๋ ค ํ•œ๋‹ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ 2๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋œ๋‹ค.

 

$ docker-compose up -d --build  # --build ์˜ต์…˜ ์‚ฌ์šฉ
$ docker-compose build [YAML ํŒŒ์ผ์—์„œ ๋นŒ๋“œํ•  ์„œ๋น„์Šค ์ด๋ฆ„]

 

๋‹ค์Œ์€ extends ํ•ญ๋ชฉ์ด๋‹ค. extends ํ•ญ๋ชฉ์€ ๊ฐ™์€ YAML ํŒŒ์ผ ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ YAML ํŒŒ์ผ์—์„œ ์„œ๋น„์Šค์˜ ์†์„ฑ์„ ์ƒ์†๋ฐ›๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์„ค์ •์ด๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž.

 

extends ํ•ญ๋ชฉ ์˜ˆ์‹œ

 

์œ„ ๊ทธ๋ฆผ์„ ์„œ๋กœ ๋‹ค๋ฅธ YAML ํŒŒ์ผ์—์„œ ์„œ๋น„์Šค์˜ ์†์„ฑ์„ ์ƒ์†๋ฐ›๋Š” ์˜ˆ์‹œ๋‹ค. docker-compose.yaml ์— ์ •์˜๋œ extends ํ•ญ๋ชฉ์„ ๋ณด๋ฉด ์ƒ์† ๋ฐ›์„ ์„œ๋น„์Šค ์„ค์ •์ด ๋“ค์–ด์žˆ๋Š” YAML ํŒŒ์ผ ์ด๋ฆ„๊ณผ ์ƒ์† ๋ฐ›์„ ์„œ๋น„์Šค์˜ ์ด๋ฆ„์„ ์ ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ๋งŒ์•ฝ ํ•˜๋‚˜์˜ YAML ํŒŒ์ผ ์•ˆ์—์„œ extends ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•ด ์ƒ์†์„ ๋ฐ›์œผ๋ ค๋ฉด ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋œ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
  services:
    web:
      extends:
        service: extend-web
    extend-web:
      image: ubuntu:14.04
      ports:
        - "80:80"

 

extends ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์ „์— ๋ณต์žกํ•œ ์„ค์ •๊ฐ’๋“ค๋กœ ๋งŒ๋“ค์–ด์ง„ ์„œ๋น„์Šค์˜ ์†์„ฑ์„ ํ•œ๋ฒˆ์— ์ƒ์†๋ฐ›์•„ YAML ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๊ฐ„๊ฒฐํ™”์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ extends ํ•ญ๋ชฉ์ด ๋ชจ๋“  ์„ค์ •๊ฐ’์„ ์ƒ์†๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋Œ€ํ‘œ์ ์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์ด์˜ ์˜์กด์„ฑ์„ ๋‚ดํฌํ•˜๊ณ  ์žˆ๋Š” depends_on, links, volumes_from ๊ณผ ๊ฐ™์€ ์„ค์ •์ด ๋“ค์–ด์žˆ๋Š” ์„œ๋น„์Šค๋Š” ์ƒ์†๋ฐ›์ง€ ๋ชปํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘์ž.

3-1-3. ๋„คํŠธ์›Œํฌ ์ •์˜

์ด๋ฒˆ ๋ชฉ์ฐจ์—์„œ๋Š” YAML ํŒŒ์ผ์—์„œ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋„์ปค ๋„คํŠธ์›Œํฌ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋„์ปค ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃจ์—ˆ์œผ๋ฏ€๋กœ, ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•œ ๊ฐœ๋…์€ ์ƒ๋žตํ•˜๊ฒ ๋‹ค. 

 

๋จผ์ € driver ํ•ญ๋ชฉ์ด๋‹ค. ๋„์ปค ์ปดํฌ์ฆˆ๋Š” ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ, ์ƒ์„ฑ๋  ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ๋  ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋กœ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ธŒ๋ฆฌ์ง€ ํƒ€์ž…์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๋Š” YAML ํŒŒ์ผ์— driver ํ•ญ๋ชฉ์„ ๋ช…์‹œํ•จ์œผ๋กœ์จ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์„ค์ •ํ•  ํ•˜์œ„ ํ•ญ๋ชฉ์œผ๋กœ๋Š” driver_ops ํ•ญ๋ชฉ์œผ๋กœ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  myService:
    image: nginx
    networks:
      - mynetwork  # ์‚ฌ์šฉํ•  ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์ด๋ฆ„
networks:
  mynetwork:
    driver: overlay
    driver_opts:
      subnet: "255.255.255.0"
      IPAdress: "10.0.0.2"

 

์œ„ ์˜ˆ์‹œ์—์„œ๋Š” ๋„์ปค ์Šค์›œ์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•ด ์ ์šฉํ•œ ์˜ˆ์‹œ๋‹ค.

 

๋‹ค์Œ์€ ipam ํ•ญ๋ชฉ์ด๋‹ค. ipam ์ด๋ž€ IP Address Manager์˜ ์ค„์ž„๋ง๋กœ ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด IP ์ฃผ์†Œ๋ฅผ ์ž๋™์œผ๋กœ ๋ถ€์—ฌํ•˜๊ณ  ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ipam์„ ์ง€์›ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ipam ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•ด์„œ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: nginx
    networks:
      - mynetwork
networks:
  mynetwork:
    driver: overlay
    driver_opts:
      subnet: "255.255.255.0"
      IPAdress: "10.0.0.2"
  ipam:
    driver: mydriver  # iapm์„ ์ง€์›ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„์ž„์„ ์ „์ œ
    config:
      subnet: 172.20.0.0/16
      ip_range: 172.20.5.0/24
      gateway: 172.20.5.1

 

๋‹ค์Œ์€ external ํ•ญ๋ชฉ์ด๋‹ค. ๋ฐฉ๊ธˆ๊นŒ์ง€๋Š” ๋ชจ๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐ์กด์— ์ด๋ฏธ ์ƒ์„ฑ๋œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋•Œ external ํ•ญ๋ชฉ์„ ์‚ฌ์šฉํ•œ๋‹ค. networks ํ•ญ๋ชฉ์— ์‚ฌ์šฉํ•  ๊ธฐ์กด ๋„คํŠธ์›Œํฌ์˜ ์ด๋ฆ„์„ ๋ช…์‹œํ•˜๊ณ  ๊ทธ ํ•˜์œ„ ํ•ญ๋ชฉ์— external ์— true ๊ฐ’์„ ์ฃผ๋ฉด ๋œ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  web:
    image: nginx
    networks:
      - existing_network
networks:
  existing_network
    external: true

3-1-4. ๋ณผ๋ฅจ ์ •์˜

๋‹ค์Œ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ๋ณผ๋ฅจ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์„ค์ •ํ•˜๋Š” ํ•ญ๋ชฉ๋“ค์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋จผ์ € driver ํ•ญ๋ชฉ์ด๋‹ค. ๋„คํŠธ์›Œํฌ๋„ ๊ทธ๋žฌ์ง€๋งŒ ๋ณผ๋ฅจ์—์„œ๋„ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์–ด๋– ํ•œ ์„ค์ •๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด local ์ด๋ผ๋Š” ๋“œ๋ผ์ด๋ฒ„๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ด๋ฅผ ์ž…๋ง›์— ๋งž๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ณผ๋ฅจ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ driver_opts ํ•ญ๋ชฉ์œผ๋กœ ๋ณ„๋„๋กœ ์‚ฌ์šฉํ•  ๋“œ๋ผ์ด๋ฒ„์˜ ํ•˜์œ„ ์˜ต์…˜์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

# docker-compose.yaml
version: '3.0'
services:
  ...(์ƒ๋žต)...
volumes:
  driver: flocker
    driver_opts:
      opt: "1"
      opt2: 2

 

๋‹ค์Œ์€ external ํ•ญ๋ชฉ์ด๋‹ค. ๋ณผ๋ฅจ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋„์ปค ์ปดํฌ์ฆˆ๋Š” YAML ํŒŒ์ผ์— ๋ช…์‹œ๋œ volume, volumes-from ํ•ญ๋ชฉ์„ ๋ณด๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋ณผ๋ฅจ๋„ ๋„คํŠธ์›Œํฌ ์ฒ˜๋Ÿผ ๊ธฐ์กด์— ์ƒ์„ฑ๋œ ๋ณผ๋ฅจ์„ ๊ฐ–๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ external ํ•ญ๋ชฉ์ด๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

version: '3.0'
servcies:
  web:
    image: nginx
    volumes:
      - myVolume: /container/path  # `myVolume`์ด๋ผ๋Š” ๊ธฐ์กด์˜ ๋ณผ๋ฅจ์„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ `/container/path` ๊ฒฝ๋กœ์— ๋งˆ์šดํŠธ
volumes:
  myVolume:
    external: true

 

๋ณผ๋ฅจ๊ณผ ๊ด€๋ จ๋œ ํ•ญ๋ชฉ์€ ์•„๋‹ˆ์ง€๋งŒ ๋งˆ์ง€๋ง‰์œผ๋กœ ์•Œ์•„๋ณผ ํ•ญ๋ชฉ์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ์ž‘์„ฑํ•œ YAML ํŒŒ์ผ์˜ ์˜คํƒ€๋‚˜ ํŒŒ์ผ ํฌ๋งท์ด ์ œ๋Œ€๋กœ ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” docker-compose config ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•œ ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ๋˜๋Š” ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ docker-compose.yaml ํŒŒ์ผ์„ ์•Œ์•„์„œ ์ฐพ์•„ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค. ๋ฌผ๋ก  ์ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ -f ์˜ต์…˜์„ ์ฃผ์–ด docker-compose.yaml ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ๋ฅผ ์ง์ ‘ ๋ช…์‹œํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค.

 

$ docker-compose config
$ docker-compose -f [YAML PATH] config

3-2. ๋„์ปค ์ปดํฌ์ฆˆ ๋” ์ž˜ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

์ด๋ฒˆ์—” ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์ข€ ๋” ์ž˜ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋‚ด์šฉ๋“ค์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž. ๋ง์€ ๊ฑฐ์ฐฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ.. ๋ฐฐ์šธ ๋‚ด์šฉ์€ 2๊ฐ€์ง€๋‹ค. ๋„์ปค ์ปดํฌ์ฆˆ ๋„คํŠธ์›ŒํŠธ์— ๋Œ€ํ•œ ๋‚ด์šฉ๊ณผ ๋„์ปค ์ปดํฌ์ฆˆ์™€ ๋„์ปค ์Šค์›œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ์ด๋‹ค.

3-2-1. ๋„์ปค ์ปดํฌ์ฆˆ ๋„คํŠธ์›Œํฌ

[3-1-3. ๋„คํŠธ์›Œํฌ ์ •์˜] ํ•ญ๋ชฉ์—์„œ ์ž ๊น ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ด๋–ค ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ณด์•˜๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋„์ปค ์ปดํฌ์ฆˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ฆฌ์ง€ ํƒ€์ž…์˜ ์ƒˆ๋กœ์šด ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•ด ์ ์šฉํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑ๋œ ๋„คํŠธ์›Œํฌ์˜ ์ด๋ฆ„์€ [ํ”„๋กœ์ ํŠธ ์ด๋ฆ„]_default ๋กœ ์„ค์ •์ด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ญ์ œ ์ฆ‰, docker-compose down ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ƒ์„ฑํ•œ ๋„คํŠธ์›Œํฌ๋„ ์‚ญ์ œ์‹œํ‚จ๋‹ค. docker-compose down ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅ์‹œํ‚ค๊ณ  ๋‚˜์˜ค๋Š” ํ‘œ์ค€ ์ถœ๋ ฅ์— "Removing network ... " ๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ๋ณด์ผ ๊ฒƒ์ด๋‹ค.

 

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ๋ธŒ๋ฆฌ์ง€ ํƒ€์ž…์˜ ๋„คํŠธ์›Œํฌ๋Š” docker-compose scale ๋ช…๋ น์–ด๋กœ ๋Š˜๋ ค์ค€ ์ปจํ…Œ์ด๋„ˆ๋“ค์— ์˜ํ•ด์„œ๋„ ์‚ฌ์šฉ์ด ๋œ๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ์ƒˆ๋กญ๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ๋‚ด๋ถ€์ ์œผ๋กœ --net-alias ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค ์ด๋ฆ„์„ ์ผ์ข…์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. --net-alias ์˜ต์…˜์— ๋Œ€ํ•ด์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‹ค๋ฃจ๊ธฐ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์› ์œผ๋ฏ€๋กœ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•˜๊ฒ ๋‹ค. ๊ธฐ์–ต์ด ๋‚˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹ค์‹œ ๋ณด๊ณ  ์˜ค์ž. 

 

๊ทธ๋ž˜์„œ ๋„์ปค ์ปดํฌ์ฆˆ์—์„œ๋„ ํŠน์ • ์„œ๋น„์Šค์˜ ์ด๋ฆ„์œผ๋กœ ํ•ด๋‹น ์„œ๋น„์Šค ๋‚ด์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋“ค์— ๋Œ€ํ•ด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด์— ๋Œ€ํ•œ ๊ด€๊ณ„๋ฅผ ๋„์‹ํ™”ํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹

 

์œ„์ฒ˜๋Ÿผ mysql ์ด๋ผ๋Š” ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ์ ‘๊ทผ์„ ์š”์ฒญํ•˜๋ฉด mysql ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ ์ค‘ ํ•˜๋‚˜์— ์ ‘๊ทผํ•˜๋„๋ก ํ•œ๋‹ค. ์ด ๋•Œ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ• ์ง€์˜ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์„ ํƒํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ๋„๋ฉ”์ธ ์ด๋ฆ„์œผ๋กœ ํŠน์ • ์„œ๋น„์Šค ๋‚ด์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ ์Šค์›œ ๋ชจ๋“œ์—์„œ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฌผ๋ก  ๊ตฌ์ฒด์ ์ธ ๋ฐฉ์‹์€ ๋‹ค๋ฅด๋‹ค. ์Šค์›œ ๋ชจ๋“œ์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๊ฐ€ ์œ„์™€ ๊ฐ™์€ ์›๋ฆฌ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•œ๋‹ค.

3-2-2. ๋„์ปค ์ปดํฌ์ฆˆ + ๋„์ปค ์Šค์›œ ์‚ฌ์šฉํ•˜๊ธฐ

์ด๋ฒˆ์—” ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ๋„์ปค ์Šค์›œ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์šฐ์„  ์Šค์›œ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”์‹œ์ผœ์•ผ ํ•˜๋Š”๋ฐ, ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋ฐฉ๋ฒ•์€ ๋„์ปค ์Šค์›œ ํฌ์ŠคํŒ…์„ ์ฐธ์กฐํ•˜๋„๋ก ํ•˜์ž.

 

๋„์ปค ์ปดํฌ์ฆˆ 1.10 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” ์Šค์›œ ๋ชจ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” YAML ๋ฒ„์ „ 3์ด ๋ฐฐํฌ๋จ์— ๋”ฐ๋ผ ์Šค์›œ ๋ชจ๋“œ์™€ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ํ™œ์šฉํ•˜๋Š” ๊ฐœ๋…์ธ ์Šคํƒ(stack)์ด ๋„์ปค ์—”์ง„ 1.13 ๋ฒ„์ „๋ถ€ํ„ฐ ์ถ”๊ฐ€๊ฐ€ ๋˜์—ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์Šคํƒ์ด๋ž€, YAML ํŒŒ์ผ์—์„œ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ๋ฌถ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ YAML ํŒŒ์ผ์„ ํ™œ์šฉํ•ด ์Šคํƒ์„ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋ฉด YAML ํŒŒ์ผ์— ์ •์˜๋œ ์„œ๋น„์Šค๊ฐ€ ์Šค์›œ ๋ชจ๋“œ์˜ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ฒ„ ๋‚ด์— ์ผ๊ด„์ ์œผ๋กœ ์ƒ์„ฑ์ด ๋œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, YAML ํŒŒ์ผ์— ์ •์˜๋œ ์„œ๋น„์Šค๋“ค์ด ์Šค์›œ ๋ชจ๋“œ์—์„œ์˜ ์„œ๋น„์Šค ๊ฐœ๋…์œผ๋กœ ๋ณ€ํ™˜ ๋˜๋Š” ์…ˆ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์Šคํƒ์€ docker-compose๊ฐ€ ์•„๋‹Œ docker stack ์ด๋ผ๋Š” ๋ช…๋ น์–ด๋กœ ์ œ์–ด๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค. ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์Šคํƒ์€ ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ์•„๋‹Œ ์Šค์›œ ๋ชจ๋“œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์Šคํƒ์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ญ์ œํ•˜๋Š” ๊ฒƒ๋„ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

 

์‹ค์Šต์„ ํ•ด๋ณด๊ธฐ ์œ„ํ•ด์„œ, ๋„์ปค ์Šค์›œ ํฌ์ŠคํŒ…์—์„œ์ฒ˜๋Ÿผ ๋งค๋‹ˆ์ € ๋…ธ๋“œ 1๊ฐœ๋ฅผ ์œ„ํ•œ VM 1๊ฐœ, ์›Œ์ปค ๋…ธ๋“œ 2๊ฐœ๋ฅผ ์œ„ํ•œ VM 2๊ฐœ๋ฅผ ์ค€๋น„ํ•ด๋ณด๋„๋ก ํ•˜์ž. ํ•„์ž๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ค€๋น„ํ•˜์˜€๋‹ค.

 

 

์ด์ œ ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ์Šค์›œ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ YAML ํŒŒ์ผ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด๋ณด์ž.

 

version: '3.0'
services:
  web:
    command: apachectl -DFOREGROUND
    image: alicek106/composetest:web
    links:
      - mysql:db
    ports:
      - 80:80
  mysql:
    command: mysqld
    image: alicek106/composetest:mysql
networks: {}
volumes: {}

 

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด ํ˜•์‹์„ ์‚ฌ์šฉํ•˜์—ฌ YAMLํŒŒ์ผ์„ ์Šคํƒ์œผ๋กœ ๋ณ€ํ™˜์‹œํ‚ค์ž.

 

$ docker stack deploy --config-file [YAML PATH] [์ƒ์„ฑํ•  STACK ์ด๋ฆ„]
$ docker stack deploy --config-file ./docker-compose.yaml zedd_stack

 

์œ„ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ํ‘œ์ค€  ์ถœ๋ ฅ์˜ ๊ฐ€์žฅ ์ฒซ๋ฒˆ์งธ ์ค„์— "Ignoring unsupported options: links" ๋ผ๊ณ  ๋ฐœ์ƒํ•˜๋Š”๋ฐ, ์ด๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ์˜์กด์„ฑ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” links, depneds_on๊ณผ ๊ฐ™์€ ํ•ญ๋ชฉ์„ ์Šค์›œ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ•ด๋‹น ํ•ญ๋ชฉ๋“ค์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„œ๋กœ ๋‹ค๋ฅธ ์—ญํ• ์„ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค(์œ„ ์˜ˆ์‹œ์—์„œ๋Š” web, mysql ๊ฐ ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ)์ด ๊ฐ™์€ ํ˜ธ์ŠคํŠธ์— ์กด์žฌํ•˜๋Š” ํ™˜๊ฒฝ์— ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ถ”๊ฐ€์ ์œผ๋กœ, ์Šคํƒ์„ ์ œ์–ดํ•˜๋Š” ๊ด€๋ จ ๋ช…๋ น์–ด ์ข…๋ฅ˜๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

๋ช…๋ น์–ด ์˜๋ฏธ
docker stack ls ์ƒ์„ฑํ•œ ์Šคํƒ ์ •๋ณด ์ถœ๋ ฅ
docker stack ps [STACK] ํŠน์ • ์Šคํƒ์œผ๋กœ ์ƒ์„ฑํ•œ ์„œ๋น„์Šค ๋‚ด์— ์กด์žฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด ์ถœ๋ ฅ
docker stack services [STACK] ์Šคํƒ์œผ๋กœ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค ์ •๋ณด ์ถœ๋ ฅ
docker stack rm [STACK] ํŠน์ • ์Šคํƒ์œผ๋กœ ์ƒ์„ฑ๋œ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œ

 

์ด๋ ‡๊ฒŒ ์Šค์›œ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„์ปค ์ปดํฌ์ฆˆ๋ฅผ ํ™œ์šฉํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด์•˜๋‹ค. ๋งŒ์•ฝ ํŠน์ • ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ผ ๊ฒฝ์šฐ, ๋„์ปค ์ปดํฌ์ฆˆ ๊ด€๋ จ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ ์Šค์›œ ๊ด€๋ จ ๋ช…๋ น์–ด์ธ docker service scale ๊ด€๋ จ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํƒ์€ ๋„์ปค ์ปดํฌ์ฆˆ๊ฐ€ ์•„๋‹ˆ๋ผ ์Šค์›œ ํ‚ท์ด๋ผ๋Š” ๊ฒƒ์— ์˜ํ•ด ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋‹ค์Œ์€ ์Šคํƒ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ์ž ์‹œ ์•Œ์•„๋ณด์ž. ์œ„์—์„œ ์Šคํƒ์„ ํ™œ์šฉํ•ด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ‘œ์ค€ ์ถœ๋ ฅ์„ ๋ณด๋ฉด ์Šคํƒ์„ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•œ ๊ฒƒ์„ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

 

์ด์ฒ˜๋Ÿผ ์Šคํƒ์„ ์œ„ํ•œ ๋„คํŠธ์›Œํฌ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ, ์Šคํƒ์˜ ๋„คํŠธ์›Œํฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ ์†์„ฑ์„ ๊ฐ€์ง€๊ฒŒ ๋œ๋‹ค. ๊ฐœ์ธ์ ์ธ ์ƒ๊ฐ์œผ๋กœ๋Š” ์Šคํƒ์ด ๋„์ปค ์Šค์›œ์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šค์›œ์ด ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด์ง€ ์•Š์„๊นŒ๋„ ์ถ”์ธกํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ ๋„คํŠธ์›Œํฌ๋Š” ์‹ค์ œ๋กœ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋„คํŠธ์›Œํฌ ์ฆ‰, SCOPE ํ•ญ๋ชฉ์ด swarm ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ ๋˜์–ด ์žˆ๋‹ค.

 

 

ํ•˜์ง€๋งŒ ์Šคํƒ ๋„คํŠธ์›Œํฌ๊ฐ€ ์Šค์›œ ๋ชจ๋“œ ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š”, ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ž‘์€ ์•ฝ๊ฐ„ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋ฐฐ์› ๋“ฏ์ด, ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋Š” ์ƒ์„ฑ ์‹œ --attachable ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์Šค์›œ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ docker run ๊ด€๋ จ ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํƒ ๋„คํŠธ์›Œํฌ๋Š” ์• ์ดˆ์— --attachable ์˜ต์…˜์ด ์„ค์ •๋˜์–ด์„œ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— docker run ๊ด€๋ จ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—๊ฒŒ ์Šคํƒ ๋„คํŠธ์›Œํฌ๋ฅผ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์—†๋‹ค.


์ด๋ ‡๊ฒŒ ํ•ด์„œ ์ฑ…์˜ ๋„์ปค์™€ ๊ด€๋ จ๋œ ๋ชฉ์ฐจ ๋‚ด์šฉ์€ ๋ชจ๋‘ ๋์ด ๋‚ฌ๋‹ค. ์ด์ „์— ๋„์ปค๋ฅผ ์–•๊ฒŒ๋‚˜๋งˆ ๋ฐฐ์› ์ง€๋งŒ ์ด๋ฒˆ ๊ธฐํšŒ๋ฅผ ํ†ตํ•ด ๋‚˜๋ฆ„๋Œ€๋กœ์˜ ๋„์ปค์˜ ํƒ„ํƒ„ํ•œ ๊ธฐ์ดˆ๋ฅผ ์Œ“์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ œ ๋‹ค์Œ ์ฑ•ํ„ฐ๋ถ€ํ„ฐ๋Š” ๋Œ€๋ง์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์ด๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๋ฐฐ์šด ๋„์ปค ์Šค์›œ์˜ ์—ญํ• ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ˜„์žฌ ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํˆด๋กœ์„œ์˜ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์— ๋Œ€ํ•ด์„œ๋„ ๊ธฐ์ดˆ๋ถ€ํ„ฐ ํƒ„ํƒ„ํžˆ ๋ฐฐ์›Œ๋ณด๋„๋ก ํ•˜์ž!

 

๋ฐ˜์‘ํ˜•