본문 바로가기
  • 노션에서 삽질한 내용을 정리하는 블로그
자기발전소/# Docker and K8s

Docker 공부: Docker Network

by iamlucia 2020. 9. 21.

 

Docker on OpenStack 네트워크

 

도커 설치 전 인스턴스 네트워크 이더넷 상태 

도커 설치 직후 인스턴스 네트워크 이더넷 상태 : docker 0 생성 

 

도커 네트워크 : 기본으로 생성되는 삼총사 네트워크 

 

 

docker network inspect none
root@master:/home/ubuntu# docker network inspect none
[
    {
        "Name": "none",
        "Id": "ccd990d3b13996325502765935790e9b33f055584714cdd22419f4620bef45b9",
        "Created": "2020-09-22T12:16:40.606411834Z",
        "Scope": "local",
        "Driver": "null",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

 

docker network inspect bridge
root@master:/home/ubuntu# docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "9ba861425364a0d3084b972f830d09f3fed1a0c59e8fff2e1fb610803e70eb5f",
        "Created": "2020-09-22T12:16:42.986616683Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": 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": {}
    }
]

 

docker network inspect host
[
    {
        "Name": "host",
        "Id": "e8f710b4fbad710fdf9429331b71cded0a1c0503e6561db82ba40cb8e3eff074",
        "Created": "2020-09-22T12:16:41.506699668Z",
        "Scope": "local",
        "Driver": "host",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": []
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

 

도커 컨테이너 (nginx) 실행 후 호스트 노드 이더넷  : 상 veth 생성

 

브리지 네트워크 상태 확인 : 가상 인터페이스veth이 docker0에 연결되어 있음 

 

실행 중인 해당 컨테이너 접속하여 확인 : 기본 이더넷 상태 eth0(docker0과 같은 대역)

 

컨테이너의 게이트웨이 확인: 172.17.0.1  즉,  컨테이너 호스트 노드의 docker0 가 게이트웨이 

 

도커 스웜 시작 후 매니저 노드의 호스트 이더넷: docker_gwbridge생성 (172.18.0.1)

도커 스웜 시작 후 워커 노드의 호스트 이더넷: docker_gwbridge생성 (172.18.0.1)

 

docker network inspect docker_gwbridge
root@master:/home/ubuntu# docker network inspect docker_gwbridge
[
    {
        "Name": "docker_gwbridge",
        "Id": "55b13c3da0bdd3d9072bdc8a8ecca0b3b41c476dd24f57cba670f8e64717343b",
        "Created": "2020-09-22T12:24:22.98450816Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.enable_icc": "false",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.name": "docker_gwbridge"
        },
        "Labels": {}
    }
]

 

스웜모드 서비스 실행 후 매니저 노드 이더넷 : veth 하나 더 추가 됨 

 

스웜 모드 서비스 추가 (scale)하면 그차이 만큼 추가되어 실행 : 그림 속 4/5 & 5/5 

 

 

서비스 생성과 함게 사라진 이더넷

 

 

도커 스웜 모드로 스택 구축 전 오버레이 네트워크 생성 

 

도커 네트워크 생성은 호스트 이더넷에 영향을 주지 않음 

 

스택 서비스 생성 후 워커 노드에 veth 생성

 

스택 서비스 생성 후 매니저 노드에 veth 하나 생성 

 

스택으로 nginx와 함께 배포한 haproxy 기능 확인
더보기
version: '3'

services:
  nginx:
    image: nginx
    deploy:
version: '3'

services:
  nginx:
    image: nginx
    deploy:
      replicas: 4
      placement:
        constraints: [node.role != manager]
      restart_policy:
        condition: on-failure
        max_attempts: 3
    environment:
      SERVICE_PORTS: 80
    networks:
      - web

  proxy:
    image: dockercloud/haproxy
    depends_on:
      - nginx
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    ports:
      - 8003:80
    networks:
      - web
    deploy:
      mode: global
      placement:
        constraints: [node.role == manager]

networks:
  web:
    external: true

 

 

도커 스웜 스택으로 배포된 컨테이너의 이더넷

 

도커 스웜 스택 모드로 구축된 컨테이너 라우팅 표

 

도커 스웜 모드 스택 서비스 배포 후 web 오버레이 네트워크 정보 
root@manager:~/swarm# docker network inspect web
[
    {
        "Name": "web",
        "Id": "ht5eylfv97syxgq4gola08kai",
        "Created": "2020-09-20T05:08:31.641625003Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.1.0/24",
                    "Gateway": "10.0.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "d9dc493fe06c34d5745c64f2a9cce5f80d31c4eaa94629594e2b7a3b7671d2a9": {
                "Name": "web_proxy.hhcpv43uof7ehl7izasfoojth.qoa0516lx7cxjnt5vbgy8xamc",
                "EndpointID": "b62126d3867d9668f088d6f90ab552d70ecbf1682079b31d4379a0349c08611c",
                "MacAddress": "02:42:0a:00:01:0a",
                "IPv4Address": "10.0.1.10/24",
                "IPv6Address": ""
            },
            "lb-web": {
                "Name": "web-endpoint",
                "EndpointID": "96d1bf5260313e30bb21cfc7e847ca9271f4236bfe3d6c7121fce443221cce59",
                "MacAddress": "02:42:0a:00:01:0b",
                "IPv4Address": "10.0.1.11/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4097"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "464d79eeec9b",
                "IP": "100.0.0.183"
            },
            {
                "Name": "fa5a657818b5",
                "IP": "100.0.0.61"
            },
            {
                "Name": "62dc11333319",
                "IP": "100.0.0.131"
            }
        ]
    }
]

 

