๋ชฉ์ฐจ
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
๋ณต์ฌ
โข
๊ฐ์ ๋คํธ์ํฌ๋ฅผ ๊ฐ์ง ํ์๋ ์ ์์ ์ผ๋ก ํต์ ์ด ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.