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

Container/Docker

[Docker] ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ์˜ ๋„์ปค๋ฅผ ๊ด€๋ฆฌํ•˜์ž, Docker Swarm

๋ฐ˜์‘ํ˜•

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

 

Docker


์ €๋ฒˆ ํฌ์ŠคํŒ…๊นŒ์ง€๋Š” ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ ์•ˆ์—์„œ์˜ ๋„์ปค ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ด์ œ ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ ์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ˜ธ์ŠคํŠธ ๋จธ์‹ ๋“ค ๊ฐ๊ฐ์— ์„ค์น˜๋˜์–ด ์žˆ๋Š” ๋„์ปค ์—”์ง„๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ ๋„์ปค ์Šค์›œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

1. ์™œ ๋„์ปค ์Šค์›œ์„ ์“ธ๊นŒ?

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

 

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ€์žฅ ์‹ฌํ”Œํ•œ ๋ฐฉ๋ฒ•์€ ๋งค์šฐ ์„ฑ๋Šฅ์ด ์ข‹์€ ์„œ๋ฒ„๋ฅผ ์‚ฌ๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ฌด๋ฆฌ ์ข‹์€ ์„ฑ๋Šฅ์˜ ์„œ๋ฒ„๋ฅผ ์‚ฐ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๊ทธ ์„œ๋ฒ„์˜ ์„ฑ๋Šฅ์„ 100% ํ™œ์šฉํ•˜๊ธฐ์—๋Š” ํž˜๋“ค ๊ฒƒ์ด๋‹ค. ๋ถ„๋ช… ๋‚จ์•„์„œ ๋†€๊ณ  ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋„ ์กด์žฌํ•  ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ™•์žฅ์„ฑ ์ธก๋ฉด์ด๋‚˜ ์„œ๋ฒ„ ์œ ์ง€ ๋น„์šฉ ์ธก๋ฉด์—์„œ๋„ ์ด๋Ÿฐ ํ•ด๊ฒฐ๋ฒ•์€ ํ•ฉ๋ฆฌ์ ์ด์ง€ ๋ชปํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์š”์ฆ˜ ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๋ฅผ ํด๋Ÿฌ์Šคํ„ฐ๋กœ ๋งŒ๋“ค์–ด์„œ ์ž์›์„ ๋ณ‘๋ ฌ๋กœ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ๊ฐ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 4GB์ธ ๋ฌผ๋ฆฌ ๋จธ์‹  3๋Œ€๋ฅผ ์„œ๋ฒ„๋กœ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์ด ๊ฐ€์šฉ ๋ฉ”๋ชจ๋ฆฌ๋Š” 12GB์ด๋‹ค. ํ”„๋กœ๋•์…˜์œผ๋กœ ์šด์˜ํ•˜๋˜ ์ค‘ ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•ด ๋˜ 4GB ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ์„œ๋ฒ„ 1๋Œ€๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ฆ์„คํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์ƒ๊ฒผ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ๋•Œ, ์ด๋ฏธ ๊ฐ–๊ณ  ์žˆ๋Š” 3๋Œ€์˜ ์„œ๋ฒ„์— ๋ณ‘๋ ฌ์ ์œผ๋กœ 1๋Œ€์˜ ์„œ๋ฒ„๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ์–ด ์ผ์ข…์˜ ์ž์›(๋ฆฌ์†Œ์Šค) Pool์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

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

 

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

2. ๋„์ปค ์Šค์›œ ๋ชจ๋“œ

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

 

$ docker info | grep -E "Swarm"

 

 

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

3. ๋„์ปค ์Šค์›œ ๋ชจ๋“œ์˜ ๊ตฌ์กฐ

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

 

์Šค์›œ์€ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์™€ ์›Œ์ปค ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ

 

์šฐ์„  ์œ„ ๊ทธ๋ฆผ์—์„œ VM ์•„์ด์ฝ˜์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” ๋ฌผ๋ฆฌ ๋จธ์‹ ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ๋งค๋‹ˆ์ € ๋…ธ๋“œ1์— ๋ฌผ๋ฆฌ ๋จธ์‹  1๋Œ€, ์›Œ์ปค ๋…ธ๋“œ 1~3์— ๋ฌผ๋ฆฌ ๋จธ์‹  3๋Œ€, ์ด ๋ฌผ๋ฆฌ ๋จธ์‹ ์ด 4๋Œ€๊ฐ€ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์›Œ์ปค ๋…ธ๋“œ๋“ค ์•ˆ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ์•„์ด์ฝ˜๋“ค์€ ์›Œ์ปค ๋…ธ๋“œ ์•ˆ์—์„œ ์‹ค์ œ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์˜๋ฏธํ•œ๋‹ค. ์œ„ ์‚ฌ์ง„์—์„œ๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ๊ฐ€ 1๊ฐœ ์ด์ง€๋งŒ, ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋ฅผ N๊ฐœ๋ฅผ ๋‘์–ด ๋‹ค์ค‘ํ™”๋ฅผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ๋งค๋‹ˆ์ €์˜ ๋ถ€ํ•˜๋ฅผ ๋ถ„์‚ฐ์‹œํ‚ค๊ณ , ํ˜น์—ฌ๋‚˜ ํŠน์ • ๋งค๋‹ˆ์ € ๋…ธ๋“œ๊ฐ€ ๋‹ค์šด๋˜์—ˆ๋‹ค๊ณ  ํ•œ๋“ค ๋‹ค๋ฅธ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์œผ๋กœ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

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

 

์ฐธ๊ณ ๋กœ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋Š” 2๊ฐ€์ง€๋กœ ๋” ๋ถ„๋ฅ˜๋˜๋Š”๋ฐ, ์ผ๋ฐ˜์ ์ธ ๋งค๋‹ˆ์ € ์—ญํ• ์„ ํ•˜๋Š” ๋…ธ๋“œ์™€ ๋ฆฌ๋” ์—ญํ• ์„ ํ•˜๋Š” ๋…ธ๋“œ๋กœ ๋‚˜๋‰œ๋‹ค. ๋ฆฌ๋” ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋Š” ๋ชจ๋“  ๋งค๋‹ˆ์ € ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”์™€ ๊ด€๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋ฏ€๋กœ ํ•ญ์ƒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋ฆฌ๋” ๋งค๋‹ˆ์ € ๋…ธ๋“œ์˜ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๊ฑฐ๋‚˜ ์žฅ์• ๊ฐ€ ์ƒ๊ธฐ๋ฉด ๋‚˜๋จธ์ง€์˜ ์ผ๋ฐ˜์ ์ธ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋“ค ์ค‘์—์„œ ๋ฆฌ๋” ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์„ ์ถœํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๋•Œ๋Š” Raft Consensus ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ™œ์šฉํ•ด ์„ ์ถœํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด์„œ๋Š” ํ•ด๋‹น ์ฑ…์—์„œ ๊นŠ๊ฒŒ ๋‹ค๋ฃจ์ง€๋Š” ์•Š๋Š”๋‹ค.

4. ์Šค์›œ ๋ชจ๋“œ์˜ ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ ๊ตฌ์ถ•

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋„์ปค ์Šค์›œ ๋ชจ๋“œ์—์„œ ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ˜ธ์ŠคํŠธ์—์„œ ๋„์ปค ์—”์ง„์„ ํ™œ์šฉํ•ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž. ์šฐ์„  ๋ฌผ๋ฆฌ ๋จธ์‹  3๋Œ€๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์€ Hostname ๊ณผ IP ์ฃผ์†Œ๋กœ ์‚ฌ์šฉํ•˜์˜€๋‹ค. ๋ฌผ๋ฆฌ ๋จธ์‹  3๋Œ€๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” VM์„ 3๋Œ€ ์„ค์น˜ํ•˜์—ฌ๋„ ์ข‹๊ณ , ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜์—ฌ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.(์ฐธ๊ณ ๋กœ IP ์ฃผ์†Œ๋Š” ์›๋ณธ๊ณผ ๋‹ค๋ฅธ ์ž„์˜์˜ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•˜์˜€๋‹ค) ๋˜ํ•œ ์‚ฌ์šฉํ•˜๋Š” ๋จธ์‹  3๋Œ€์—๋Š” ๋ชจ๋‘ ๋ฐ˜๋“œ์‹œ docker๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.

 

HOSTNAME       IP Address
swarm-manager  123.456.789.12
swarm-worker1  123.456.789.13
swarm-worker2  123.456.789.14

 

์œ„ ํ™˜๊ฒฝ์ด ๋งˆ๋ จ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , ๊ฐ€์žฅ ๋จผ์ € ํ•  ์ผ์€ ๋งค๋‹ˆ์ € ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ฒ„ ์ฆ‰, HOSTNAME์ด swarm-manager์ธ ๋จธ์‹ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์„ฑ(์‹œ์ž‘) ํ•ด์ค€๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด ํ˜•์‹์„ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค. ์ฐธ๊ณ ๋กœ --advertise-addr ์˜ต์…˜์—๋Š” ๋‹ค๋ฅธ ๋„์ปค ์„œ๋ฒ„(๋˜ ๋‹ค๋ฅธ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์ด๊ฑฐ๋‚˜ ์›Œ์ปค ๋…ธ๋“œ)๊ฐ€ ํ•ด๋‹น ๋งค๋‹ˆ์ € ๋…ธ๋“œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งค๋‹ˆ์ € ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ๋ฅผ ๋ช…์‹œํ•ด์ค€๋‹ค.

 

$ docker swarm init --advertise-addr 123.456.789.12

 

 

์œ„ ๋ช…๋ น์–ด๊ฐ€ ์ž˜ ๋™์ž‘ํ–ˆ๋‹ค๋ฉด ์œ„์™€ ๊ฐ™์€ ์ถœ๋ ฅํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚  ๊ฒƒ์ด๋‹ค. ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ 2๊ฐ€์ง€์ด๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์‚ฌ์ง„์˜ ๋งจ ์˜ค๋ฅธ์ชฝ ๋์— IP ์ฃผ์†Œ์— 2377๋ฒˆ์ด๋ผ๋Š” ํฌํŠธ๋ฒˆํ˜ธ๊ฐ€ ๊ฐœ๋ฐฉ๋˜์—ˆ์Œ์— ์ฃผ๋ชฉํ•˜์ž. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์˜ IP ์ฃผ์†Œ์˜ 2377๋ฒˆ ํฌํŠธ๋ฒˆํ˜ธ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์›Œ์ปค ๋…ธ๋“œ ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉํ•  ํ† ํฐ์ด๋‹ค. ์ด ํ† ํฐ์„ ํ™œ์šฉํ•ด์•ผ๋งŒ ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํ† ํฐ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น์–ด๋„ ์žˆ๋Š”๋ฐ, ์ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker swarm join-token worker

 

๋งค๋‹ˆ์ € ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์•˜์œผ๋‹ˆ, ์ด์ œ ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•ด๋ณด์ž. HOSTNAME์ด swarm-worker1์ธ ๋จธ์‹ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด๋ณด์ž.

 

$ docker swarm join \
--token [YOUR TOKEN] \
123.456.789:2377

 

์œ„ ๋ช…๋ น์–ด๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋™์ž‘ํ–ˆ๋‹ค๋ฉด ํ„ฐ๋ฏธ๋„์˜ ํ‘œ์ค€์ถœ๋ ฅ์— "This node joined a swarm as a worker." ์ด๋ผ๋Š” ๋ฌธ์žฅ์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚œ ๋’ค swarm-manager ๋จธ์‹ ์œผ๋กœ ๋Œ์•„๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์ถ”๊ฐ€๋œ ๋…ธ๋“œ๊ฐ€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด๋ณด์ž.

 

$ docker node ls

 

 

์œ„ ํ™”๋ฉด์„ ๋ณด๋ฉด swarm-worker1 ์ด๋ผ๋Š” ์›Œ์ปค ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜ ์ƒ๊ฒผ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฉ๊ธˆํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ swarm-worker2 ๋ผ๋Š” ์›Œ์ปค ๋…ธ๋“œ๋„ ๊ฐ™์ด ์ถ”๊ฐ€ํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

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

 

