Search

Docker Network

Date
2024/12/07
Category
Devops
Tag
Docker
๋ชฉ์ฐจ

Docker Network

๋„์ปค๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜์ด๋ฏ€๋กœ, ๊ฐ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์ž์ฒด ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค์™€ IP๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ Docker Network๊ฐ€ ์กด์žฌํ•œ๋‹ค.

ย ๋„คํŠธ์›Œํฌ ๊ตฌ์กฐ

eth0

โ€ข
ํ˜ธ์ŠคํŠธ ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค
โ€ข
์™ธ๋ถ€ ์—ฐ๊ฒฐ ์‹œ ์‚ฌ์šฉ IP ํ• ๋“ฑ

docker0

โ€ข
๊ธฐ๋ณธ ๊ตฌ์„ฑ bridge
โ€ข
eth0์™€ container ๊ฐ„ ์—ฐ๊ฒฐ ์ œ๊ณต
โ€ข
๋‹ค์–‘ํ•œ container ๊ฐ„ ์—ฐ๊ฒฐ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด bridge ์ƒ์„ฑ ๊ฐ€๋Šฅ

veth

โ€ข
์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€ IP์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ€์ƒ ์ธํ„ฐํŽ˜์ด์Šค (virtual eth)
โ€ข
์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ ์‹œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ
โ€ข
eth0๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์™ธ๋ถ€ํ†ต์‹ ์ด ๊ฐ€๋Šฅ

ย ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„

Docker์˜ ๋„คํŠธ์›Œํ‚น ์„œ๋ธŒ ์‹œ์Šคํ…œ์€ ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”Œ๋Ÿฌ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ์กด์žฌํ•˜๋ฉฐ ํ•ต์‹ฌ ๋„คํŠธ์›Œํ‚น ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.
Bridge
- ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„๋กœ, ๋“œ๋ฆฌ์ด๋ฒ„ ๋ฏธ์ง€์ • ์‹œ bridge๊ฐ€ ์ƒ์„ฑ๋จ (๊ธฐ๋ณธ ๋Œ€์—ญ: 172.17.x.x) - ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ผ ํ˜ธ์ŠคํŠธ์˜ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ํ†ต์‹ ํ•ด์•ผ ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ
Host
- ์ปจํ…Œ์ด๋„ˆ์™€ Docker ํ˜ธ์ŠคํŠธ ๊ฐ„์˜ ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ํ˜ธ์ŠคํŠธ์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉ - ๋„คํŠธ์›Œํฌ ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋˜์ง€๋งŒ ๋„คํŠธ์›Œํฌ ๊ฒฉ๋ฆฌ๊ฐ€ ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ์— ์ ํ•ฉ
Overlay
- ์—ฌ๋Ÿฌ ๋„์ปค ๋ฐ๋ชฌ์„ ์—ฐ๊ฒฐํ•˜๊ณ  Swarm ์„œ๋น„์Šค ๋ฐ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋…ธ๋“œ ๊ฐ„์— ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ - OS ์ˆ˜์ค€์˜ ๋ผ์šฐํŒ…์„ ์ œ๊ฑฐํ•˜๊ณ , ์„œ๋กœ ๋‹ค๋ฅธ Docker ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ฐ„์˜ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ ๊ฐ€์žฅ ์ ํ•ฉ
IPvlan
- ์‚ฌ์šฉ์ž๊ฐ€ IPv4์™€ IPv6 ์ฃผ์†Œ๋ฅผ ์™„์ „ํžˆ ์ œ์–ด ๊ฐ€๋Šฅ - VLAN ๋“œ๋ผ์ด๋ฒ„๋Š” L2 VLAN ํƒœ๊น…๊ณผ IPvlan L3 ๋ผ์šฐํŒ… ์™„์ „ ์ œ์–ด ๊ฐ€๋Šฅ - underlay ๋„คํŠธ์›Œํฌ ํ†ตํ•ฉ์„ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ ํ•ฉ
Macvlan
- ์ปจํ…Œ์ด๋„ˆ์— MAC ์ฃผ์†Œ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๋„คํŠธ์›Œํฌ์—์„œ ๋ฌผ๋ฆฌ์  ์žฅ์น˜์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•จ - ๋ ˆ๊ฑฐ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฌผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ์— ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•  ๋•Œ ์œ ์šฉ
None
- ์ปจํ…Œ์ด๋„ˆ๋ฅผ ํ˜ธ์ŠคํŠธ ๋ฐ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ์™€ ์™„์ „ํžˆ ๊ฒฉ๋ฆฌํ•จ - ๋„คํŠธ์›Œํฌ๊ฐ€ ํ•„์š”์—†๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋˜๋ฉฐ, Swarm ์„œ๋น„์Šค์—์„œ๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ
Network plugins
- ์„œ๋“œํŒŒํ‹ฐ ๋„คํŠธ์›Œํฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉ

