ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Docker] Docker Network
    Docker 2022. 2. 28. 23:46

    이 내용은 시작하세요 ! 도커/쿠버네티스 를 공부하면서 정리한 내용을 바탕으로 합니다.

    2.2.7 도커 네트워크

    2.2.7.1 도커 네트워크 구조

    도커 내부는 순차적으로 할당하며 컨테이너가 재시작 할떄마다 변경될 수도 있다. 컨테이너가 생성될 때 호스트에 veth (virtual eth)로 시작하는 인터페이스가 생성됨.

    docker0 이라는 브리지도 존재하는데 이것은 각 veth인터페이스와 바인딩 돼 호스트의 eth0 인터페이스와 이어주는 역활을 함

    2.2.7.2 도커 네트워크 기능

    사용자의 선택에 따라 여러 네트워크 드라이버를 쓸 수 있음.

    도커 자체적으로 제공하는 대표적인 네트워크 드라이버로는

    • brige
    • host
    • none
    • container
    • overlay

    가 있으며 서드파티(third-party)플러그인 솔루셔느로는

    • weave
    • flannel
    • openvswitch

    등이 있다. 더 확장된 네트워크 구성을 위해 활용됨

    docker network ls  # 도커 네트워크의 목록을 확인 
    NETWORK ID     NAME      DRIVER    SCOPE
    145cd169211f   bridge    bridge    local
    eaab83bb97bc   host      host      local
    f7f4724dd3d9   none      null      local
    docker network inspect bridge
    [
        {
            "Name": "bridge",
            "Id": "145cd169211fed0d917d8aa108abfc0f8efc72ffa84c417cc4449c15d29a440f",
            "Created": "2022-02-22T12:47:13.657176667Z",
            "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": {},
            "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": {}
        }
    ]

    브릿지 정보를 확인 할 수 있음

    컨테이너는 자동으로 docker0 브리지를 사용함

    브리지 네트워크

    docker0이 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너 연결하는 네트워크 구조입니다.

    컨테이너는 연결돤 브리지를 통해 외부와 통신할 수 있음

    실습)

    docker network create --driver bridge mybridge  # 새로운 브릿지 내트워크를 생성
    docker run -i -t --name my_network_container --net mybridge ubuntu:18.04
    #  mybridge 네트워크를 사용하는 컨테이너를 생성
    ifconfig  # 새로운 IP 대역이 할당된 것을 알 수 있음
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.18.0.2  netmask 255.255.0.0  broadcast 172.18.255.255
            ether 02:42:ac:12:00:02  txqueuelen 0  (Ethernet)

    172.18 대역의 IP가 할당됨

    docker network disconnect mybridge my_network_container  # 네트워크 끊음
    docker network connect mybridge my_network_container  # 네트워크 다시 연결

    단) 논 네트워크, 호스트 네트워크 등과 같은 특별한 네트워크에는 커맨드 적용 불가

    네트워크의 서ㅏ브넷, 게이트웨이, IP할당 범위 등을 임의로 설정

    docker network create --driver=bridge\\
    --subnet=172.72.0.0/16 \\
    --ip-range=172.72.0.0/24 \\
    --gateway=172.72.0.1 \\
    my_custom_network

    호스트 네티워크

    브리지 드라이버 네트워크와 달리 호스트 드라이버의 네트워크는 별도로 생성할 필요 없이 기존의 host라는 이름의 네트워크를 사용한다

    docker run -i -t --name network_host --net host ubuntu:18.04
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.65.3  netmask 255.255.255.0  broadcast 192.168.65.255
            inet6 fe80::50:ff:fe00:1  prefixlen 64  scopeid 0x20<link>
            ether 02:50:00:00:00:01  txqueuelen 1000  (Ethernet)
            RX packets 54264  bytes 42546243 (42.5 MB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 25564  bytes 2010289 (2.0 MB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    —net 옵션을 입력해 호스트를 설정한 컨테이너 내부에서 네트워크 환경을 확인하면 호스트와 같음

    호스트 머신에서 설정한 소트 이름도 컨테이너 받기 떄문에 컨테이너의 호스트 이름도 무작위 16진수가 아닌 도커 엔진이 설치된 호스트 머신의 호스트 이름으로 설정 됨

    컨테이너 네트워크의 호스트 모드로 설정하면 애플리케이션을 별도의 포트포워딩 없이 바로 서비스를 할 수 있음

    논 네트워크

    none 네트워크는 말그대로 아무런 네트워크를 사용하지 않음( 폐쇄망)

    컨테이너 네트워크

    컨테이너 네티워크 네임스페이스 환경을 공유할 수 있음 공유되는 속성은 내부 IP, 네트워크 인터페이스의 맥 주소 등 —net 옵션의 값으로 container:[다른 컨테이너 ID]와 같이 입력

    docker run -i -t -d --name network_container_1 ubuntu:18.04
    
    docker run -i -t -d --name network_container_2 --net container:network_container_1 ubuntu:18.04

    network_container_2 컨테이너의 네티워크와 관련된 사항은 전부 network_container_1과 같게 설정됨

    두 컨테이너의 eth0에 대한 정보가 완전히 같음

    브리지 네트워크와 —net-alias

    브리지 타입의 네트워크와 run 명령어의 —net-alias 옵션을 함께 쓰면 특정 호스트 이름으로 컨테이너 여러 개에 접근할 수 있음

    docker run -i -t -d --name network_alias_container1 \\
    --net mybridge \\
    --net-alias alicek106 ubuntu:18.04
    
    docker run -i -t -d --name network_alias_container2 \\
    --net mybridge \\
    --net-alias alicek106 \\
    ubuntu:18.04
    
    docker run -i -t -d --name network_alias_container3 \\
    --net mybridge \\
    --net-alias alicek106 \\
    ubuntu:18.04
    docker inspect network_alias_container1 | grep IPAddress
    "SecondaryIPAddresses": null,
                "IPAddress": "",
                        "IPAddress": "172.18.0.2",

    첫 번째 컨테이너 IP주소가 172.18.0.2이므로 두 번째, 세 번째 컨테이너 각각 172.18.0.3, 172.18.0.4 172.18.0.5 일 것입니다. 세 개의 컨테이너에 접근할 컨테이너를 생성한 뒤 alicek106이라는 호스트 이름으로 Ping 요청을 함

    root@5cb387657fa5:/# ping -c 1 alicek106
    PING alicek106 (172.18.0.3) 56(84) bytes of data.
    64 bytes from network_alias_container2.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.165 ms
    
    --- alicek106 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.165/0.165/0.165/0.000 ms
    root@5cb387657fa5:/# ping -c 1 alicek106
    PING alicek106 (172.18.0.4) 56(84) bytes of data.
    64 bytes from network_alias_container3.mybridge (172.18.0.4): icmp_seq=1 ttl=64 time=0.646 ms
    
    --- alicek106 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.646/0.646/0.646/0.000 ms
    root@5cb387657fa5:/# ping -c 1 alicek106
    PING alicek106 (172.18.0.2) 56(84) bytes of data.
    64 bytes from network_alias_container1.mybridge (172.18.0.2): icmp_seq=1 ttl=64 time=0.188 ms
    
    --- alicek106 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.188/0.188/0.188/0.000 ms
    root@5cb387657fa5:/# ping -c 1 alicek106
    PING alicek106 (172.18.0.4) 56(84) bytes of data.
    64 bytes from network_alias_container3.mybridge (172.18.0.4): icmp_seq=1 ttl=64 time=0.344 ms

    컨테이너 3개의 ip로 각각 ping이 전송되는 것을 확인 할 수 있음

    라운드 로빈 방식. 이것이 가능한 이유는 도커 엔진에 내장된 DNS가 alicek106이라는 호스트 이름을 —net-alias 옵션으로 alicek106을 설정한 컨테이너로 변환하기 떄문

    도커의 DNS는 호스트 이름을 유동적인 컨테이너를 찾을 때 주로 사용됨

    가장 대표적인 예가 —link 옵션인데, 이는 컨테이너 IP가 변경돼도 별명으로 컨테이너를 찾을 수 있게 DNS에 의해 자동으로 관리됨 이 경우 디폴트 브리지 네트워크의 컨테이너 DNS라는 점이 다름

    MacVLAN 네트워크

    MacVLAN은 호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 컨테이너에게 동일하게 제공됨

    해당 네트워크 연결된 다른 장치와의 통신이 가능해짐

    실습 TODO

    가상 머신 설치 이슈

    댓글

Designed by Tistory.