$ docker swarm join-token manager

 

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

 

$ docker swarm join-token --rotate manager

 

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

 

$ docker swarm leave

 

leave ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ•ด๋‹น ์›Œ์ปค ๋…ธ๋“œ๋Š” ์Šค์›œ ๋ชจ๋“œ๋ฅผ ํ•ด์ œํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋Š” ์ด ์›Œ์ปค ๋…ธ๋“œ๋ฅผ Down์ด๋ผ๋Š” ์ƒํƒœ๋กœ ์ธ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ๋กœ ํ•ด๋‹น ์›Œ์ปค ๋…ธ๋“œ๊ฐ€ ์Šค์›œ ๋ชจ๋“œ๋ฅผ ํ•ด์ œํ•˜๊ธฐ ์ „/ํ›„์˜ ๋งค๋‹ˆ์ € ๋…ธ๋“œ ํ™”๋ฉด์„ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

ํ•˜์ง€๋งŒ ์œ„์ฒ˜๋Ÿผ Down ์ด๋ผ๋Š” ์ƒํƒœ๊ฐ€ ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ์œ„ ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ๋œ ์ดํ›„, ๋ฐ˜๋“œ์‹œ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ ํ•ด๋‹น ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์‚ญ์ œ ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker node rm swarm-worker1

 

์ฆ‰, ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์‹ค์งˆ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  1. ์‚ญ์ œํ•  ์›Œ์ปค ๋…ธ๋“œ ๋จธ์‹ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์Šค์›œ ๋ชจ๋“œ ํ•ด์ œ
  2. ๋งค๋‹ˆ์ € ๋…ธ๋“œ ๋จธ์‹ ์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€ ์‚ญ์ œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์‚ญ์ œ

๋งค๋‹ˆ์ € ๋…ธ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ ๋จธ์‹ ์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

$ docker swarm leave --force

 

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

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋ฐ˜๋Œ€๋กœ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋ฅผ ์›Œ์ปค ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๋จผ์ € ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker node promote swarm-worker1

 

๊ทธ๋ฆฌ๊ณ  ๋ฐ˜๋Œ€๋กœ ๋งค๋‹ˆ์ € ๋…ธ๋“œ๋ฅผ ์›Œ์ปค ๋…ธ๋“œ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker node demote swarm-worker1

 

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

5. ์Šค์›œ ๋ชจ๋“œ ์„œ๋น„์Šค

์Šค์›œ ๋ชจ๋“œ๋ฅผ ๋ฐฐ์šฐ๊ธฐ ์ด์ „๊นŒ์ง€์—์„œ์˜ ๋„์ปค ๋ช…๋ น์–ด์˜ ์ œ์–ด ๋‹จ์œ„๋Š” ์ปจํ…Œ์ด๋„ˆ์˜€๋‹ค. ์ฆ‰, ๋„์ปค ํด๋ผ์ด์–ธํŠธ๋ฅผ ํ™œ์šฉํ•ด์„œ, ์˜ˆ๋ฅผ ๋“ค์–ด, docker run, docker rm ๋“ฑ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค์˜ ์ œ์–ด ๋‹จ์œ„๋Š” ์ปจํ…Œ์ด๋„ˆ์˜€๋‹ค. ํ•˜์ง€๋งŒ ๋„์ปค ์Šค์›œ์—์„œ์˜ ์ œ์–ด ๋‹จ์œ„๋Š” ์„œ๋น„์Šค(Service)์ด๋‹ค. ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด๊ธฐ ์ „์— ์ด์™€ ๊ด€๋ จ๋œ ๊ฐœ๋…์ธ ์„œ๋น„์Šค, ํƒœ์Šคํฌ, ๋ ˆํ”Œ๋ฆฌ์นด์™€ ๊ฐ™์€ ์šฉ์–ด์˜ ๊ฐœ๋…์ด ๋ฌด์—‡์ธ์ง€ ์ˆ™์ง€ํ•˜๊ณ  ๋„˜์–ด๊ฐ€๋ณด๋„๋ก ํ•˜์ž. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.

 

์„œ๋น„์Šค, ํƒœ์Šคํฌ, ๋ ˆํ”Œ๋ฆฌ์นด์˜ ๊ฐœ๋…

 

๋จผ์ € ์„œ๋น„์Šค(Service)๋Š” ๊ฐ™์€ ์ด๋ฏธ์ง€๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋œ 1๊ฐœ ์ด์ƒ์˜ ์ปจํ…Œ์ด๋„ˆ ์ง‘ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋น„์Šค๋ฅผ ์ œ์–ดํ•˜๋ฉด ๊ฐ™์€ ์„œ๋น„์Šค ๋‚ด์˜ ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋“ค์— ๊ฐ™์€ ๋ช…๋ น์ด ์ˆ˜ํ–‰๋œ๋‹ค. ์ดํ›„ ์Šค์›œ ์Šค์ผ€์ฅด๋Ÿฌ๊ฐ€ ์„œ๋น„์Šค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์•Œ์•„์„œ ์›Œ์ปค ๋…ธ๋“œ ๋˜๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜์—ฌ ํ• ๋‹นํ•ด์ค€๋‹ค. ์ด ๋•Œ ํ…Œ์Šคํฌ์™€ ๋ ˆํ”Œ๋ฆฌ์นด์˜ ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค. ๋จผ์ € ๊ฐ ๋…ธ๋“œ์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค ๋ชจ๋‘๋ฅผ ๊ฐ€๋ฆฌ์ผœ ํƒœ์Šคํฌ(Task)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ํƒœ์Šคํฌ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ํ•˜๋‚˜๋ฅผ ๋ ˆํ”Œ๋ฆฌ์นด(Replica) ํ•˜๋‚˜๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„์˜ ์„œ๋น„์Šค์—์„œ๋Š” ์„œ๋น„์Šค ๋ ˆํ”Œ๋ฆฌ์นด์…‹์ด ์ด 4๊ฐœ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

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

 

Container3 ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์šด๋˜๊ฑฐ๋‚˜ ๋™์ž‘์ด ๋ฉˆ์ท„์„ ๊ฒฝ์šฐ

 

์„œ๋น„์Šค๋Š” ๋กค๋ง ์—…๋ฐ์ดํŠธ(Rolling Update) ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ž€, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„, ์ปจํ…Œ์ด๋„ˆ ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ์˜ ์„ค์ •์ด๋‚˜ ๋ฐ์ดํ„ฐ ๋“ฑ์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„œ๋ฒ„ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ 1๊ฐœ์”ฉ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์˜ ๋‹ค์šด ์‹œ๊ฐ„์ด ์ƒ๊ธฐ์ง€ ์•Š๊ณ  ์ง€์†์ ์ธ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฌผ๋ก  ์žฌ์‹œ์ž‘ํ•˜๋Š” ์„œ๋ฒ„, ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋ž˜ํ”ฝ์ด ๋‚˜๋จธ์ง€ ์„œ๋ฒ„, ํด๋Ÿฌ์Šคํ„ฐ์— ๋ชฐ๋ฆฌ๊ธด ํ•˜๊ฒ ์ง€๋งŒ, ํ•œ ๋ฒˆ์— ์žฌ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” ํ›จ์”ฌ ๋” ํ•ฉ๋ฆฌ์ ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ๋„ ์•Œ์•„๋ณด์•˜์œผ๋‹ˆ, ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž.

5-1. ์„œ๋น„์Šค ์ƒ์„ฑ

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

 

$ docker service create [OPTIONS] IMAGE [COMMAND]

 

์ƒ์„ฑํ•  ์„œ๋น„์Šค์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ํฌ๊ทธ๋ผ์šด๋“œ ์žก์œผ๋กœ ๊ณ„์† ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š” ์ƒํƒœ์—ฌ์•ผ ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋งค๋‹ˆ์ € ๋…ธ๋“œ์ž…์žฅ์—์„œ๋Š” ์„œ๋น„์Šค์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ฐ˜๋“œ์‹œ detached ๋ชจ๋“œ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์œ„ ๋ช…๋ น์–ด ํ˜•์‹์˜ COMMAND ๋ถ€๋ถ„์—๋Š” ์ธ์ž๋กœ ์ค€ IMAGE๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ํ›„ ์ฆ‰์‹œ ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ด์ค€๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜ ์˜ˆ์‹œ ๋ช…๋ น์–ด์—์„œ๋Š” ๋ฌดํ•œ๋ฃจํ”„๋กœ "Hello zedd"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ํ–ˆ๋‹ค. 

 

$ docker service create \
ubuntu:14.04 \
/bin/sh -c "while true; do echo Hello zedd; sleep 1; done"

 

์„œ๋น„์Šค๊ฐ€ ์ž˜ ์ƒ์„ฑ์ด ๋˜์—ˆ๋‹ค๋ฉด ์•„๋ž˜ ์ถœ๋ ฅํ™”๋ฉด ์ฒ˜๋Ÿผ ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ํ•„์ž๋Š” ์ƒ์„ฑํ•œ ์„œ๋น„์Šค ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๊ธฐ๋„ ํ•˜์˜€๋‹ค. ์•„๋ž˜ ํ™”๋ฉด์—์„œ์˜ REPLICAS๋Š” ๋ฐฉ๊ธˆ ์œ„ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑํ•œ ๋ ˆํ”Œ๋ฆฌ์นด ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ์˜ ์ˆซ์ž๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

์„œ๋น„์Šค์™€ ๊ด€๋ จ๋œ ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ๋ณดํ†ต ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ์–ดํ•  ๋•Œ ์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด์™€ ๋น„์Šทํ•˜๋‹ค. 

 

๋ช…๋ น์–ด ์˜๋ฏธ ํŠน์ง•
docker service ls ์ƒ์„ฑํ•œ ์„œ๋น„์Šค์˜ ์ •๋ณด๋“ค์„ ์ถœ๋ ฅ  
docker service ps [SERVICE] ๋ช…์‹œํ•œ ์„œ๋น„์Šค์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ  
docker service rm [SERVICE] ๋ช…์‹œํ•œ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œ ์ปจํ…Œ์ด๋„ˆ ๋•Œ์™€๋Š” ๋‹ฌ๋ฆฌ ์„œ๋น„์Šค๋Š” ํ•ด๋‹น ์„œ๋น„์Šค์˜ ์ƒํƒœ(๋™์ž‘ ์ค‘์ด๋˜ ๋ง๋˜..)์— ์ƒ๊ด€์—†์ด ๋ฐ”๋กœ ์‚ญ์ œ ๊ฐ€๋Šฅ
docker service scale [SERVICE]=[์ˆซ์ž] ๋ช…์‹œํ•œ ์„œ๋น„์Šค์˜ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๋ฅผ [์ˆซ์ž]๋งŒํผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ค„์ž„  
docker service create --with-registry-with-auth ์˜ต์…˜ ์‚ฌ์šฉ ์„œ๋น„์Šค ์ƒ์„ฑ์„ ์œ„ํ•œ ๊ธฐ๋ฐ˜ ์ด๋ฏธ์ง€๋ฅผ ๊นƒํ—™๊ณผ ๊ฐ™์€ Private ์ €์žฅ์†Œ ๋˜๋Š” ์‚ฌ์„ค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ๋ฐ›์•„์˜ฌ ๊ฒฝ์šฐ, ๋กœ๊ทธ์ธ ์ธ์ฆํ•˜๋Š” ์˜ต์…˜ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ ํ•ด๋‹น ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด ์„œ๋น„์Šค ์ƒ์„ฑํ•˜๋ฉด ์›Œ์ปค ๋…ธ๋“œ์—์„œ๋Š” ๊ทธ ์ด๋ฏธ์ง€๊ฐ€ ์žˆ๋Š” ์ €์žฅ์†Œ ๋˜๋Š” ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ๋ณ„๋„๋กœ ๋กœ๊ทธ์ธ ํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š์•„๋„ ๋จ

 

