Contents

[Network] docker network ๊ตฌ์„ฑ

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

red ์™€ blue container ๊ฐ€ ์„œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ ?

์ฒซ๋ฒˆ์งธ๋กœ ์‹ค์Šตํ•ด๋ณผ ๋‚ด์šฉ์€, host pc ๋‚ด์— red/blue container๋ฅผ ์ƒ์„ฑํ•˜๊ณ  2๊ฐœ์˜ network๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๋Š” ๊ฒƒ์ด๋‹ค.

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

1
2
3
4
docker network create --driver bridge my_network

docker run -dit --name red --network mynet alpine
docker run -dit --name blue --network mynet alpine

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

1
2
3
4
docker network create --driver bridge my_network

docker run -dit --name red --network `none` alpine
docker run -dit --name blue --network `none` alpine

ํ˜„์žฌ๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด, ํŠธ๋ž˜ํ”ฝ์„ ์„œ๋กœ ๊ตํ™˜ํ•  ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ด๋‹ค. red ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„  ์–ด๋–ป๊ฒŒ ํ•ด์•ผ๋ ๊นŒ? ์—ฌ๊ธฐ์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฐœ๋…์ด ์Šค์œ„์น˜์ด๋‹ค. (docker network ํ™˜๊ฒฝ์—์„œ๋Š” switch์™€ bridge๋ฅผ ํ˜ผ์šฉํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณค ํ•œ๋‹ค. ๊ฐœ๋…์ ์œผ๋กœ๋Š” ๋‹ค๋ฅด๋‹ค.)

switch vs bridge
  1. ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋ชฉ์  ๋ธŒ๋ฆฌ์ง€(Bridge): ๋ธŒ๋ฆฌ์ง€๋Š” ๋‘ ๊ฐœ ์ด์ƒ์˜ ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜์—ฌ ํ•˜๋‚˜์˜ ํ†ตํ•ฉ๋œ ๋„คํŠธ์›Œํฌ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์ฃผ๋กœ ๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์˜ ์–‘์„ ์ค„์ด๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ๊ธฐ์ˆ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜(Switch): ์Šค์œ„์น˜๋Š” ๋„คํŠธ์›Œํฌ ๋‚ด์˜ ์—ฌ๋Ÿฌ ์žฅ์น˜๋“ค ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ํŒจํ‚ท์„ ์ „๋‹ฌํ•˜๋Š” ์žฅ์น˜๋กœ, ๊ฐ ์žฅ์น˜์— ๋Œ€ํ•œ ํฌํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ํšจ์œจ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜๋Š” ๋ธŒ๋ฆฌ์ง€์˜ ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๋ฉฐ, ๋” ๋งŽ์€ ๊ธฐ๋Šฅ๊ณผ ๋” ๋†’์€ ํšจ์œจ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์ž‘๋™ ๋ฐฉ์‹ ๋ธŒ๋ฆฌ์ง€: ๋ธŒ๋ฆฌ์ง€๋Š” MAC ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฅธ ์„ธ๊ทธ๋จผํŠธ๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋„คํŠธ์›Œํฌ์˜ ์ถฉ๋Œ ๋„๋ฉ”์ธ์„ ์ค„์ด๊ณ  ํšจ์œจ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜: ์Šค์œ„์น˜ ์—ญ์‹œ MAC ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฐ ์—ฐ๊ฒฐ๋œ ์žฅ์น˜๋ฅผ ์œ„ํ•œ ํฌํŠธ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ธŒ๋ฆฌ์ง€๋ณด๋‹ค ๋” ๋งŽ์€ ๋™์‹œ ์—ฐ๊ฒฐ๊ณผ ๋” ๋†’์€ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ ๋Šฅ๋ ฅ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜๋Š” ๊ฐ ํฌํŠธ๊ฐ€ ๋…๋ฆฝ์ ์ธ ์ถฉ๋Œ ๋„๋ฉ”์ธ์„ ํ˜•์„ฑํ•˜๋ฏ€๋กœ ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค.
  3. ์šฉ๋„ ๋ฐ ํ™œ์šฉ ๋ธŒ๋ฆฌ์ง€: ์ž‘์€ ๋„คํŠธ์›Œํฌ ๋˜๋Š” ๋‘ ๊ฐœ์˜ ๋ถ„๋ฆฌ๋œ ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ธŒ๋ฆฌ์ง€๋Š” ๋„คํŠธ์›Œํฌ์˜ ๊ฐ„๋‹จํ•œ ํ™•์žฅ์ด ํ•„์š”ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜: ํ˜„๋Œ€์˜ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์Šค์œ„์น˜๋Š” ๋ธŒ๋ฆฌ์ง€๋ณด๋‹ค ํ›จ์”ฌ ๋„๋ฆฌ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์Šค์œ„์น˜๋Š” ๊ทธ ์ž์ฒด๋กœ ๋งŽ์€ ๋„คํŠธ์›Œํฌ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ์—์„œ ์ค‘์ถ”์ ์ธ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ฒˆ์—” ์Šค์œ„์น˜(๋ธŒ๋ฆฟ์ง€)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , 2๊ฐœ์˜ container๊ฐ€ ์„œ๋กœ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•ด๋ณด์ž.

