본문 바로가기

Micro Service Architecture/Docker

20. Docker Network - Bridge (기본)

반응형

1. docker 초기 네트워크 list : cluster가 아닌 단독 머신

$ docker network ls

NETWORK ID     NAME           DRIVER    SCOPE

102b4a4b9e3c   bridge         bridge    local   # bridge 모드

f77f1779e8f2   host           host      local   # 호스트와 만 통신

66f90b6293cc   none           null      local   # 없음.

 

2. 통신 흐름 (위 그림 참조)
- 외부 → 호스트 eth0 → docker0 (docker bridge) → veth*(docker0 ↔ container 사이의 가상 인터페이스) → container eth0


3. 인터페이스 확인

# 컨테이너 2개가 실행 중이고 새로운 브릿지(test_default)를 생성해 할당

$ docker network ls

NETWORK ID     NAME           DRIVER    SCOPE

102b4a4b9e3c   bridge         bridge    local

f77f1779e8f2   host           host      local

66f90b6293cc   none           null      local

52df863fe389   test_default   bridge    local





# test_default라는 bridge는 br-52df863fe389 라는 이름으로 172.22.0.0/16 대역을 할당하고 172.22.0.1의 게이트웨이 가상 인터페이스

# docker0 은 default bridge 인터페이스 이며 172.17.0.0/16 대역을 할당하고 172.17.0.1 게이트웨이

# veth* 인터페이스 2개는 실행중인 컨테이너 각각 앞단에 위치하는 가상 인터페이스이며 컨테이너 1개한 1개씩 생성 되고 IP 정보가 없다.(크로스 케이블 같은 걸로 연결했다고 생각하면 됨)

$ ifconfig

br-52df863fe389: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 172.22.0.1  netmask 255.255.0.0  broadcast 172.22.255.255

...

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500

        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

...

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet 192.168.6.200  netmask 255.255.255.0  broadcast 192.168.6.255

...

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536

...

veth049da25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::28f3:5dff:fe76:1301  prefixlen 64  scopeid 0x20<link>

...

vethd298970: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

        inet6 fe80::e83d:40ff:feed:fc8f  prefixlen 64  scopeid 0x20<link>

...


# bridge-utils
$ brctl show
bridge name	bridge id		STP enabled	interfaces
br-52df863fe389		8000.0242d41576fe	no		veth049da25
												vethd298970


# network 정보

$ docker network inspect test_default

...

{

        "Name": "test_default",

        "Id": "52df863fe389c04aa0c07d36872b7852f5a99efb3b04913e6f64f93f0a882b7e",

        "Created": "2021-03-24T20:03:25.456471568+09:00",

        "Scope": "local",

        "Driver": "bridge",

        "EnableIPv6": false,

        "IPAM": {

            "Driver": "default",

            "Options": null,

            "Config": [

                {

                    "Subnet": "172.22.0.0/16",

                    "Gateway": "172.22.0.1"

                }

            ]

        },

...

 

4. bridge network 생성

# 172.22.0.0/16 대역으로 172.22.0.1이 게이트웨이인 test_default 이름의 bridge network 생성

$ docker network create \

--driver bridge \

--ip-range 172.22.0.0/16 \

--subnet 172.22.0.0/16 \    # 서브넷은 아이피 범위와 동일. (동일해야함)

--gateway 172.22.0.1 \

test_default

 

5. 컨테이너에 bridge network 할당

# 컨테이너 실행

$ docker run -itd --name=test_nginx_1 --net=test_default -P nginx:latest

$ docker run -itd --name=test_centos7_1 --net=test_default -P ansible/centos7-ansible:latest





# 확인

$ docker ps

CONTAINER ID   IMAGE                            COMMAND                  CREATED       STATUS       PORTS     NAMES

d1bec0c7389d   nginx:latest                     "/docker-entrypoint.…"   4 hours ago   Up 4 hours   80/tcp    test_nginx_1

468b9e8889de   ansible/centos7-ansible:latest   "tail -f /dev/null"      4 hours ago   Up 4 hours             test_centos7_1



# bridge network 정보 확인

$ docker network inspect test_default

...

        "Containers": {

            "468b9e8889de0efeab6658879297cd9b9670b24bb087f703592c1adf12d8c060": {

                "Name": "test_centos7_1",

                "EndpointID": "dd457321f126f0a575658aed30fa43f728903da7a762948702d85a976befdb58",

                "MacAddress": "02:42:ac:16:00:03",

                "IPv4Address": "172.22.0.3/16",

                "IPv6Address": ""

            },

            "d1bec0c7389db541ec982bad00c82eb1b2e59561189ae8ea0e2efdee5a9b967e": {

                "Name": "test_nginx_1",

                "EndpointID": "8e09c4d6a769783d12f3535d5780d17fbbee9e5444b1a538ebc60a92271030e4",

                "MacAddress": "02:42:ac:16:00:02",

                "IPv4Address": "172.22.0.2/16",

                "IPv6Address": ""

            }

        },

...

 

6. ping test : test_centos7_1 → test_nginx_1 로 ping.
- bridge network로 묶여있고 같은 네트워크 대역이라 ping 및 tcp 등 통신이 가능함.

# test_centos7_1 접속

$ docker exec -it test_centos7_1 /bin/bash





# ping test

[root@468b9e8889de ansible]# ping test_nginx_1

PING test_nginx_1 (172.22.0.2) 56(84) bytes of data.

64 bytes from test_nginx_1.test_default (172.22.0.2): icmp_seq=1 ttl=64 time=0.309 ms

64 bytes from test_nginx_1.test_default (172.22.0.2): icmp_seq=2 ttl=64 time=0.078 ms

64 bytes from test_nginx_1.test_default (172.22.0.2): icmp_seq=3 ttl=64 time=0.089 ms

^C

--- test_nginx_1 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2002ms

rtt min/avg/max/mdev = 0.078/0.158/0.309/0.107 ms



# web test

[root@468b9e8889de ansible]# curl test_nginx_1

<!DOCTYPE html>

<html>

<head>

<title>Welcome to nginx!</title>

<style>

    body {

        width: 35em;

        margin: 0 auto;

        font-family: Tahoma, Verdana, Arial, sans-serif;

    }

</style>

</head>

<body>

<h1>Welcome to nginx!</h1>

<p>If you see this page, the nginx web server is successfully installed and

working. Further configuration is required.</p>



<p>For online documentation and support please refer to

<a href="http://nginx.org/">nginx.org</a>.<br/>

Commercial support is available at

<a href="http://nginx.com/">nginx.com</a>.</p>



<p><em>Thank you for using nginx.</em></p>

</body>

</html>

 

 

반응형