์œ„์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ์…ธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด์•˜๋‹ค. ์ด๋ฒˆ์—” Nginx ๋ผ๋Š” ์›น ์„œ๋ฒ„ ์„œ๋น„์Šค๋ฅผ ์„œ๋น„์Šค๋กœ ์ƒ์„ฑํ•ด๋ณด๋Š” ์‹ค์Šต์„ ํ•ด๋ณด์ž. ์šฐ์„  ๋ช…๋ น์–ด๋ถ€ํ„ฐ ์‚ดํŽด๋ณด์ž.

 

$ docker service create \
--name zeddweb
--replicas 2 \
-p 80:80 \
nginx

 

์ด๋ฒˆ ์‹ค์Šต์—์„œ ์ƒ์„ฑํ•  ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ ๊ฐœ์ˆ˜๋Š” 2๊ฐœ๋กœ ์„ค์ •ํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋  ์ปจํ…Œ์ด๋„ˆ๋“ค๋กœ ์™ธ๋ถ€์—์„œ ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด -p ์˜ต์…˜์„ ์ฃผ์–ด ํฌํŠธํฌ์›Œ๋”ฉ์„ ์ˆ˜ํ–‰ํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑํ•œ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ƒ์„ธ ์ •๋ณด ์ถœ๋ ฅ์„ ๋ณด์ž.

 

 

zeddweb ์ด๋ผ๋Š” ์„œ๋น„์Šค๋Š” ์ด 2๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ๊ณ , ๊ทธ ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ์ด๋ฆ„์€ ๊ฐ๊ฐ zeddweb.1 ๊ณผ zeddweb.2 ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  NODE ํ•ญ๋ชฉ์„ ์‚ดํŽด๋ณด๋ฉด, ์ด ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๊ฐ๊ฐ swarm-worker1, swarm-worker2 ๋ผ๋Š” ๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์‹ค์ œ๋กœ ์›Œ์ปค ๋…ธ๋“œ ๋จธ์‹ ์œผ๋กœ ๋“ค์–ด๊ฐ€ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋ฅผ ์ œ์–ดํ•˜๋Š” ๋ช…๋ น์–ด์ธ docker ps ๋ช…๋ น์–ด๋ฅผ ๊ฐ๊ฐ ์ณ๋ณด๋ฉด ์Šค์›œ์—์„œ ํ• ๋‹นํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰์ค‘์ธ(Up) ์ƒํƒœ์ž„์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์›Œ์ปค ๋…ธ๋“œ ๋จธ์‹ ์— ๊ฐ๊ฐ ๋“ค์–ด๊ฐ€ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณธ ํ™”๋ฉด

 

๋ฐฉ๊ธˆ ์œ„์—์„œ 2๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ ์›Œ์ปค๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ์Œ์„ ์•Œ์•˜๋‹ค. swarm-manager์ธ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—๋Š” ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ๋Š” ์ƒ์„ฑํ•œ ๋ ˆํ”Œ๋ฆฌ์นด ์ผ„ํ…Œ์ด๋„ˆ ์ฆ‰, Nginx ์›น ์„œ๋ฒ„๋กœ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ• ๊นŒ? ์•„๋‹ˆ๋‹ค. -p ์˜ต์…˜์„ ํ†ตํ•œ ํฌํŠธ๋ฒˆํ˜ธ ๊ฐœ๋ฐฉ์€ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ• ๋‹น๋œ ๋…ธ๋“œ์ธ์ง€ ์•„๋‹Œ์ง€์— ์ƒ๊ด€์—†์ด ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋Š” ํ•ด๋‹น ํฌํŠธ๋ฒˆํ˜ธ๋กœ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์œ„ ๋ช…๋ น์–ด์—์„œ ์‚ฌ์šฉํ•œ -p 80:80 ์ด๋ผ๋Š” ์˜ต์…˜์—์„œ์˜ ์•ž์˜ 80 ์ˆซ์ž๋Š” ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ฒ„ ์ž์ฒด ํฌํŠธ๋ฅผ ๊ฐœ๋ฐฉํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. 

 

$ docker service create \
--replicas 2 \
-p [์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด PORT]:[์ƒ์„ฑํ•  ์ปจํ…Œ์ด๋„ˆ PORT] \
[IMAGE]

 

์‹ค์ œ๋กœ, ์•„๋ž˜ ์‚ฌ์ง„์€ ์›Œ์ปค ๋…ธ๋“œ 2๊ฐœ, ๋งค๋‹ˆ์ € ๋…ธ๋“œ 1๊ฐœ์—์„œ ๋ชจ๋‘ Nginx ์›น ์„œ๋ฒ„๋กœ curl ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ๊ณ , ์ •์ƒ์ ์ธ HTTP status code์ธ 200์ด ๋ฐ˜ํ™˜๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

 

 

๋‹ค์Œ์œผ๋กœ, ์œ„์—์„œ ์„ค์ •ํ•œ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ฅผ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ์ฆ๊ฐ€์‹œ์ผœ๋ณด์ž. ์‚ฌ์šฉํ•˜๋Š” ๋ช…๋ น์–ด๋Š” docker service scale ๋ช…๋ น์–ด์ด๋‹ค.

 

$ docker service scale zeddweb=4

 

 

๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ 4๊ฐœ๋กœ scale ํ–ˆ๋”๋‹ˆ 2๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ถ”๊ฐ€๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. ์œ„ ํ™”๋ฉด์„ ๋ณด๋ฉด ์ถ”๊ฐ€๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค 2๊ฐœ ์ค‘ ํ•˜๋‚˜๋Š” swarm-manager๋ผ๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—, ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” swarm-worker1 ๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•œ ๊ฐ€์ง€ ์ƒ๊ฐํ•ด๋ณผ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ์œ„ ํ™”๋ฉด ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค๋ฉด Nginx ์›น ์„œ๋ฒ„ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ swarm-worker1 ์—๋Š” 2๊ฐœ๊ฐ€ ์ž๋ฆฌ์žก๊ณ  ์žˆ๊ณ , ์ด 2๊ฐœ์˜ ์ปจํ…Œ์•„๋„ˆ ๋ชจ๋‘ 80/tcp ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. swarm-worker1 ๋…ธ๋“œ ์„œ๋ฒ„์˜ 80/tcp ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ 2๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ• ํ…๋ฐ.. ์–ด๋–ป๊ฒŒ ๊ฐ€๋Šฅํ•œ ๊ฑธ๊นŒ?

 

์œ„ ์ƒํ™ฉ์„ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด์ž. ํ˜„์žฌ swarm-worker1 ์ด๋ผ๋Š” ์›Œ์ปค ๋…ธ๋“œ์— ๋™์ผํ•œ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๊ฐœ๋ฐฉํ•œ Nginx ์ปจํ…Œ์ด๋„ˆ 2๊ฐœ๊ฐ€ ์žˆ๊ณ  swarm-worker2 ๋…ธ๋“œ์— 1๊ฐœ, swarm-manager ๋…ธ๋“œ์— 1๊ฐœ์˜ Nginx ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ๋‹ค. ์šด์˜์„ ํ•˜๋˜ ์ค‘ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ์˜ 80๋ฒˆ ํฌํŠธ๋กœ ํŠธ๋ž˜ํ”ฝ 1๊ฐœ ์š”์ฒญ์ด ๋“ค์–ด์™”๋‹ค. ์ด ๋•Œ, ๋“ค์–ด์˜จ ์š”์ฒญ 1๊ฐœ๋ฅผ 4๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ์ค‘ 1๊ฐœ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๊ฒŒ ๋œ๋‹ค.

 

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

 

๋‹ค์Œ์€ global(๊ธ€๋กœ๋ฒŒ) ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž. ์œ„์—์„œ ์†Œ๊ฐœํ•œ ๋„์ปค ์Šค์›œ ๊ฐœ๋… ์ค‘ ์„œ๋น„์Šค์˜ ์ข…๋ฅ˜๋กœ๋Š” 2๊ฐ€์ง€๊ฐ€ ์กด์žฌํ•œ๋‹ค. ํ•˜๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ง€๊ธˆ๊นŒ์ง€ Nginx ์‹ค์Šต์„ ํ•˜๋ฉด์„œ ์•Œ์•„๋ณธ ๋ณต์ œ ๋ชจ๋“œ(Replicated) ์„œ๋น„์Šค์ด๋‹ค. ๋‚˜๋จธ์ง€ ํ•˜๋‚˜๋Š” ๋ณดํ†ต ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š” global ์„œ๋น„์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. global ์„œ๋น„์Šค๋Š” ๋ณต์ œ ๋ชจ๋“œ์™€๋Š” ๋‹ฌ๋ฆฌ ํŠน์ดํ•˜๊ฒŒ ์‚ฌ์ „์— ์ƒ์„ฑํ•  ๋ ˆํ”Œ๋ฆฌ์นด ์…‹ ๊ฐœ์ˆ˜๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด global ์„œ๋น„์Šค๋Š” ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ์žˆ๋Š” ๋ชจ๋“  ๋…ธ๋“œ์— ๊ฐ๊ฐ ํ•œ๊ฐœ์”ฉ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. global ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋Š” --mode ๋ผ๋Š” ์˜ต์…˜์— global ํ‚ค์›Œ๋“œ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ๋ช…๋ น์–ด ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker service create \
--name global_zedd \
--mode global \
nginx

 

 

์ถœ๋ ฅํ™”๋ฉด์„ ๋ณด๋ฉด global_zedd ์ด๋ผ๋Š” ์ด๋ฆ„์˜ global ์„œ๋น„์Šค ๋‚ด์— ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด 3๊ฐœ ์ƒ๊ฒผ๊ณ , ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค 1๊ฐœ์”ฉ ์ƒ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ ๊ฐœ์ˆ˜๊ฐ€ 3๊ฐœ์ธ ์ด์œ ๋Š” ๋…ธ๋“œ๊ฐ€ ์ด 3๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ!

5-2. ์„œ๋น„์Šค ์žฅ์•  ๋ณต๊ตฌ

๋„์ปค ์Šค์›œ์€ ๋…ธ๋“œ ์„œ๋ฒ„๊ฐ€ ๋‹ค์šด๋˜๊ฑฐ๋‚˜ ๋…ธ๋“œ ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋™์ž‘์„ ๋ฉˆ์ถœ ์‹œ ์ž๋™์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์–ด ์žฅ์•  ๋ณต๊ตฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์ค€๋‹ค๊ณ  ํ–ˆ๋‹ค. ์ด๋ฒˆ์—” ์ด์— ๋Œ€ํ•ด์„œ ํ•œ๋ฒˆ ์‹ค์Šต์„ ํ•˜๋ฉด์„œ ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ธ์ง€ ์‚ดํŽด๋ณด์ž. ์šฐ์„  ํ˜„์žฌ ์ƒํ™ฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. zeddweb ์ด๋ผ๋Š” ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜ ์šด์˜ ์ค‘์ด๊ณ , ์ด ์„œ๋น„์Šค ๋‚ด์— ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

์œ„ ์ƒํ™ฉ์—์„œ swarm-worker1 ํ˜ธ์ŠคํŠธ๋กœ ๋“ค์–ด๊ฐ€ ์ปจํ…Œ์ด๋„ˆ zeddweb.1 ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•˜๋‚˜ ์‚ญ์ œ์‹œ์ผœ๋ณด์ž.

 

 

์œ„ ํ™”๋ฉด์„ ๋ณด์ž. ๋นจ๊ฐ„์ƒ‰ ๋„ค๋ชจ์นธ์ด ๋ฐ”๋กœ ๋ฐฉ๊ธˆ swarm-worker1 ๋…ธ๋“œ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ญ์ œํ•จ์œผ๋กœ์จ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด๋‹ค. swarm-manager ๋ผ๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ zeddweb.1 ์ด๋ผ๋Š” ๋™์ผํ•œ ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜๊ฐ€ ์žˆ๋‹ค.(๋ฌผ๋ก  ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„ ๋์˜ hash ๊ฐ’์€ ๋‹ฌ๋ผ์ ธ์„œ ์žฌ์ƒ์„ฑ๋จ) ๋”ฐ๋ผ์„œ, ์œ„์™€ ๊ฐ™์ด ์ปจํ…Œ์ด๋„ˆ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ๋„์ปค ์Šค์›œ์€ ์•Œ์•„์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ ๋™์ผํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด ๋ณต๊ตฌ์‹œํ‚ค๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด ์ด์ œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ ์„œ๋ฒ„๋ฅผ ๋‹ค์šด์‹œ์ผœ๋ณด๋„๋ก ํ•˜์ž. ํ˜„์žฌ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋…ธ๋“œ ์ƒํƒœ๊ฐ’์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. 

 

 