์Šค์œ„์น˜ ์ƒ์„ฑ

1
2
3
ip link add name dockerbr0 type bridge
ip addr add 172.28.0.1/16 dev dockerbr0
ip link set dockerbr0 up

์œ„ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ, dockerbr0๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ bridge๋ฅผ ์ƒ์„ฑํ–ˆ๊ณ , 172.28.0.1/16 ์˜ ์•„์ดํ”ผ ๋Œ€์—ญ์„ ๊ฐ€์ง€๋„๋ก ํ–ˆ๋‹ค.

ํ˜„์žฌ๋Š” ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์€ ์ƒํƒœ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ red <-> blue container ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ ?

red container์—์„œ ๋‚˜๊ฐ€๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ bridge์˜ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ์ด ๋˜์–ด์•ผ ํ•˜๊ณ , ์ถ”๊ฐ€๋กœ blue container์—์„œ ๋‚˜๊ฐ€๋Š” ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ bridge ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ฐ๊ฒฐ์ด ๋˜๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค. ์šฐ์„  red container์—์„œ ํŠธ๋ž˜ํ”ฝ์ด ๋‚˜๊ฐ€๋Š” ํ†ต๋กœ์ธ veth-red, blue container์—์„œ ํŠธ๋ž˜ํ”ฝ์ด ๋‚˜๊ฐ€๋Š” veth-blue๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ฐ๊ฐ์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ bridge ์˜ ์ธํ„ฐํŽ˜์ด์Šค์ธ veth-red-br / veth-blue-br ๊ณผ ์—ฐ๊ฒฐ์ด ๋˜๋„๋ก ํ•ด๋ณด์ž.

veth pair ์ƒ์„ฑ ๊ทธ๋ฆฌ๊ณ  ๋ธŒ๋ฆฟ์ง€ ์—ฐ๊ฒฐ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
ip link add veth-red type veth peer name veth-red-br
ip link add veth-blue type veth peer name veth-blue-br

# ๋ธŒ๋ฆฟ์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋“ฑ๋ก
ip link set veth-red-br master dockerbr0
ip link set veth-red-br up

ip link set veth-blue-br master dockerbr0
ip link set veth-blue-br up

PID_RED=$(docker inspect --format '{{ .State.Pid }}' red)
sudo ip link set veth-red netns $PID_RED

nsenter --net=/proc/$PID_RED/ns/net -- ip addr add 172.28.0.2/16 dev veth-red
nsenter --net=/proc/$PID_RED/ns/net -- ip link set veth-red up

PID_BLUE=$(docker inspect --format '{{ .State.Pid }}' blue)
sudo ip link set veth-blue netns $PID_BLUE

nsenter --net=/proc/$PID_BLUE/ns/net -- ip addr add 172.28.0.3/16 dev veth-blue
nsenter --net=/proc/$PID_BLUE/ns/net -- ip link set veth-blue up

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•˜๊ฒŒ ๋˜๊ณ  ๋„์‹๋„๋ฅผ ๊ทธ๋ ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. container red ๋Š” veth-red(172.28.0.2)์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด bridge ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐํ•˜๊ณ , container blue ๋Š” veth-blue(172.28.0.3) ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด bridge์˜ ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐํ–ˆ๋‹ค.

ํ†ต์‹  ํ…Œ์ŠคํŠธ

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•˜๊ณ  red์—์„œ blue ๋กœ ํ•‘์„ ๋‚ ๋ ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ฑ๊ณต์ ์œผ๋กœ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์ง„ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ LAN์— ์†ํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ

์•ž์„  ์˜ˆ์ œ์™€ ๋น„์Šทํ•˜๊ฒŒ, green, orange container๋ฅผ ์ƒ์„ฑํ•ด์„œ dockerbr1 ๋ธŒ๋ฆฟ์ง€์— ์—ฐ๊ฒฐ์‹œ์ผœ๋†“์€ ์ƒํƒœ์ด๋‹ค. ์—ฌ๊ธฐ์„œ dockerbr0์— ์†ํ•œ red container์—์„œ dockerbr1์— ์†ํ•œ green container์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ์‹ถ์œผ๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  1. routing table
  2. ๊ฐ€์ƒ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋ฆฟ์ง€ ์—ฐ๊ฒฐ
  3. ip tunneling
  4. ํŠน์ • bridge์— ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐํ•˜๊ธฐ

์ด๋ฒˆ ์‹ค์Šต์—์„œ ํ•ด๋ณผ ๊ฒƒ์€, ์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด router๋ฅผ ํ†ตํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ์— ์†ํ•œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋ผ์šฐํŒ… ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ํ›„ ๋ธŒ๋ฆฟ์ง€์— ์—ฐ๊ฒฐ

1
2
3
4
5
docker run -dit --name router --network network1 --privileged alpine
docker network connect network1 router

# ๋ผ์šฐํ„ฐ ์ปจํ…Œ์ด๋„ˆ์— IP ํฌ์›Œ๋”ฉ ์„ค์ •
docker exec router sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

router ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋ผ์šฐํ„ฐ๋กœ ๋“ค์–ด์˜ค๋Š” ํŠธ๋ž˜ํ”ฝ์„ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋„๋ก IP ํฌ์›Œ๋”ฉ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค.

๋ผ์šฐํŒ… ๊ทœ์น™ ์„ค์ •

1
2
3
# NAT ์„ค์ • (์˜ต์…˜ - ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ๋กœ์˜ ์ ‘๊ทผ ํ•„์š” ์‹œ)
docker exec router iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
docker exec router iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

NAT ์„ค์ •์„ ํ•˜์—ฌ, ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค. NAT ์„ค์ •์„ ํ•˜๋Š” ์ด์œ ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ(์˜ˆ: ์ธํ„ฐ๋„ท ๋˜๋Š” ๋‹ค๋ฅธ ์‚ฌ์„ค ๋„คํŠธ์›Œํฌ)์™€ ํ†ต์‹ ํ•  ๋•Œ ์›๋ณธ IP ์ฃผ์†Œ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฉด, ๋ชฉ์ ์ง€ ๋„คํŠธ์›Œํฌ์—์„œ ํ•ด๋‹น IP ์ฃผ์†Œ๋ฅผ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ณด์•ˆ ์ •์ฑ…์— ์˜ํ•ด ์ฐจ๋‹จ๋  ์ˆ˜ ์žˆ๋‹ค. MASQUERADE๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ ์‘๋‹ต์„ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋กœ ์ •ํ™•ํžˆ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ ์›๋ณธ IP ์ฃผ์†Œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ, DHCP ์„œ๋ฒ„์— ์˜ํ•ด IP๋ฅผ ๋™์ ์œผ๋กœ ํ• ๋‹น๋ฐ›๋Š” ํ™˜๊ฒฝ์—์„œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.

๊ฐ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋กœ ๋ผ์šฐํŒ…์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ฒŒ์ดํŠธ์›จ์ด ์„ค์ •

1
2
3
4
5
6
7
# ์˜ˆ์‹œ๋กœ, ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ˆ˜๋™์œผ๋กœ ๋ผ์šฐํŒ… ์„ค์ •
docker exec container1 route add default gw [router์˜ network1 IP]
docker exec container2 route add default gw [router์˜ network2 IP]

# ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋™์ž‘์„ ํ•œ๋‹ค.
# ip route addr [network2 subnet] via  [router์˜ network1 interface]
# ip route addr [network1 subnet] via  [router์˜ network2 interface]

์œ„ ๋ช…๋ น์–ด๋Š”, ํŠน์ • container์—์„œ ์™ธ๋ถ€์˜ ip๋กœ ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ, routing table์— ์ •์˜๋˜์žˆ์ง€ ์•Š์„ ๊ฒฝ์šฐ, ํ•ด๋‹น ํŠธ๋ž˜ํ”ฝ์„ router๋กœ ์ด๋™ํ•˜๋ผ๊ณ  routing table์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ router ์˜ ip๋Š” ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์•Œ ์ˆ˜ ์žˆ๋‹ค.