ย Practical Exercise

Bridge ๋„คํŠธ์›Œํฌ์™€ ๋‘ ๊ฐœ์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐํ•˜๊ณ , ์ปจํ…Œ์ด๋„ˆ ๊ฐ„ ํ†ต์‹  ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๋Š” ์‹ค์Šต์„ ์ง„ํ–‰ํ•œ๋‹ค.
์‹ค์Šต์— ์•ž์„œ ๋„์ปค ๋„คํŠธ์›Œํฌ ๊ธฐ๋ณธ์ ์ธ ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
# ํ™•์ธ docker network ls docker inspect network๋ช… # ์ƒ์„ฑ docker network create network๋ช… [--driver ๋“œ๋ผ์ด๋ฒ„๋ช…] # ์—ฐ๊ฒฐ docker network connect network๋ช… container๋ช…(or ID) # ํ•ด์ œ docker network disconnect network๋ช… container๋ช…(or ID) # ์‚ญ์ œ docker network rm network๋ช…
Bash
๋ณต์‚ฌ

1. Create a Bridge Network

Bridge ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„คํŠธ์›Œํฌ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. Bridge๋Š” ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— --driver ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์ง€์ •๋œ๋‹ค.
$ docker network create docker_network 5beecc54b43c5d472885593d64e31bb7dff835add94c283337c1988df74eb5a3 $ docker network ls NETWORK ID NAME DRIVER SCOPE 2c0b1efc74c0 bridge bridge local 5beecc54b43c docker_network bridge local e036a19de377 host host local 3176fd240f83 none null local
Bash
๋ณต์‚ฌ

1-1. Inspect Networks