๊ทธ๋Ÿฌ๋ฉด ์ด๋ฒˆ์—” swarm-worker2 ํ˜ธ์ŠคํŠธ๋กœ ๋“ค์–ด๊ฐ€ ๋„์ปค ๋ฐ๋ชฌ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒ์‹œ์ผœ๋ณด๋„๋ก ํ•˜์ž. ๋„์ปค ๋ฐ๋ชฌ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ service docker stop && systemctl stop docker.socket

 

๋‹ค์‹œ ๋…ธ๋“œ ์ƒํƒœ๊ฐ’์„ ๋ด๋ณด์ž. swarm-worker2 ๋…ธ๋“œ์˜ STATUS ๊ฐ’์ด DOWN์œผ๋กœ ๋ณ€ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋ฆฌ๊ณ  ๋‚œ ๋’ค ์šด์˜์ค‘์ธ ์„œ๋น„์Šค์˜ ๋…ธ๋“œ ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

 

 

swarm-worker2 ๋…ธ๋“œ์˜ ๋„์ปค ๋ฐ๋ชฌ ์„œ๋ฒ„๋ฅผ ์ข…๋ฃŒ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ํ™”๋ฉด์—์„œ swarm-worker2 ๋…ธ๋“œ์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ข…๋ฃŒ๋˜์—ˆ๊ณ  ์ดํ›„, swarm-worker1 ๋…ธ๋“œ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ณต๊ตฌํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. 

 

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

 

๋งŒ์•ฝ ์žฌ๊ท ํ˜• ์ž‘์—…์„ ํ•ด์ฃผ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์‚ฌ๋žŒ์ด ์ง์ ‘ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, scale ๋ช…๋ น์–ด๋กœ ์ปจํ…Œ์ด๋„ˆ ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ๋‹ค์‹œ ๋Š˜๋ ค์ฃผ์–ด์•ผ ํ•œ๋‹ค.

5-3. ์„œ๋น„์Šค ๋กค๋ง ์—…๋ฐ์ดํŠธ

๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ๊ธฐ๋Šฅ์€ ์Šค์›œ ๋ชจ๋“œ์˜ ์„œ๋น„์Šค ๋กค๋ง ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์ด๋‹ค. ์Šค์›œ ๋ชจ๋“œ๋Š” ์ž์ฒด์ ์œผ๋กœ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ docker service update ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•ด ๊ธฐ์กด์— ์šด์˜์ค‘์ธ ์„œ๋น„์Šค์— ๋Œ€ํ•ด ๋กค๋ง ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. 

 

์‹ค์Šต ์˜ˆ์‹œ๋กœ, ์šฐ์„  ์ƒˆ๋กœ์šด ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ด๋ณด์ž. Nginx 1.10 ๋ฒ„์ „์˜ ์ด๋ฏธ์ง€๋ฅผ ๊ฐ€์ง€๊ณ  ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๋Š” 3๊ฐœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒ์„ฑํ•ด๋ณด์ž.

 

$ docker service create \
--name nginx_service \
--replicas 3 \
nginx:1.10

 

 

์œ„ ๋ช…๋ น์–ด๋กœ ๋งŒ๋“  ์ƒˆ๋กœ์šด ์„œ๋น„์Šค ๋‚ด์— ๊ฐ ๋…ธ๋“œ์— ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์œ„์™€ ๊ฐ™๋‹ค. ์ด์ œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์—…๋ฐ์ดํŠธํ•ด๋ณด์ž. ์—…๋ฐ์ดํŠธํ•  ์‚ฌํ•ญ์€ ๊ฐ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ์˜ Nginx ์ด๋ฏธ์ง€๋ฅผ 1.10 ๋ฒ„์ „์—์„œ 1.11 ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์ด๋‹ค.

 

$ docker service update \
--image nginx1.11 \
nginx_service

 

๊ทธ๋ฆฌ๊ณ  ๋‚œ ๋’ค ํ•ด๋‹น ์„œ๋น„์Šค ๋‚ด์— ๊ฐ ๋…ธ๋“œ์— ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐฑ์‹ ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

" \_ " ๋ผ๋Š” ๋ฌธ์ž์—ด์ด ์กด์žฌํ•˜๋Š”๋ฐ, ์ด ๋ฌธ์ž์—ด์ด ๋ถ™์–ด์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋Š” ๋™์ž‘์„ ๋ฉˆ์ถ˜ ์ปจํ…Œ์ด๋„ˆ๋กœ์„œ, ์„œ๋น„์Šค์—์„œ์˜ ์ปจํ…Œ์ด๋„ˆ ๋ณ€๊ฒฝ ๊ธฐ๋ก์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์œ„ ํ™”๋ฉด์„ ํ•ด์„ํ•˜๋ฉด ๊ฐ ์ปจํ…Œ์ด๋„ˆ ๋งˆ๋‹ค 1๋ฒˆ์”ฉ ๋ณ€๊ฒฝ์ด ๋œ ํ”์ ์ด ๋ณด์ด๊ณ , ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ Nginx ์ด๋ฏธ์ง€๊ฐ€ 1.10 ์—์„œ 1.11 ๋ฒ„์ „์œผ๋กœ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

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

 

๋ช…๋ น์–ด ์˜ต์…˜ ์˜๋ฏธ
docker service create  --update-delay 10s ๊ฐ ์ปจํ…Œ์ด๋„ˆ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ 10์ดˆ ๋‹จ์œ„๋กœ ์—…๋ฐ์ดํŠธ
--update-paralleism 2 ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰ ์‹œ 2๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ํ•œ ๋ฒˆ์— ์—…๋ฐ์ดํŠธ ์ง„ํ–‰
--update-failuer-action continue ์—…๋ฐ์ดํŠธ ์ˆ˜ํ–‰ ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ• ์ง€์— ๋Œ€ํ•œ ์•ก์…˜. 
๋””ํดํŠธ๋Š” pause๋กœ ์—…๋ฐ์ดํŠธ๋ฅผ ์ค‘์ง€ํ•˜๋Š” ์„ค์ •์ด์ง€๋งŒ continue๋กœ ์„ค์ • ์‹œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๊ณ„์† ๋‹ค์Œ ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ์„ค์ •

 

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๊ธฐ ์ „์œผ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๋กค๋ฐฑ(Rollback) ๊ธฐ๋Šฅ๋„ ์ œ๊ณตํ•œ๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด ํ˜•์‹์„ ์ด์šฉํ•ด ์ˆ˜ํ–‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ฐธ๊ณ ๋กœ ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋‚œ ๋’ค์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ตœ์ดˆ ๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๊ธฐ ์ „์˜ ์ปจํ…Œ์ด๋„ˆ์™€ ๋˜‘๊ฐ™์€ ID ๊ฐ’์„ ๊ฐ–๋Š” ๊ฒƒ์œผ๋กœ ๋ณต๊ตฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณ„๋„์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•˜์—ฌ ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

$ docker service rollback [SERVICE]

 

๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•œ ํ›„์˜ ์„œ๋น„์Šค ๋‚ด ๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ ์ •๋ณด ์ถœ๋ ฅ ํ™”๋ฉด

5-4. ์„œ๋น„์Šค ์ปจํ…Œ์ด๋„ˆ์— ์„ค์ • ์ •๋ณด๋ฅผ ์ „๋‹ฌ, secret๊ณผ config

์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์™ธ๋ถ€์— ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์šด์˜ํ•˜๋ ค๋ฉด ๊ฐ ์„œ๋ฒ„๋งˆ๋‹ค ์ ์ ˆํ•œ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ๋‹จ์ ์ธ ์˜ˆ๋กœ, ์„œ๋ฒ„๋งˆ๋‹ค ์–ด๋–ค ํ™˜๊ฒฝ์ธ์ง€(๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ธ์ง€, ์šด์˜ ํ™˜๊ฒฝ์ธ์ง€, ...)๋ฅผ ์˜๋ฏธํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’๋ถ€ํ„ฐ DB ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๊ทธ DB ์„œ๋ฒ„์˜ ๋ฃจํŠธ ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ๊ฐ’๊นŒ์ง€ ์—ฌ๋Ÿฌ ์„ค์ •๊ฐ’๋“ค์ด ์กด์žฌํ•œ๋‹ค.

 

์Šค์›œ์„ ๋ฐฐ์šฐ๊ธฐ ์ด์ „์˜ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋กœ ๋„์ปค๋ฅผ ์ œ์–ดํ•  ๋•Œ๋Š” -v ์˜ต์…˜์„ ํ™œ์šฉํ•œ ํ˜ธ์ŠคํŠธ ๋ณผ๋ฅจ ๊ณต์œ ๋ฅผ ํ†ตํ•ด ํŠน์ • ์„ค์ • ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ -e ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฐ’์„ ์„ค์ •ํ•˜๋Š” ๋“ฑ๊ณผ ๊ฐ™์ด ์ˆ˜ํ–‰ํ–ˆ์—ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์€ ์ปจํ…Œ์ด๋„ˆ 1๊ฐœ ๋งˆ๋‹ค ์„ค์ •์„ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์Šค์›œ ๋ชจ๋“œ์—์„œ ์ด์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋งค ์ปจํ…Œ์ด๋„ˆ ๋งˆ๋‹ค ์„ค์ •์„ ๋งค๋ฒˆ ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ท€์ฐฎ์Œ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋˜ํ•œ DB ์„œ๋ฒ„์˜ ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ๊ฐ’๋“ค์„ -e ์˜ต์…˜์— ์ ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ๋ณด์•ˆ ์ด์Šˆ๋„ ๋ฐœ์ƒํ•˜๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์ ๋“ค์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ SSH ํ‚ค์™€ ๊ฐ™์€ ๋ณด์•ˆ์— ๋ฏผ๊ฐํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•œ secret ๊ธฐ๋Šฅ์ด, ๋ณด์•ˆ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๋งŒํ•œ ๊ธฐํƒ€ ์„ค์ • ๊ฐ’๋“ค์„ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” config ๊ธฐ๋Šฅ์ด ๋„์ปค ์Šค์›œ์— ์กด์žฌํ•œ๋‹ค. ์ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์ฐธ๊ณ ๋กœ secret, config ๊ธฐ๋Šฅ์€ ์Šค์›œ ๋ชจ๋“œ์—์„œ๋งŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‹จ์ผ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋กœ ์ œ์–ดํ•  ๋•Œ(docker run ~ ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด ์‚ฌ์šฉ)๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

 

๋จผ์ € secret ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. secret์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker secret create [secret ์ด๋ฆ„] [๊ฐ’]

 

์•„๋ž˜์ฒ˜๋Ÿผ "1d2w3e4r" ์ด๋ผ๋Š” ํ…์ŠคํŠธ๋ฅผ secret์œผ๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒ์„ฑํ•ด๋ณด๊ณ  ์ƒ์„ฑํ•œ secret ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž.

 

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น secret์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๊ทธ๋Ÿฐ๋ฐ ์ƒ์„ฑํ•œ secret์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•˜๋”๋ผ๋„ ์œ„์—์„œ ์ƒ์„ฑํ•œ ๊ฐ’์ธ "1d2w3e4r"๋ฅผ ์–ด๋””์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜๊ฐ€ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด secret ๊ฐ’์€ ๋งค๋‹ˆ์ € ๋…ธ๋“œ ๊ฐ„์— ์•”ํ˜ธํ™”๋œ ์ƒํƒœ๋กœ ์ €์žฅ์ด ๋˜๋ฉฐ ์ปจํ…Œ์ด๋„ˆ์— secret ๊ฐ’์ด ์ ์šฉ๋˜์–ด ๋ฐฐํฌ๋˜์–ด๋„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์ด ์•„๋‹Œ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ž˜์„œ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ญ์ œ๋  ๊ฒฝ์šฐ secret๋„ ํ•จ๊ป˜ ์‚ญ์ œ๋˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ secret์ด ์ ์šฉ๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž. ์˜ˆ์‹œ๋Š” MySQL ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค. ์šฐ์„  ๋ช…๋ น์–ด๋ฅผ ์‚ดํŽด๋ณด์ž.

 