도커 스택 현황 

 

비주얼라이저로 스웜 모드 서비스 배포 상태 확인 

도커 스웜 스택 (wordpress와 mysql) 5쌍 배포 결과 

워드프레스 및 db 배포 후 호스트 노드 이더넷 

 

db컨테이너 생성되면서 마운트 포인트에 생성된 디렉토리 확인 

스택 배포 후 매니저 노드 브리지 상태 : 도커 스웜모드에서 배포된 모든 컨테이너의 인터페이스의 게이트웨이는 모두 docker_gwbridge

 

스택 배포 후 매니저 노드 routing 테이블
무언가 새롭게 생긴..게이트웨이와 destination.. -> 추가 공부 필요 ,도커관련이 아닌 호스트에 연관된 라우팅표인가 

 

도커 스웜 스택 글로벌 배포 후 상황 (한 노드에 한 쌍씩)

 

글로벌 배포 후 호스트 노드 이더넷 상황

 

도커 스웜 모드 ingress 네트워크  inspect 결과
[
    {
        "Name": "ingress",
        "Id": "pzxbnmuoi05gumxguxkf0choq",
        "Created": "2020-09-20T04:28:38.343927817Z",
        "Scope": "swarm",
        "Driver": "overlay",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "10.0.0.0/24",
                    "Gateway": "10.0.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": true,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "ingress-sbox": {
                "Name": "ingress-endpoint",
                "EndpointID": "327b3ff7728b36dddd3190cdd21d121b2773ff5866465ac34feb40899411f7fc",
                "MacAddress": "02:42:0a:00:00:02",
                "IPv4Address": "10.0.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.driver.overlay.vxlanid_list": "4096"
        },
        "Labels": {},
        "Peers": [
            {
                "Name": "62dc11333319",
                "IP": "100.0.0.131"
            },
            {
                "Name": "fa5a657818b5",
                "IP": "100.0.0.61"
            },
            {
                "Name": "464d79eeec9b",
                "IP": "100.0.0.183"
            }
        ]
    }
]

 

글로벌 배포 후 각 노드의 공인IP:8004로 접속 

 

글로벌 배포 후 매니저 노드 호스트의 db 컨테이너 ip a

글로벌 배포 후 매니저 노드 호스트의 wordpress 컨테이너 ip a

그나저나 워드프레스 접속 어떡하죠,,


글로벌 배포 후 비주얼라이저 확인: haproxy로 로드밸런싱 기능 시도 

 

스웜모드의 로드밸런싱 기능 확인을 위한 워드프레스 php 파일 수정 

 

글로벌 서비스 배포 후 매니저 노드의 이더넷 상황 다시 확인 

글로벌 서비스 배포 후 워커 노드의 이더넷 상황 다시 확인 

워커 노드의 브릿지 상태 

워커 노드의 ifconfig