์‹ค์Šต์—์„œ ์‚ฌ์šฉํ•  ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ์™€ ์ƒ์„ฑ๋œ ๋„คํŠธ์›Œํฌ์˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด๋ณธ๋‹ค. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์–ด๋Š ๋Œ€์—ญ์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฐ–๋Š”์ง€ ํ™•์ธํ•  ๊ฒƒ์ด๊ธฐ์— ์ด๋ฒˆ ์‹ค์Šต์—์„œ ํ™•์ธํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ Subnet, Gateway์ด๋‹ค.
โ€ข
๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ (bridge)
$ docker inspect bridge [ { "Name": "bridge", "Id": "2c0b1efc74c059d72ab35ae574e5730b98b29db9330aaf681b2295dcdbf32ee2", "Created": "2024-12-05T15:14:14.209961767+09:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16", "Gateway": "172.17.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "97cedd4b17a504a84f846b3ba0848f33d149829b0a005e008681f36905fb1746": { "Name": "container1", "EndpointID": "6debf1ce413afa6d9ec167749709e6f0a2c8fa6afcefd76210148397f4f434f8", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" }, "Labels": {} } ]
Bash
๋ณต์‚ฌ
โ—ฆ
์„œ๋ธŒ๋„ท์œผ๋กœ 172.17.0.0/16, ๊ฒŒ์ดํŠธ์›จ์ด๋กœ 172.17.0.1์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
์ƒ์„ฑ ๋„คํŠธ์›Œํฌ (docker_network)
$ docker inspect docker_network [ { "Name": "docker_network", "Id": "5beecc54b43c5d472885593d64e31bb7dff835add94c283337c1988df74eb5a3", "Created": "2024-12-07T23:48:21.138531568+09:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "172.19.0.0/16", "Gateway": "172.19.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "15064700394dbac3f7ae4f697c3b329cb7e21ec11cb6dc0152cf76aaded35920": { "Name": "container2", "EndpointID": "d03a323a272afc51ca5dfa9733f4b68de89f51ec1454955fe5a798402233245c", "MacAddress": "02:42:ac:13:00:02", "IPv4Address": "172.19.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
Bash
๋ณต์‚ฌ
โ—ฆ
์„œ๋ธŒ๋„ท์œผ๋กœ 172.19.0.0/16, ๊ฒŒ์ดํŠธ์›จ์ด๋กœ 172.19.0.1์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Run Containers

๋น„๊ต๋ฅผ ์œ„ํ•ด ๊ธฐ๋ณธ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฐ€์ง€๋Š” container1๊ณผ ์ƒ์„ฑํ•œ docker_network๋ฅผ ์‚ฌ์šฉํ•œ container2 ์ƒ์„ฑ
docker run -d --name container1 nginx docker run -d --name container2 --network docker_network nginx
Bash
๋ณต์‚ฌ

2-1. Check the IP addresses

$ docker inspect container1 | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAddress": "172.17.0.3", $ docker inspect container2 | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.19.0.2",
Bash
๋ณต์‚ฌ
โ€ข
container1์€ ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ์˜ ์„œ๋ธŒ๋„ท 172.17.0.0/16 ๋Œ€์—ญ์—์„œ IP ์ฃผ์†Œ 172.17.0.3์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
โ€ข
container2์€ ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ์˜ ์„œ๋ธŒ๋„ท 172.19.0.0/16 ๋Œ€์—ญ์—์„œ IP ์ฃผ์†Œ 172.19.0.2์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค
โ€ข
์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ifconfig๋ฅผ ํ†ตํ•ด์„œ๋„ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

3. Test Communication Between Containers (Different Network)

ํ˜„์žฌ ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฐ€์ง€๋Š” ์ปจํ…Œ์ด๋„ˆ์˜ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ์ง€ Ping ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•œ๋‹ค.

3-1. Access the Containerโ€™s Shell

docker exec -it container1 /bin/bash
Bash
๋ณต์‚ฌ

3-2. Ping Test

๋จผ์ €, Ping ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ping์„ ์„ค์น˜ํ•œ๋‹ค.
apt update apt install iputils-ping
Bash
๋ณต์‚ฌ
$ ping -c 5 172.19.0.2 PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data. --- 172.19.0.2 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4096ms
Bash
๋ณต์‚ฌ
โ€ข
์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์‹ ์ด ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

4. Connect the Same Network and Test

container1์„ docker_network์— ์—ฐ๊ฒฐํ•œ ํ›„ ๋‹ค์‹œ ํ†ต์‹ ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
docker network connect docker_network container1
Bash
๋ณต์‚ฌ

4-1. Check the IP address

$ docker inspect container1 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.17.0.3", "IPAddress": "172.17.0.3", "IPAddress": "172.19.0.3",
Bash
๋ณต์‚ฌ
โ€ข
docker_network์˜ ์„œ๋ธŒ๋„ท ๋Œ€์—ญ์˜ IP ์ฃผ์†Œ๋ฅผ ํ• ๋‹น๋ฐ›์€ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. (172.19.0.3)

4-2 Access the Containerโ€™s Shell and Test

๋‹ค์‹œ ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•˜์—ฌ ping ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์—ฌ ํ†ต์‹  ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ๋‹ค
docker exec -it container1 /bin/bash
Bash
๋ณต์‚ฌ
$ ping -c 5 172.19.0.2 PING 172.19.0.2 (172.19.0.2) 56(84) bytes of data. 64 bytes from 172.19.0.2: icmp_seq=1 ttl=64 time=1.19 ms 64 bytes from 172.19.0.2: icmp_seq=2 ttl=64 time=0.196 ms 64 bytes from 172.19.0.2: icmp_seq=3 ttl=64 time=0.207 ms 64 bytes from 172.19.0.2: icmp_seq=4 ttl=64 time=0.199 ms 64 bytes from 172.19.0.2: icmp_seq=5 ttl=64 time=0.126 ms --- 172.19.0.2 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4053ms rtt min/avg/max/mdev = 0.126/0.383/1.187/0.403 ms
Bash
๋ณต์‚ฌ
โ€ข
๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฐ€์ง„ ํ›„์—๋Š” ์ •์ƒ์ ์œผ๋กœ ํ†ต์‹ ์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.