1. 컨테이너 네트워크 모드
컨테이너를 생성할 때는 --network 옵션을 사용하여 컨테이너의 네트워크 유형(모드)을 지정할 수 있습니다.
- None - 컨테이너에 대한 네트워크 설정을 수행하지 않습니다. 컨테이너는 외부 네트워크에 접근할 수 없으며, 루백 주소만 존재합니다.
- Container - 컨테이너의 네트워크 스택을 병합하여 다른 컨테이너와 IP 주소 및 포트 범위 등을 공유할 수 있습니다.
- Host - 호스트와 네트워크를 공유합니다.
- Bridge - 기본 네트워크 모드로, 호스트와 컨테이너 간의 포트 매핑(iptable 포워딩)을 통신합니다. 브릿지는 호스트에 생성되며 일반적으로 docker0라고 합니다.
사용자 정의 네트워크
기본적으로 컨테이너의 IP 주소는 무작위로 할당되며, 컨테이너를 시작할 때마다 변경될 수 있습니다. --ip 옵션을 사용하여 컨테이너에 고정 IP를 지정할 수 있으며, 사용자 정의 네트워크를 생성할 수 있습니다.
Docker 설치 후에는 세 가지 기본 네트워크가 생성됩니다. docker network ls로 확인하고, docker network inspect로 상세 정보를 볼 수 있습니다.
# sysnet 네트워크 목록 확인
sysnet@docker-host:~$ docker network ls
NETWORK ID NAME DRIVER
08b080b94bcf bridge bridge
cff410b272fe none null
e818cf59d997 host host
sysnet@docker-host:~$
# 기본 브릿지 네트워크 상세 정보 확인
sysnet@docker-host:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "08b080b94bcf5b8a651f27f6954d094eb6c41a200c969a8f80beb0b155655bd9",
"Scope": "local",
"Driver": "bridge",
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16"
}
]
},
"Containers": {},
"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"
}
}
]
sysnet@docker-host:~$
2. 가상 네트워크 브릿지
브릿지 모드는 Docker의 기본 네트워크 구성으로, 각 컨테이너에 Network 네임스페이스를 할당하고 IP 주소를 설정합니다.
Docker가 시작될 때 호스트에 자동으로 가상 네트워크 브릿지 docker0를 생성하며, 로컬에서 사용 가능한 개인 IP 대역에서 무작위로 docker0 인터페이스에 주소를 할당합니다.
가상 네트워크 브릿지 docker0는 커널 레벨에서 다른 물리 또는 가상 네트워크 카드와 연결되며, 모든 컨테이너와 로컬 호스트를 동일한 네트워크에 배치합니다.
docker0 인터페이스의 기본 구성에는 IP 주소, 서브넷 마스크 등이 포함되어 있으며, Docker 서비스 시작 시 사용자 정의 구성을 할 수 있습니다.
# docker0 인터페이스 정보 확인
sysnet@docker-host:~$ ip addr show docker0
5: docker0: mtu 1500 qdisc noqueue state DOWN
link/ether 02:42:41:3d:c1:6a brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:41ff:fe3d:c16a/64 scope link
valid_lft forever preferred_lft forever
sysnet@docker-host:~#
# 브릿지 인터페이스 정보 확인
sysnet@docker-host:~$ brctl show docker0
bridge name bridge id STP enabled interfaces
docker0 8000.0242413dc16a no veth06f0e1b
sysnet@docker-host:~#
# 네트워크 목록 확인
sysnet@docker-host:~$ docker network ls
NETWORK ID NAME DRIVER SCOPE
1d732a1c4f67 bridge bridge local
2e217e480705 host host local
c31d9a1acfc0 none null local
sysnet@docker-host:~#
# 브릿지 네트워크 상세 정보 확인
sysnet@docker-host:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "1d732a1c4f67d124eebfa1ccc19c299f9e0ed88f5f429f7bc5f4d6c263f9d599",
"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,
"Containers": {},
"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": {}
}
]
sysnet@docker-host:~#
3. 컨테이너의 기본 네트워크
브릿지는 컨테이너 시작 시의 기본 네트워크 모드입니다.
Docker 컨테이너를 생성하면 컨테이너는 자동으로 브릿지 네트워크 대역의 사용 가능한 IP 주소를 할당받으며, docker0 인터페이스의 IP 주소를 컨테이너의 기본 게이트웨이로 사용하여 호스트와 컨테이너 간의 가상 공유 네트워크를 설정합니다.
호스트는 컨테이너와 통신할 수 있으며, 컨테이너 간에도 서로 통신할 수 있습니다.
컨테이너는 docker0 브릿지를 통해 NAT 방식으로 외부 네트워크에 연결되며, 외부 네트워크는 포트 매핑(-p 매개변수)을 통해 컨테이너에 연결됩니다.
# Ubuntu 컨테이너 생성 및 실행
sysnet@docker-host:~$ docker run -it -d --name network-test docker.io/ubuntu /bin/bash
7fb2253c974113452a534b0b423e5d62ca45243272f68f6f36726f3b71088816
sysnet@docker-host:~#
# docker0 인터페이스와 연결된 veth 인터페이스 확인
sysnet@docker-host:~$ ip link show |grep docker0
3: docker0: mtu 1500 qdisc noqueue state UP mode DEFAULT
7: veth6e8b8d1@if7: mtu 1500 qdisc noqueue master docker0 state UP mode DEFAULT
sysnet@docker-host:~#
# 컨테이너가 브릿지 네트워크에 연결된 상태 확인
sysnet@docker-host:~$ docker network inspect bridge
[
{
"Name": "bridge",
"Id": "1d732a1c4f67d124eebfa1ccc19c299f9e0ed88f5f429f7bc5f4d6c263f9d599",
"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,
"Containers": {
"7fb2253c974113452a534b0b423e5d62ca45243272f68f6f36726f3b71088816": {
"Name": "network-test",
"EndpointID": "d434340768b76da42f9d61da848aa197111826c38eaca05886bca17c42123de3",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/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": {}
}
]
sysnet@docker-host:~#
# 컨테이너에 접속하여 네트워크 설정 확인
sysnet@docker-host:~$ docker attach network-test
root@7fb2253c9741:/#
root@7fb2253c9741:/# export http_proxy="http://10.144.1.10:8080"
root@7fb2253c9741:/#
root@7fb2253c9741:/# apt-get update
root@7fb2253c9741:/# apt-get install -yqq inetutils-ping
root@7fb2253c9741:/# apt-get install -yqq iproute
root@7fb2253c9741:/# apt-get install -yqq net-tools
root@7fb2253c9741:/#
root@7fb2253c9741:/# ifconfig -a
eth0 Link encap:Ethernet HWaddr 02:42:ac:11:00:02
inet addr:172.17.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:acff:fe11:2/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:10951 errors:0 dropped:0 overruns:0 frame:0
TX packets:7358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:26672806 (26.6 MB) TX bytes:495091 (495.0 KB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
root@7fb2253c9741:/#
root@7fb2253c9741:/# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.17.0.1 0.0.0.0 UG 0 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
root@7fb2253c9741:/#
# 게이트웨이로의 연결 테스트
root@7fb2253c9741:/# ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: icmp_seq=0 ttl=64 time=0.235 ms
64 bytes from 172.17.0.1: icmp_seq=1 ttl=64 time=0.254 ms
^C--- 172.17.0.1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.235/0.244/0.254/0.000 ms
root@7fb2253c9741:/#
# 외부 인터넷 연결 테스트
root@7fb2253c9741:/# ping www.google.com
PING a-0001.a-msedge.net (142.250.185.78): 56 data bytes
64 bytes from 142.250.185.78: icmp_seq=0 ttl=108 time=205.742 ms
64 bytes from 142.250.185.78: icmp_seq=1 ttl=108 time=207.676 ms
^C--- a-0001.a-msedge.net ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max/stddev = 205.742/206.709/207.676/0.967 ms
root@7fb2253c9741:/# [sysnet@docker-host:~]#
sysnet@docker-host:~#
4. 호스트 모드
Docker는 리눅스의 네임스페이스를 사용하여 리소스를 격리합니다.
기본 브릿지 모드에서 Docker 컨테이너는 일반적으로 독립적인 Network 네임스페이스를 할당받습니다. 하지만 컨테이너를 시작할 때 호스트 모드를 사용하면 해당 컨테이너는 독립적인 Network 네임스페이스를 얻지 않고 호스트와 동일한 네임스페이스를 공유합니다.
컨테이너는 가상 네트워크 카드를 생성하거나 자체 IP 주소를 구성하지 않으며, 대신 호스트의 IP와 포트를 사용합니다.
예: docker run -d -ti --network=host centos
# 호스트 모드로 CentOS 컨테이너 실행
sysnet@docker-host:~$ docker run -d -ti --network=host centos
5d9e68b2280b4e8129f3ef6ea301525b8ea4673edcb21a760c446d27d909d615
sysnet@docker-host:~#
# 실행 중인 컨테이너 확인
sysnet@docker-host:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5d9e68b2280b centos "/bin/bash" 29 seconds ago Up 28 seconds strange_curie
sysnet@docker-host:~#
# 컨테이너 내부에서 네트워크 인터페이스 확인
sysnet@docker-host:~$ docker exec 5d9e68b2280b ip addr show
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:a9:38:21 brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
valid_lft 81099sec preferred_lft 81099sec
inet6 fe80::d98c:9835:def1:e78c/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: enp0s8: mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:fd:4e:ba brd ff:ff:ff:ff:ff:ff
inet 192.168.56.200/24 brd 192.168.56.255 scope global noprefixroute enp0s8
valid_lft forever preferred_lft forever
inet6 fe80::88ff:3d9c:8b12:a290/64 scope link noprefixroute
valid_lft forever preferred_lft forever
4: virbr0: mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:50:56:94 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
5: virbr0-nic: mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
link/ether 52:54:00:50:56:94 brd ff:ff:ff:ff:ff:ff
6: docker0: mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:dc:b1:eb:1f brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:dcff:feb1:eb1f/64 scope link
valid_lft forever preferred_lft forever
sysnet@docker-host:#