1
docker inspect -f '{{json .NetworkSettings.Networks}}' router
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
  "my_network": {
    "IPAMConfig": null,
    "Links": null,
    "Aliases": null,
    "MacAddress": "02:42:ac:13:00:04",
    "NetworkID": "84436b4c6c98e7070092e8c8ad0cdeb90496fbdc7f6d55917dce7ed1bf952bf2",
    "EndpointID": "3d4a37627d5f87049c8598387b4a2f83937ba74feb91f66de0ac783756feda5d",
    "Gateway": "172.19.0.1",
    "IPAddress": "172.19.0.4",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "DriverOpts": null,
    "DNSNames": ["router", "339a3536c1b8"]
  },
  "my_network2": {
    "IPAMConfig": {},
    "Links": null,
    "Aliases": [],
    "MacAddress": "02:42:ac:14:00:04",
    "NetworkID": "cb84797946682d27e81bf967ee4a225f86462cbe23b9054f47cc18a35316d2ba",
    "EndpointID": "65b88bb2e2cef144fce7282a6e34b13841a7866eca6a6d9b86453dc2aaf404f6",
    "Gateway": "172.20.0.1",
    "IPAddress": "172.20.0.4",
    "IPPrefixLen": 16,
    "IPv6Gateway": "",
    "GlobalIPv6Address": "",
    "GlobalIPv6PrefixLen": 0,
    "DriverOpts": {},
    "DNSNames": ["router", "339a3536c1b8"]
  }
}

routing table ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[host] $ docker exec red ip route show
default via 172.19.0.4 dev eth0
default via 172.19.0.1 dev eth0
172.19.0.0/16 dev eth0 scope link  src 172.19.0.2

[host] $ docker exec blue ip route show
default via 172.19.0.4 dev eth0
default via 172.19.0.1 dev eth0
172.19.0.0/16 dev eth0 scope link  src 172.19.0.3

[host] $ docker exec green ip route show
default via 172.20.0.4 dev eth0
default via 172.20.0.1 dev eth0
172.20.0.0/16 dev eth0 scope link  src 172.20.0.2

[host] $ docker exec orange ip route show
default via 172.20.0.4 dev eth0
default via 172.20.0.1 dev eth0
172.20.0.0/16 dev eth0 scope link  src 172.20.0.3

[host] $ docker exec router ip route show
default via 172.19.0.1 dev eth0
172.19.0.0/16 dev eth0 scope link  src 172.19.0.4
172.20.0.0/16 dev eth1 scope link  src 172.20.0.4

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•˜๊ณ  ๋‚˜๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ LAN ์— ์œ„์น˜ํ•œ ์ปจํ…Œ์ด๋„ˆ๋“ค์ด ์„œ๋กœ ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

DNS :

๋‹ค์Œ์œผ๋กœ ํ•ด๋ณผ ๊ฒƒ์€ dns ์„œ๋ฒ„๋ฅผ ๊ตฌ์„ฑํ•˜์—ฌ docker exec red ping green ์ฒ˜๋Ÿผ green ip๋ฅผ ํ†ตํ•ด ํ†ต์‹ ์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, domain ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์„œ ํ†ต์‹ ์„ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. dns์˜ ๋Œ€ํ•œ ์„ค๋ช…์€ ์—ฌ๊ธฐ ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

red -> green ์œผ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, red ๋Š” green์ด๋ž€ ๋„๋ฉ”์ธ์„ ip๋กœ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด /etc/hosts ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์—ฌ ip๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ, red๋Š” green์„ ํ•ด์„ํ•  ์ˆ˜ ์—†์–ด, ping ์š”์ฒญ์€ ์‹คํŒจํ•  ๊ฒƒ์ด๋‹ค.

red container์˜ /etc/hosts ํŒŒ์ผ์— green 172.29.0.2 ๋ฅผ ์ ๊ณ , ping ์š”์ฒญ์„ ํ•˜๋ฉด ์„ฑ๊ณต์ ์œผ๋กœ ์‘๋‹ต์ด ๋–จ์–ด์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ํ†ต์‹ ํ•ด์•ผ ๋˜๋Š” ip ๋“ค์ด ๋งŽ์•„์ง€๊ฒŒ ๋˜๋ฉด, ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ค‘์•™์—์„œ ์ œ์–ดํ•ด์ฃผ๋Š” ์„œ๋ฒ„๋ฅผ dns server๋ผ๊ณ  ํ•œ๋‹ค.

dns server์˜ ์—ญํ• ์€ ๋„๋ฉ”์ธ์„ ip๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ฑฐ๋‚˜, ip๋ฅผ ๋„๋ฉ”์ธ์œผ๋กœ ๋ณ€ํ™˜(PTR), ์บ์‹ฑ, ๋ถ€ํ•˜ ๋ถ„์‚ฐ, ๋ณด์•ˆ, ๋„๋ฉ”์ธ๊ด€๋ฆฌ๋“ฑ์ด ์žˆ๋‹ค. ๋„๋ฉ”์ธ์„ ip๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ฐ„๋‹จํ•œ dns server๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์‹ค์Šต์„ ํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# dnsmasq.conf ์ •์˜
# dnsmasq.conf
interface=eth0
domain-needed
bogus-priv
expand-hosts

# ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ •์  DNS ๋งคํ•‘
address=/red/172.28.0.2
address=/blue/172.28.0.3
address=/green/172.29.0.2
address=/orange/172.29.0.3
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# dns server ์ƒ์„ฑ
docker run -d --name dns-server --network bridge1 --cap-add=NET_ADMIN andyshinn/dnsmasq
docker network connect bridge2 dns-server

docker cp dnsmasq.conf dns-server:/etc/dnsmasq.conf
docker restart dns-server

dns_server_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' dns-server)
echo $dns_server_ip

docker run -dit --name red --network bridge1 --ip 172.28.0.2 --dns $dns_server_ip alpine ash
docker run -dit --name blue --network bridge1 --ip 172.28.0.3 --dns $dns_server_ip alpine ash
docker run -dit --name green --network bridge2 --ip 172.29.0.2 --dns $dns_server_ip alpine ash
docker run -dit --name orange --network bridge2 --ip 172.29.0.3 --dns $dns_server_ip alpine ash

dns ์„œ๋ฒ„ ์„ค์ • ํŒŒ์ผ์— ๊ฐ๊ฐ์˜ ํ˜ธ์ŠคํŠธ๊ฐ€ ์–ด๋–ค ip๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์ •์˜ํ•˜๊ณ  dns-server๋ฅผ ์‹คํ–‰์‹œ์ผœ์ค€ ํ›„ ๊ธฐ์กด์— ์šด์˜์ค‘์ธ red,green,blue,orange ์— dns_server ip๋ฅผ ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ชจ๋‘ ์ค‘์ง€ํ•˜๊ณ  ์žฌ์‹คํ–‰ ์‹œ์ผœ์คฌ๋‹ค.

์œ„์™€ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•˜๊ฒŒ ๋˜๋ฉด, ์„œ๋กœ ๋‹ค๋ฅธ LAN ์— ์†ํ•ด์žˆ๋Š” red->green, green->blue .. ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ip๋ฅผ ์“ฐ์ง€์•Š๊ณ  ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. docker exec red traceroute green๋ช…๋ น์„ ํ˜ธ์ถœํ•  ๋•Œ, ์ •๋ง๋กœ dns server ์—์„œ ์‘๋‹ต์„ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด, tcpdump ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, dns ์ฟผ๋ฆฌ๋ฅผ ์บก์ณํ•ด๋ณด์ž.

1
2
3
docker exec -it red apk add --no-cache tcpdump
docker exec -it red tcpdump -i any -n 'udp port 53'
docker exec red traceroute green

์œ„์™€ ๊ฐ™์ด 53๋ฒˆ port๋กœ ๋ฆฌ์Šค๋‹ํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๊ณ , ์ƒˆ๋กœ์šด ํƒญ์„ ์—ด์–ด `docker exec red traceroute green` ํ•˜๊ฒŒ ๋˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด dns server๋กœ ๋ถ€ํ„ฐ ์ ์ ˆํžˆ ์‘๋‹ต์„ ๋ฐ›๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Note
  • AAAA ๋ฐ A ์ฟผ๋ฆฌ: red ์ปจํ…Œ์ด๋„ˆ๊ฐ€ green์˜ IP ์ฃผ์†Œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด DNS ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ƒ„.
  • ์‘๋‹ต: DNS ์„œ๋ฒ„๊ฐ€ IPv4 ์ฃผ์†Œ์— ๋Œ€ํ•ด์„œ๋งŒ ์‘๋‹ต์„ ์ œ๊ณตํ•˜๊ณ , IPv6 ์ฃผ์†Œ์— ๋Œ€ํ•ด์„œ๋Š” ์‘๋‹ตํ•˜์ง€ ์•Š์Œ.
  • PTR ์ฟผ๋ฆฌ: IP ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์„ ์–ป๊ธฐ ์œ„ํ•œ ์š”์ฒญ์ด ์žˆ์—ˆ์œผ๋‚˜, ์ ์ ˆํ•œ ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ•จ (NXDomain).
  • ๋กœ์ปฌํ˜ธ์ŠคํŠธ DNS ์บ์‹œ: 127.0.0.11๋Š” ๋„์ปค ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋กœ์ปฌ DNS ์บ์‹œ ์ฃผ์†Œ๋กœ, ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ DNS ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹น.