$ docker service create \
--name mysql \
--replicas 1 \
--secret source=mysql_pw,target=mysql_root_password \
--secret source=mysql_pw,target=mysql_password \
-e MYSQL_ROOT_PASSWORD_FILE="/run/secrets/mysql_root_password" \
-e MYSQL_PASSWORD_FILE="/run/secrets/mysql_password" \
-e MYSQL_DATABASE="wordpress" \
mysql:5.7

 

์œ„ ๋ช…๋ น์—์„œ ์ฃผ๋ชฉํ•  ๋ถ€๋ถ„์€ --secret ์˜ต์…˜๊ณผ ๊ทธ ์˜ต์…˜์— ๋ถ™์–ด ์žˆ๋Š” source, target ์ธ์ž์— ์žˆ๋Š” ๊ฐ’์ด๋‹ค. ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker service create --secret source=[secret ์ด๋ฆ„],target=[์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ณด์—ฌ์งˆ secret ์ด๋ฆ„]

 

--secret ์˜ต์…˜์€ source์— ์ง€์ •ํ•ด์ค€ secret ๊ฐ’์„, target์—๋Š” ์ง€์ •ํ•ด์ค€ ์ด๋ฆ„์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ๋งˆ์šดํŠธ ์‹œ์ผœ์ค€๋‹ค. ์ด ๋•Œ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ "/run/secrets/" ๋ผ๋Š” ์ง€์ •๋œ ๊ฒฝ๋กœ์— secret์„ ๋งˆ์šดํŠธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€ "/run/secrets/" ๋ผ๋Š” ๊ฒฝ๋กœ๋กœ ๋“ค์–ด๊ฐ€๋ณด๋ฉด target์—๋‹ค๊ฐ€ ์ง€์ •ํ•ด์ค€ ์ด๋ฆ„์˜ secret์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  secret์„ ๋งˆ์šดํŠธ ํ•ด์ค„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๊ฒฝ๋กœ๋Š” ์ ˆ๋Œ€๊ฒฝ๋กœ๋กœ target์—๋‹ค๊ฐ€ ์ง์ ‘ ์ž…๋ ฅํ•ด์ฃผ๋ฉด "/run/secrets/" ๊ฒฝ๋กœ๊ฐ€ ์•„๋‹Œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ž…๋ ฅํ•œ ๊ฒฝ๋กœ์—๋‹ค๊ฐ€ secret์„ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์ฐธ๊ณ ๋กœ ์ฝค๋งˆ(,)์™€ target ํ‚ค์›Œ๋“œ ์‚ฌ์ด์— ๊ณต๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚˜๋ฏ€๋กœ ๋ฐ˜๋“œ์‹œ ๋ถ™์—ฌ ์“ฐ๋Š” ๊ฑธ ์žŠ์ง€๋ง์ž. 

 

์ง€๊ธˆ๊นŒ์ง€ secret์„ ์•Œ์•„๋ณด์•˜๋‹ค. ์ด์ œ config์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ์œ„์—์„œ secret ์„ ์„œ๋น„์Šค์— ์ ์šฉํ•˜๋ฉด์„œ ์ž…๋ ฅํ•œ ๋ช…๋ น์–ด์— -e ์˜ต์…˜์„ ๋„ฃ์–ด ํŠน์ • ๊ฒฝ๋กœ๋ฅผ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ง€์ •ํ•ด์ฃผ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์œ„ ์˜ˆ์‹œ๋งŒ ํ•ด๋„ -e ์˜ต์…˜์„ 3๋ฒˆ์”ฉ ์จ๊ฐ€๋ฉฐ ์ผ์ผ์ด ์„ค์ •ํ•ด์ฃผ์—ˆ๋‹ค. ์„ค์ •ํ•ด์•ผ ํ•  ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์ด ์ ์  ๋งŽ์•„์ง€๋ฉด ํ—ท๊ฐˆ๋ฆฌ๊ฑฐ๋‚˜ ์˜คํƒ€๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด config๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค. config ์—ญํ• ์„ ํ•˜๋Š” ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘” ํŒŒ์ผ์— -e ์˜ต์…˜์— ๋„ฃ์–ด์ค„ ๊ฐ’๋“ค์„ ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋†“๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด config๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž. secret ์‚ฌ์šฉ ๋•Œ์™€ ๋งค์šฐ ๋น„์Šทํ•˜๋‹ค. ๋ช…๋ น์–ด ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

$ docker config create [config ์ด๋ฆ„] [๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” config ๊ด€๋ จ ํŒŒ์ผ]

 

์˜ˆ์‹œ์—์„œ ์ƒ์„ฑํ•  config ํŒŒ์ผ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

# config.yml
version: 0.1
log:
  level: info
storage:
  filesystem:
    rootdirectory: /registry_data
  delete:
    enabled: true
http:
  addr: 0.0.0.0:5000

 

์œ„ ํŒŒ์ผ๋กœ ํ•ด์„œ config๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ ํ›„, inspect ๋ช…๋ น์–ด๋กœ config์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์ž. secret ๋•Œ์™€๋Š” ๋‹ฌ๋ฆฌ Data ๋ผ๋Š” ํ•ญ๋ชฉ์— ๊ฐ’์ด ์ƒ๊ธด ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

Data ํ•ญ๋ชฉ์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์œ„์—์„œ ์ •์˜ํ•œ config.yml ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด๋ฉฐ ์œ„ ์ถœ๋ ฅํ™”๋ฉด์—์„œ๋Š” ํ˜„์žฌ base64 ์ธ์ฝ”๋”ฉ๋œ ์ƒํƒœ๋กœ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์„ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•ด์„œ ํ‘œ์ค€์ถœ๋ ฅ์„ ํ™•์ธํ•ด๋ณด์ž.

 

$ echo dmVyc2lvbjogMC4xCmxvZzoKICBsZXZlbDogaW5mbwpzdG9yYWdlOgogIGZpbGVzeXN0ZW06CiAgICByb290ZGlyZWN0b3J5OiAvcmVnaXN0cnlfZGF0YQogIGRlbGV0ZToKICAgIGVuYWJsZWQ6IHRydWUKaHR0cDoKICBhZGRyOiAwLjAuMC4wOjUwMDAK | base64 -d

 

์ƒ์„ฑํ•œ config๋ฅผ ์„œ๋น„์Šค์— ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ secret ๊ณผ ๋™์ผํ•˜๋‹ค. source ์™€ target ์ธ์ž์— ์ ์ ˆํ•œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. 

 

$ docker service create \
--name yml_registry \
-p 5000:5000 \
--config source=registry-config,target=/etc/docker/registry/config.yml \
registry:2.6

 

๋งŒ์•ฝ ์ด๋ฏธ ์„ค์ •ํ•œ secret, config ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•˜๋ ค๋ฉด --secret-add, --secret-rm, --config-rm, --config-add ์™€ ๊ฐ™์€ ์˜ต์…˜์„ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ์ฐธ๊ณ ๋กœ ์ด๋ฏธ ์„ค์ •ํ•œ secret, config ๊ฐ’์„ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹จ์ง€ ์ƒˆ๋กœ์šด secret, config ๊ฐ’์„ ์ถ”๊ฐ€ํ•œ ๋’ค ๊ธฐ์กด์˜ ๊ฐ’์„ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๊ต์ฒดํ•ด์•ผ ํ•œ๋‹ค. 

 

์ด๋ ‡๊ฒŒ secret, config๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ํ™˜๊ฒฝ์ด ๋ณ€๊ฒฝ๋จ์— ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ๋ฅผ ๋ณ„๋„๋กœ ํ•  ํ•„์š” ์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์šด์˜ ์ค‘์ธ ์ƒํƒœ์—์„œ ์„ค์ • ๊ฐ’๋งŒ ๋ฐ”๊พธ์–ด ์ฃผ๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋กค๋ง ์—…๋ฐ์ดํŠธ๋„ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์งˆ ๊ฒƒ์ด๊ณ  ์ด์— ๋”ฐ๋ผ ์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜๋Š” ์‹œ๊ฐ„ ์—†์ด๋„ ์šด์˜์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.

5-5. ๋„์ปค ์Šค์›œ ๋„คํŠธ์›Œํฌ

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

 

๊ธฐ๋ณธ์ ์œผ๋กœ ๋„์ปค ์Šค์›œ์˜ ๋„คํŠธ์›Œํฌ๋Š” ์ด์ „์— ๋ฐฐ์› ๋˜ ๋„์ปค ๋„คํŠธ์›Œํฌ๋ž‘ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋„์ปค ์Šค์›œ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์„œ๋ฒ„ ์ฆ‰, ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋„์ปค ์—”์ง„์— ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ถ„์‚ฐํ•˜์—ฌ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ๊ฐ์˜ ๋„์ปค ์—”์ง„์˜ ๋„์ปค ๋ฐ๋ชฌ์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ํ•˜๋‚˜๋กœ ๋ฌถ์ธ ๋„คํŠธ์›Œํฌ ํ’€(Pool)์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐฐํฌํ•œ ์„œ๋น„์Šค๋ฅผ ์™ธ๋ถ€๋กœ ๋…ธ์ถœํ–ˆ์„ ๋•Œ, ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ์–ด๋–ค ๋…ธ๋“œ๋กœ ์ ‘๊ทผํ•˜๋”๋ผ๋„ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ผ์šฐํŒ… ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค. ์ผ๋ก€๋กœ, ์œ„ ์˜ˆ์‹œ์—์„œ ์šฐ๋ฆฌ๋Š” ํŠน์ • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์›Œ์ปค ๋…ธ๋“œ์—๋งŒ ํ• ๋‹น๋˜์—ˆ๋”๋ผ๋„ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ ์‚ดํŽด๋ณธ ๊ฒƒ์ด ๋ฐ”๋กœ ๊ทธ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๋„์ปค ์Šค์›œ ๋ชจ๋“œ๋ฅผ ํ™œ์„ฑํ™”ํ•œ ์ƒํƒœ์—์„œ ๋„์ปค ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ฌด์—‡์ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

 

 

์œ„์—์„œ ์ฃผ๋ชฉํ•  ๋„คํŠธ์›Œํฌ๋Š” docker_gwbridge ์™€ ingress ๋ผ๋Š” ์ด๋ฆ„์˜ ๋„คํŠธ์›Œํฌ์ด๋‹ค. docker_gwbridge ๋„คํŠธ์›Œํฌ๋Š” ์Šค์›œ์—์„œ ์˜ค๋ฒ„๋ ˆ์ด(overlay) ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ์ด๋ฉฐ, ingress ๋„คํŠธ์›Œํฌ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ๊ณผ ๋ผ์šฐํŒ… ๋ฉ”์‹œ(Routing Mesh)์— ์‚ฌ์šฉ๋˜๋Š” ๋„คํŠธ์›Œํฌ์ด๋‹ค. ์ด์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์ดํ•ดํ•ด๋ณด์ž.

5-5-1. ์–ด๋–ค ๋…ธ๋“œ์—์„œ๋„ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์ž, ingress ๋„คํŠธ์›Œํฌ

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

 

 

