도커 가상 네트워크 브릿지

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:#

태그: 도커 가상 네트워크 네트워크 브릿지 컨테이너 네트워크 호스트 모드

5월 29일 20:51에 게시됨