์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ฒ„๊ฐ€ ์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•ด๋ณด์ž. ingress ๋„คํŠธ์›Œํฌ๋Š” ์–ด๋–ค ๋…ธ๋“œ์—์„œ๋„ ์–ด๋–ค ์ปจํ…Œ์ด๋„ˆ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•ด์ฃผ๋Š” ๋ผ์šฐํŒ… ๋ฉ”์‹œ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œ„ ๊ทธ๋ฆผ์—์„œ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์—์„œ๋Š” ingress ๋„คํŠธ์›Œํฌ ๋•๋ถ„์— Container 3,4,5 ์ด๋ฆ„์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์— ๋Œ€ํ•ด ์–ธ์ œ๋“ ์ง€ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ingress ๋„คํŠธ์›Œํฌ๋Š” ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์ ์ ˆํ•˜๊ฒŒ ์ปจํ…Œ์ด๋„ˆ๋“ค์— ๋Œ€ํ•ด ๋ถ„์‚ฐํ•˜๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ์„ ๋‹ด๋‹นํ•˜๊ธฐ๋„ ํ•œ๋‹ค.(์ด ๋•Œ, '์ ์ ˆํ•˜๊ฒŒ'๋ž€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ผ์šด๋“œ ๋กœ๋นˆ ๋ฐฉ์‹์œผ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ๋“ค๋กœ ๋ถ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฑ„ํƒํ•œ๋‹ค)

 

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ingress ๋„คํŠธ์›Œํฌ๋ฅผ ์‹ค์Šต์„ ํ†ตํ•ด์„œ ์•Œ์•„๋ณด์ž. ์ฑ… ์ €์ž๋ถ„์ด ์ด๋ฏธ ๋งŒ๋“ค์–ด๋‘์‹  ๋„์ปค ํ—ˆ๋ธŒ์˜ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ• ํ…๋ฐ, ํ•ด๋‹น ์ด๋ฏธ์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ์ฆ‰ ์ž„์˜๋กœ ํ• ๋‹น๋œ 16์ง„์ˆ˜๋ฅผ ํ• ๋‹นํ•˜๋Š” PHP ํŒŒ์ผ์ด ๋“ค์–ด์žˆ๋Š” ์›น์„œ๋ฒ„์ด๋‹ค. ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ 4๊ฐœ๋กœ ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž. ์ฐธ๊ณ ๋กœ ์Šค์›œ  ํด๋Ÿฌ์Šคํ„ฐ ์„œ๋ฒ„ ๋‚ด ๋…ธ๋“œ๋Š” ๋งค๋‹ˆ์ € ๋…ธ๋“œ 1๊ฐœ, ์›Œ์ปค ๋…ธ๋“œ 2๊ฐœ์ธ ์ƒํƒœ์ด๋‹ค.

 

$ docker service create \
--name zedd_hostname \
--replicas 4 \
-p 80:80 \
docker.io/alicek106/book:hostname

 

์œ„ ๋ช…๋ น์–ด๋กœ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค์˜ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์–ด๋–ค ๋…ธ๋“œ์— ํ• ๋‹น๋˜์—ˆ๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

 

 

์œ„ ํ™”๋ฉด์„ ๋ณด๋ฉด swarm-manager ๋ผ๋Š” ์ด๋ฆ„์˜ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์— 2๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€, ๊ทธ๋ฆฌ๊ณ  ์›Œ์ปค ๋…ธ๋“œ์— ๊ฐ๊ฐ 1๊ฐœ์”ฉ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ• ๋‹น๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์ด์ œ ๊ทธ๋Ÿฌ๋ฉด ingress ๋„คํŠธ์›Œํฌ์˜ ํšจ๊ณผ๋ฅผ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด์„œ ์ผ๋ถ€๋Ÿฌ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ ์ ‘๊ทผ์„ ํ•ด๋ณด์ž. ํ˜„์žฌ ์ƒํ™ฉ์—์„œ swarm-worker1 ์ด๋ผ๋Š” ๋…ธ๋“œ์—์„œ swarm-manager ๋…ธ๋“œ ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ 2๊ฐœ๋กœ curl ํ…Œ์ŠคํŠธ๋ฅผ ๋‚ ๋ ค๋ณด์ž. ์šฐ์„ , swarm-manger์— ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ๋“ค์˜ ์ •๋ณด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

 

์ด์ œ swarm-worker1 ์ด๋ฆ„์˜ ๋…ธ๋“œ๋กœ ์ด๋™ํ•ด์•ผ ํ•˜๋‹ˆ ํ•ด๋‹น ๋…ธ๋“œ๋กœ ์„ค์ •๋œ VM ํ„ฐ๋ฏธ๋„๋กœ ๋Œ์•„๊ฐ„ ๋’ค, curl ๋ช…๋ น์–ด๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณด์ž.

 

 

response๋กœ HTML ํŒŒ์ผ์ด ๋ฐ˜ํ™˜์ด ๋˜์—ˆ๊ณ , ํ•˜๋Š˜์ƒ‰ ๋„ค๋ชจ์นธ์„ ๋ณด๋ฉด ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ ๋ฐ˜ํ™˜๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ปจํ…Œ์ด๋„ˆ ID๋Š” ๋ฐ”๋กœ ์œ„์—์„œ ์‚ดํŽด๋ณธ swam-manager์— ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ ID ์ค‘ ํ•œ ๊ฐœ์ž„์„ ์•Œ ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ฒ˜์Œ curl ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ์„ ๋•Œ swarm-manger ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ํ• ๋‹น๋œ  ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” ingress ๋„คํŠธ์›Œํฌ์˜ ๋ถ€๊ฐ€์ ์ธ ํŠน์„ฑ์ธ ๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ธฐ๋Šฅ์œผ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ ‘๊ทผํ•˜๋„๋ก ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ช‡ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ curl ํ…Œ์ŠคํŠธ๋ฅผ ๋‚ ๋ฆฌ๋ฉด ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ swam-manager ๋…ธ๋“œ์— ํ• ๋‹น๋œ ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ response๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ํ˜„์ƒ์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ๋…ธ๋“œ์— ํ• ๋‹น๋œ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ํ• ๋‹น๋ฐ›๋Š” IP ์ฃผ์†Œ๋Š” ์–ด๋–ป๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์„๊นŒ? ํŠน์ดํ•œ ์ ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  IP ์ฃผ์†Œ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ํ• ๋‹น๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ ๊ณง ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์žˆ๋Š” ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์— ๋ณ„๋„์˜ ํฌํŠธํฌ์›Œ๋”ฉ์„ ์„ค์ •ํ•˜์ง€ ์•Š์•„๋„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ์ด๋‹ค. ์‹ค์ œ๋กœ, ํ•„์ž๊ฐ€ ์‹ค์Šต์„ ์ˆ˜ํ–‰ํ–ˆ์„ ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€๋‹ค.

 

์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ์ด์œ ๋Š” ingress ๋„คํŠธ์›Œํฌ๊ฐ€ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋„์ปค ์—”์ง„์— ์žˆ๋Š” ๋„์ปค ๋ฐ๋ชฌ์„ ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ ํ’€๋กœ ๋งŒ๋“œ๋Š” ๋„คํŠธ์›Œํฌ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ์˜ ๊ธฐ๋Šฅ ๋•๋ถ„์— ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ๋“œ๋ผ์ด๋ฒ„๋กœ์„œ ์‚ฌ์šฉํ•˜๋Š” ingress ๋„คํŠธ์›Œํฌ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์— ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฐธ๊ณ ๋กœ, docker exec ๋ช…๋ น์–ด๋กœ ํŠน์ • ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ifconfig ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์˜ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ถœ๋ ฅ์ด ๋˜๋Š”๋ฐ, ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‘ ๊ฐ๊ฐ eth0, eth1, lo ๋ผ๋Š” ์ด 3๊ฐœ์˜ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ingress ๋„คํŠธ์›Œํฌ์™€ ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ ์นด๋“œ๋Š” eth0 ์ด๋‹ค.

5-5-2. ์Šค์›œ ๋ชจ๋“œ์—์„œ์˜ ์ƒˆ๋กœ์šด ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ, docker_gwbridge ๋„คํŠธ์›Œํฌ

์Šค์›œ ๋ชจ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ค‘ ingress ๋ง๊ณ ๋„ ๋˜ ํ•˜๋‚˜์˜ ๋„คํŠธ์›Œํฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ๋ฐ”๋กœ docker_gwbridge ๋„คํŠธ์›Œํฌ์ด๋‹ค. ์ด์ „์— ์Šค์›œ๋ชจ๋“œ๊ฐ€ ์•„๋‹Œ ์ผ๋ฐ˜์ ์ธ ๋ชจ๋“œ์—์„œ์˜ ๋„์ปค ๋„คํŠธ์›Œํฌ ์ค‘ ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์— ํ†ต์‹ ์„ ๊ฐ€๋Šฅ์ผ€ ํ•ด์ฃผ๋Š” ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ(ex. "docker0" ์ด๋ฆ„์˜ ๋„คํŠธ์›Œํฌ)์— ๋Œ€ํ•ด ๋ฐฐ์šด์ ์ด ์žˆ์—ˆ๋‹ค.

 

์ด ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ๋Š” ์Šค์›œ๋ชจ๋“œ์—์„œ๋Š” ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ingress ๋„คํŠธ์›Œํฌ๋ฅผ ํฌํ•จํ•œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ๋“ค์€ docker_gwbridge ๋ผ๋Š” ์ƒˆ๋กœ์šด ์œ ํ˜•์˜ ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ๋“ค ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์— ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•ด์ค€๋‹ค. ์ฐธ๊ณ ๋กœ docker_gwbridge ์™€ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์— ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋Š” eth1 ๋กœ ์—ฐ๊ฒฐ์ด ๋œ๋‹ค.

5-5-3. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ

[๋ชฉ์ฐจ 5-5-1]์—์„œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ํ™œ์šฉํ•˜๋Š” ingress ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ์ด๋ฒˆ์—๋Š” ingress ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•ด ๋งŒ๋“  ์ผ๋ช… '์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ'๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค ๊ฐ„์— ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณด์ž. ์šฐ์„  ์Šค์›œ ๋ชจ๋“œ๋Š” ์ž์ฒด์ ์ธ key-value ์ €์žฅ์†Œ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๊ตฌ์„ฑ ์—†์ด ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ธฐ์กด์— ๋ฐฐ์› ๋˜ ๋„์ปค ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด์™€ -d ์˜ต์…˜์„ ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

$ docker network create \
--subnet 11.22.33.44/24 \
-d overlay \
zedd_overlay

 

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

 

$ docker service create \
--network zedd_overlay \
--replicas 2 \
alicek106/book:hostname

 

 

์œ„ ๋ช…๋ น์–ด๋กœ ์ƒ์„ฑ๋œ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ ์ค‘ ํ•˜๋‚˜์—๋‹ค๊ฐ€ ifconfig ๋ช…๋ น์–ด๋ฅผ ์ ์šฉํ•˜์—ฌ ๊ทธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ์ถœ๋ ฅํ•ด๋ณด์ž. ์ถœ๋ ฅ๋œ ํ™”๋ฉด ์ค‘ eth0 ๋ผ๋Š” ์ด๋ฆ„์˜ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋ฉด IP ์ฃผ์†Œ(inet address ๋ผ๊ณ  ๋˜์–ด์žˆ๋Š” ๋ถ€๋ถ„)๋ฅผ ๋ณด๋ฉด ์œ„์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋ช…์‹œํ•ด์ค€ subnet IP ์ฃผ์†Œ๊ฐ€ ์ž…๋ ฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์‚ฌ์šฉ์ž ์ •์˜ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋ฅผ ์ ์šฉํ•ด์„œ ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” ํฌํŠธ ํฌ์›Œ๋”ฉ์„ ํ•˜๋Š” -p(--publish) ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ณง ingress ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •๋จ์„ ์˜๋ฏธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ingress ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž ์ •์˜ํ•œ ์˜ค๋ฒ„๋ ˆ์ด ๋„คํŠธ์›Œํฌ๋งŒ์„ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์œ„์ฒ˜๋Ÿผ --network ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋˜ -p ์˜ต์…˜์„ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋œ๋‹ค.

5-6. ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ(Discovery)

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

 

 

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

 

$ docker service create \
--name server \
--network zedd_overlay \
--replicas 2 \
alicek106/book:hostname

$ docker service create \
--name client \
--network zedd_overlay \
alicek106/book:curl \
ping docker.com

 

๊ทธ๋Ÿฐ ๋‹ค์Œ client ์„œ๋น„์Šค ๋‚ด์— ํ• ๋‹น๋œ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ„ ๋’ค, ์•„๋ž˜์˜ curl ๋ช…๋ น์–ด๋กœ server ๋ผ๋Š” ์ด๋ฆ„์˜ ๋„๋ฉ”์ธ ๋„ค์ž„์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž. ์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ server ๋ผ๋Š” ๋„๋ฉ”์ธ ๋„ค์ž„์€ ์œ„์—์„œ ์ƒ์„ฑํ•œ ์„œ๋น„์Šค ์ด๋ฆ„์„ ์˜๋ฏธํ•œ๋‹ค.

 

$ curl server | grep -E "Hello"

 

์œ„ ๋ช…๋ น์–ด๋ฅผ ์น˜๋ฉด HTML ํ˜•์‹์˜ Response๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š”๋ฐ, ์ด ๋•Œ ์ปจํ…Œ์ด๋„ˆ ID ๊ฐ’์ด ๋ณด์ผ ๊ฒƒ์ด๋‹ค. ์ด ์ปจํ…Œ์ด๋„ˆ๋Š” ๋ฐ”๋กœ server ๋ผ๋Š” ์ด๋ฆ„์˜ ์„œ๋น„์Šค ๋‚ด์— ํ• ๋‹น๋œ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ์˜ ID์ด๋‹ค. ์ด์ œ ๊ทธ๋Ÿฌ๋ฉด server ์ด๋ฆ„์˜ ์„œ๋น„์Šค ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๋ฅผ 2๊ฐœ์—์„œ 3๊ฐœ๋กœ ๋Š˜๋ ค๋ณด์ž. ๋ช…๋ น์–ด๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker service scale server=3

 

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‹ค์‹œ ์•„๊นŒ ๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ”๋˜ client ์„œ๋น„์Šค ๋‚ด์— ํ• ๋‹น๋œ ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๋กœ ๊ฐ€์„œ curl ๋ช…๋ น์–ด๋กœ ๋‹ค์‹œ ํ…Œ์ŠคํŠธ๋ฅผ ๋ช‡ ๋ฒˆ ํ•ด๋ณด๋ฉด ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋œ ์ปจํ…Œ์ด๋„ˆ ID๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์Šค์›œ ๋ชจ๋“œ๊ฐ€ ์•Œ์•„์„œ ์„œ๋น„์Šค ๋ฐœ๊ฒฌ์„ ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ ‡๋‹ค๋ฉด server ๋ผ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์€ ์–ด๋–ป๊ฒŒ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์˜ IP๋กœ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ? ์‚ฌ์‹ค์ƒ server ๋ผ๋Š” ์„œ๋น„์Šค ์ด๋ฆ„์€ (์œ„ ์˜ˆ์‹œ์—์„œ) ์ด 3๊ฐœ์˜ IP ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์„œ๋น„์Šค ์ž์ฒด์— ํ• ๋‹น๋œ 1๊ฐœ์˜ VIP(Virtual IP, ๊ฐ€์ƒ IP ์ฃผ์†Œ)๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Š” ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ๋„์ปค ๋ธŒ๋ฆฌ์ง€ ๋„คํŠธ์›Œํฌ๋ฅผ ๋ฐฐ์šฐ๋ฉด์„œ --net-alias ์˜ต์…˜์—์„œ ์•Œ์•„๋ณด์•˜๋˜ ๋„์ปค ๋‚ด์žฅ DNS ์„œ๋ฒ„์™€ ์œ ์‚ฌํ•˜๋‹ค. ๋‹จ, --net-alias ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๊ธฐ๋Šฅ๊ณผ ์œ ์‚ฌํ•  ๋ฟ ๊ตฌ์ฒด์ ์ธ ๋™์ž‘ ๋ฐฉ์‹์€ ๋‹ค๋ฅด๋‹ค๊ณ  ํ•œ๋‹ค.

 

์ฐธ๊ณ ๋กœ ์„œ๋น„์Šค ์ž์ฒด์— ํ• ๋‹น๋œ VIP ์ฃผ์†Œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋ณด๋ ค๋ฉด ํ•ด๋‹น ์„œ๋น„์Šค์˜ ๊ตฌ์ฒด์ ์ธ ์ •๋ณด ์ค‘ 'VirtualIPs' ๋ผ๋Š” ํ•ญ๋ชฉ์„ ๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

5-7. ์Šค์›œ ๋ชจ๋“œ์—์„œ ๋ณผ๋ฅจ ์‚ฌ์šฉํ•˜๊ธฐ

๋„์ปค ์Šค์›œ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ ๋ชจ๋“œ ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹จ์œ„๋กœ ์ œ์–ดํ•  ๋•Œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํ˜ธ์ŠคํŠธ ๋ณผ๋ฅจ ๊ณต์œ ๋‚˜ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋‚˜ -v ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ๋•Œ ๋ช…๋ น์–ด ํ˜•์‹ ์ƒ์œผ๋กœ๋Š” ์ž˜ ๊ตฌ๋ถ„์ด ์•ˆ๊ฐ”๋‹ค.(์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ์ด์ „ ํฌ์ŠคํŒ… ์ฐธ๊ณ )

 

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

 

๋„์ปค ์Šค์›œ์—์„œ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. --mount ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ •์˜ํ•ด์ค€๋‹ค. ์ฐธ๊ณ ๋กœ ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์ปจํ…Œ์ด๋„ˆ ๋‹จ์œ„๋ฅผ ์ œ์–ดํ•  ๋•Œ์˜ ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•  ๋•Œ๋„ --mount ์˜ต์…˜์„ ์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด๋ฅผ ๋ฐฐ์› ์—ˆ๋Š”๋ฐ, ๊ทธ ๋•Œ์˜ ํ˜•์‹์ด๋ž‘ ๋˜‘๊ฐ™๋‹ค.

 

$ docker serivce create \
--name zedd_service \
--mount type=volume,source=[์ƒ์„ฑํ•œ๋ณผ๋ฅจ],target=[์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ] \
ubuntu:14.04 \
ping.docker.com

 

๋งŒ์•ฝ source ์ธ์ž์— [์ƒ์„ฑํ•œ๋ณผ๋ฅจ]์„ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ์•Œ์•„์„œ 16์ง„์ˆ˜์˜ ํ•ด์‰ฌ๊ฐ’์„ ์ด๋ฆ„์œผ๋กœ ํ•˜๋Š” ๋ณผ๋ฅจ์„ ์ž์ฒด์ ์œผ๋กœ ์ƒ์„ฑํ•ด ํ• ๋‹นํ•œ๋‹ค. ์œ„์™€ ๊ฐ™์ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜๋ฉด [์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ]์— ๋ช…์‹œํ•œ ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋“ค์ด ๋ณผ๋ฅจ์— ๋ณต์‚ฌ๋˜๊ณ , ํ˜ธ์ŠคํŠธ์—์„œ๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ ํŒŒ์ผ๋“ค์„ ์ฐจ์ง€ํ•˜๋Š” ๋ณ„๋„์˜ ๊ณต๊ฐ„์ด ์ƒ๊ธด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด์„œ, ์•„๋ž˜์™€ ๊ฐ™์ด ubuntu:14.04 ์ด๋ฏธ์ง€์˜ /etc/vim/ ์ด๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ๋ฅผ ๋ณผ๋ฅจํ•  ๊ฒฝ๋กœ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค๊ณ  ํ•˜์ž. ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ํ™œ์šฉํ•ด์„œ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•ด๋ณด์ž.

 

$ docker service create \
--name zedd_ubuntu \
--mount type=volume,source=volume_for_test,target=/etc/vim \
ubuntu:14.04
ping docker.com

 

์œ„์ฒ˜๋Ÿผ ์„œ๋น„์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด์„œ ๋ณผ๋ฅจ์ด ์ƒ์„ฑ๋˜์—ˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์ด ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๋ณผ๋ฅจ ๋Œ€์ƒ์ธ /etc/vim ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋“ค์ด ์ž˜ ๊ณต์œ ๋˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž. ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๊ฐ„๋‹จํ•œ ์ปจํ…Œ์ด๋„ˆ 1๊ฐœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ถ€๋กœ ๋“ค์–ด๋ณด์ž.

 

$ docker run -it --name volume_for_test_cont \
-v volume_for_test:/root \
ubuntu:14.04

 

๋‚ด๋ถ€๋กœ ๋“ค์–ด๊ฐ€๋ณด๋ฉด root ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ƒ๊ธฐ๊ณ  ๊ทธ ์•ˆ์— /etc/vim ์•ˆ์— ์žˆ๋Š” vimrc, vimrc.tiny ๋ผ๋Š” ํŒŒ์ผ๋“ค์ด ๊ณต์œ ๋˜๊ณ  ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

๋‹ค์Œ์€ ์Šค์›œ ๋ชจ๋“œ์—์„œ ํ˜ธ์ŠคํŠธ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด๋ฅผ bind ํƒ€์ž…์˜ ๋ณผ๋ฅจ ์ƒ์„ฑ์ด๋ผ๊ณ ๋„ ํ•˜๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ bind๊ฐ€ ๋ฐฉ๊ธˆ ๋ฐฐ์šด --mount ์˜ต์…˜์˜ type ์ธ์ž์— ๋“ค์–ด๊ฐˆ ํ‚ค์›Œ๋“œ์ด๋‹ค. ์˜ˆ์‹œ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

$ docker service create \
--name zedd_ubuntu \
--mount type=bind,source=[ํ˜ธ์ŠคํŠธ ๋””๋ ‰ํ† ๋ฆฌ],target=[์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ ๋””๋ ‰ํ† ๋ฆฌ] \
ubuntu:14.04
ping docker.com

 

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

 

๊ทธ๋ž˜์„œ ๋ณดํ†ต์€ ์Šค์›œ ๋ชจ๋“œ์—์„œ ๋ณผ๋ฅจ์„ ๊ณต์œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ๋„ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•œ ํผ์‹œ์Šคํ„ด๋“œ(Persistent) ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํผ์‹œ์Šคํ„ดํŠธ ์Šคํ† ๋ฆฌ์ง€๋ž€, ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ์™€๋Š” ๋ณ„๊ฐœ๋กœ ์™ธ๋ถ€์— ์กด์žฌํ•˜์—ฌ ๋„คํŠธ์›Œํฌ๋ฅผ ํ™œ์šฉํ•ด์„œ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ ์ปจํ…Œ์ด๋„ˆ๋“ค๊ณผ ๋งˆ์šดํŠธํ•  ์ˆ˜ ์žˆ๋Š” ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

์ถœ์ฒ˜: https://theworkaround.com/2019/05/15/docker-swarm-persistent-storage/

 

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌํ•œ ํผ์‹œ์Šคํ„ดํŠธ ์Šคํ† ๋ฆฌ์ง€๋Š” ๋„์ปค์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์จ๋“œํŒŒํ‹ฐ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ด์šฉํ•˜๊ฑฐ๋‚˜ NFS(Network File System) ๋˜๋Š” DFS(Distributed File System)์„ ๋ณ„๋„๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

5-8. ์Šค์›œ ๋ชจ๋“œ ๋…ธ๋“œ ๋‹ค๋ฃจ๊ธฐ

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

5-8-1. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” AVAILABILITY ๋ณ€๊ฒฝ

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

 

์ƒ์„ฑํ•œ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์— ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋“ค์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋‚˜์˜ค๋ฉฐ, ๊ทธ ์ค‘์— AVAIABILITY ๋ผ๋Š” ํ•ญ๋ชฉ์ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

 

์œ„ ํ™”๋ฉด์„ ๋ณด๋ฉด ํ˜„์žฌ ๋‚˜๋จธ์ง€ ์›Œ์ปค ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” VM๋“ค์„ ๊บผ๋‘” ์ƒํƒœ๋ผ STATUS๊ฐ€ DOWN์œผ๋กœ ๋‚˜์˜ค๊ธด ํ•˜์ง€๋งŒ, AVAIABILITY ํ•ญ๋ชฉ์„ ๋ณด๋ฉด ๋ชจ๋“  ๋…ธ๋“œ๊ฐ€ Active์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. Active๋Š” ๋ง ๊ทธ๋Œ€๋กœ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ• ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ด๋‹ค. ๋ณดํ†ต ๋…ธ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ์šฉ๋˜๋Š” ๊ฐ’์ด๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด ํ˜•์‹์„ ์ด์šฉํ•ด Active๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๋ฅผ Active ์ƒํƒœ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

$ docker node update \
--availability active \
[NODE NAME]

 

๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ STATUS๋กœ๋Š” Drain์ด ์žˆ๋‹ค. Drain ์ƒํƒœ์˜ ๋…ธ๋“œ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ฃผ์ฒด์ธ ์Šค์›œ ๋งค๋‹ˆ์ €์˜ ์Šค์ผ€์ฅด๋Ÿฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ๋กœ ํ• ๋‹นํ•˜์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต ๋งค๋‹ˆ์ € ๋…ธ๋“œ์— Drain ์ƒํƒœ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋˜ํ•œ ํŠน์ • ๋…ธ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ• ๋‹นํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋„ ์ด์šฉํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์‹คํ–‰์‹œํ‚ค๊ณ  ์žˆ๋˜ ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ์ฆ‰์‹œ ์ค‘์ง€๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ด๋–ค ๋…ธ๋“œ๊ฐ€ Drain ์ƒํƒœ๋กœ ๋ณ€ํ•˜๊ธฐ ์ด์ „์˜ Active ์ƒํƒœ์ผ ๋•Œ ํ• ๋‹น๋ฐ›๊ณ  ์žˆ๋˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ด๋Ÿด ๊ฒฝ์šฐ์— ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ Drain ์ƒํƒœ๋กœ ๋ฐ”๊พธ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์— ํ• ๋‹น๋ฐ›์€ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ „๋ถ€ ์ค‘์ง€๋œ ํ›„, ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์˜ Active ์ƒํƒœ์˜ ๋…ธ๋“œ๋กœ ํ• ๋‹น๋œ๋‹ค. ์ฐธ๊ณ ๋กœ Drain ์‹œ์ผœ๋†“์€ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ Active๋กœ ๋ณ€๊ฒฝํ•œ๋‹ค๊ณ  ํ•œ๋“ค Drain ์ƒํƒœ์ผ ๋•Œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ํ• ๋‹น๋˜์—ˆ๋˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค์‹œ ์ƒ๊ธฐ๋Š” ์ฆ‰, ์ปจํ…Œ์ด๋„ˆ๋ฅผ Re-balancing ์ž‘์—…์„ ํ•ด์ฃผ์ง„ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ docker service scale ~ ๋ช…๋ น์–ด๋กœ ์ ์šฉํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

Drain ์ƒํƒœ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๋ช…๋ น์–ด ํ˜•์‹์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. --availability ํ•ญ๋ชฉ๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

$ docker node update \
--availability drain \
[NODE NAME]

 

๋‹ค์Œ์˜ STATUS ์ข…๋ฅ˜๋กœ๋Š” Pause๊ฐ€ ์žˆ๋‹ค. Pause ์ƒํƒœ๋Š” ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ๋” ์ด์ƒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ• ๋‹น๋ฐ›์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ๋งŒ ๋ณด๋ฉด Drain ์ƒํƒœ์™€ ๋˜‘๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ ๋ถ„๋ช…ํ•œ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. Drain ์ƒํƒœ๋Š” ํ• ๋‹น๋ฐ›์•˜๋˜ ์‹คํ–‰์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘์ง€๋˜์ง€๋งŒ Pause๋Š” ์ค‘์ง€๋˜์ง€ ์•Š๊ณ  ์—ฌ์ „ํžˆ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ Pause๋Š” "์ง€๊ธˆ๊นŒ์ง€ ํ• ๋‹น๋ฐ›์€ ์ปจํ…Œ์ด๋„ˆ๋“ค๋งŒ ์‹คํ–‰ํ• ๊ฑฐ์•ผ. ๋” ์ถ”๊ฐ€ํ•  ์ปจํ…Œ์ด๋„ˆ๋“ค์€ ๋‹ค๋ฅธ ๋…ธ๋“œ์—๋‹ค๊ฐ€ ์ค˜" ์ธ ์…ˆ์ด๋‹ค.

5-8-2. ๋…ธ๋“œ์—๊ฒŒ ์ด๋ฆ„ํ‘œ๋ฅผ ๋ถ™์—ฌ ๋ถ„๋ฅ˜ํ•˜์ž, --lablel-add ์˜ต์…˜

์ด์ „์˜ ๋„์ปค ์ด๋ฏธ์ง€ ๋‹ค๋ฃจ๊ธฐ ํฌ์ŠคํŒ…์—์„œ ์ด๋ฏธ์ง€์— ๋ผ๋ฒจ์„ ๋ถ™์ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜‘๊ฐ™์ด ๋…ธ๋“œ์—์„œ๋„ ๋ผ๋ฒจ์„ ๋ถ™์—ฌ ๊ทธ ๋…ธ๋“œ๊ฐ€ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์ธ์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋…ธ๋“œ๋ฅผ ๋ถ„๋ฅ˜ํ•ด ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ์ง€ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ผ๋ฒจ์€ <key>=<value> ํ˜•ํƒœ๋ฅผ ์ง€๋‹Œ๋‹ค. ๋งŒ์•ฝ ๋…ธ๋“œ์— ๋ผ๋ฒจ์„ ๋ถ™์ธ๋‹ค๋ฉด ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ํ• ๋‹นํ•  ๋ ˆํ”Œ๋ฆฌ์นด ์ปจํ…Œ์ด๋„ˆ๋“ค์„ ์›ํ•˜๋Š” ๋ผ๋ฒจ์„ ๊ฐ–๋Š” ๋…ธ๋“œ์—๋งŒ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. 

 

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

 

$ docker node update \
--label-add username=zedd \
swarm-worker1

 

๊ทธ๋ฆฌ๊ณ  inspect ๋ช…๋ น์–ด๋กœ ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์‚ดํŽด๋ณด๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Labels ํ•ญ๋ชฉ์— ๋ฐฉ๊ธˆ ์ •์˜ํ•œ ๋ผ๋ฒจ์ด ์ƒ์„ฑ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

5-8-3. ์„œ๋น„์Šค ์ œ์•ฝ์„ ์„ค์ •ํ•ด ํŠน์ • ๋…ธ๋“œ์—๋งŒ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ• ๋‹นํ•˜๋„๋ก ํ•˜์ž, --constraint ์˜ต์…˜

๋‹ค์Œ์€ ์Šค์›œ ํด๋Ÿฌ์Šคํ„ฐ์— ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ œ์•ฝ(Constraint)์„ ์„ค์ •ํ•˜์—ฌ ์„œ๋น„์Šค์˜ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ• ๋‹น๋  ๋…ธ๋“œ๋งŒ์„ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํŠน์ • ๋…ธ๋“œ ID๋‚˜ ๋…ธ๋“œ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„, ๋„์ปค ๋ฐ๋ชฌ์˜ ๋ผ๋ฒจ, (์ง์ „์— ๋ฐฐ์šด) ๋…ธ๋“œ์˜ ๋ผ๋ฒจ ๋“ฑ์œผ๋กœ ๋‹ค์–‘ํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

์šฐ์„  ์ง์ „์— ๋ฐฐ์šด ๋…ธ๋“œ์— ๋ถ™ํ˜€์ง„ ๋ผ๋ฒจ์„ ๊ธฐ์ค€์œผ๋กœ ์ œ์•ฝ์„ ์„ค์ •ํ•ด๋ณด์ž. ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด ํ˜•์‹์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ถ™์ธ ๋ผ๋ฒจ์€ ์œ„์—์„œ ์ •์˜ํ•œ username=zedd ๋ผ๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

 

$ docker service create \
--name node_label_constraint \
--replicas 5 \
--constraint 'node.labels.username == zedd' \
ubuntu:14.04 \
ping docker.com

 

ํŠน์ดํ•œ ๊ฒƒ์€ ์ œ์•ฝ์„ ์„ค์ •ํ•  ๋•Œ ๋™์ผํ•œ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๊ฐ€ Python์ฒ˜๋Ÿผ == ์™€ != ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•œ ์ œ์•ฝ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์„œ๋น„์Šค์˜ ์ปจํ…Œ์ด๋„ˆ๋Š” ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค.

 

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

 

$ docker service create \
--constraint 'node.id == MIIBajCCARCgAwIBAgIUW3RulxTWTziz' \
--replicas 5
ubuntu:14.04 \
ping docker.com

 

๋‹ค์Œ์€ ๋…ธ๋“œ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„๊ณผ ๋…ธ๋“œ์˜ ์—ญํ• ์„ ๊ธฐ์ค€์œผ๋กœ ์„ธ์šฐ๋Š” ์ œ์•ฝ ์กฐ๊ฑด์ด๋‹ค. ์šฐ์„  ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์€ ๊ทธ์•ผ๋ง๋กœ ๋…ธ๋“œ VM์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ํ•ด์˜จ ์‹ค์Šต์„ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค๋ฉด swarm-manager, swarm-worker1, swarm-worker2 ๋ผ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ด ๋˜๊ฒ ๋‹ค. ๋‹ค์Œ์€ ๋…ธ๋“œ์˜ ์—ญํ• ์ธ๋ฐ, ์—ญํ• ์ด๋ผ ํ•จ์€ ๋งค๋‹ˆ์ € ๋…ธ๋“œ์ธ์ง€ ์›Œ์ปค ๋…ธ๋“œ์ธ์ง€์ด๋‹ค. ๋งค๋‹ˆ์ € ๋…ธ๋“œ์ด๋ฉด manager๋ฅผ ์›Œ์ปค ๋…ธ๋“œ์ด๋ฉด worker๋ฅผ ํ‚ค์›Œ๋“œ๋กœ ์“ฐ๋ฉด ๋œ๋‹ค. ๋ช…๋ น์–ด ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker service create \
--constraint 'node.hostname == swarm-worker1' \
--replicas 3 \
ubuntu:14.04 \
ping docker.com

$ docker service create \
--constraint 'node.role != manager' \
--replicas 3 \
ubuntu:14.04 \
ping docker.com

 

๋งˆ์ง€๋ง‰์œผ๋กœ ๋„์ปค ๋ฐ๋ชฌ ์ž์ฒด์— ์„ค์ •๋œ ๋ผ๋ฒจ์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” ์ œํ•œ ์กฐ๊ฑด์ด๋‹ค. ๋„์ปค ๋ฐ๋ชฌ์— ๋ผ๋ฒจ์„ ๋ถ™์—ฌ์ฃผ๋ ค๋ฉด ๋„์ปค ๋ฐ๋ชฌ์˜ ์‹คํ–‰ ์˜ต์…˜์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค. ์ฐธ๊ณ ๋กœ ์ด๋ฏธ ๋„์ปค ๋ฐ๋ชฌ์— ์„ค์ •๋œ ๋ผ๋ฒจ์„ ํ™•์ธํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด docker info ๋ช…๋ น์–ด์˜ Labels ํ•ญ๋ชฉ์œผ๋กœ ํ™•์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

$ docker service create \
--constraint 'engine.labels.[key] == [value] \
--replicas 2 \
ubuntu:14.04 \
ping docker.com

 

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


์ง€๊ธˆ๊นŒ์ง€ ๊ธด.. ์—ฌ์ •์ธ ๋„์ปค ์Šค์›œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค. ๋‹ค์Œ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋“œ๋””์–ด ๋„์ปค์˜ ๋งˆ์ง€๋ง‰ ๋ถ€๋ถ„์ธ ๋„์ปค ์ปดํฌ์ฆˆ(Compose)์— ๋Œ€ํ•ด ๋‹ค๋ฃฌ๋‹ค. ๋„์ปค์˜ ๋งˆ์ง€๋ง‰ ๋ชฉ์ฐจ๋กœ ๋‹ฌ๋ ค๋‚˜๊ฐ€๋ณด์ž.

๋ฐ˜์‘ํ˜•