컨테이너/도커

도커 네트워크

비니화이팅 2022. 10. 18. 02:03

도커 네트워크

 

 

  • 컨테이너는 기본적으로 eth0, lo 네트워크 인터페이스를 가지고 있음
  • 컨테이너에 172.17.0.0/16 대역의 프라이빗 IP 주소가 eth0에 자동으로 할당
  • 컨테이너는 내부 IP를 순차적으로 할당하며 컨테이너가 재시작될때마다 변경
  • 외부와 연결할 경우에는 호스트에 veth라는 네트워크 인터페이스를 생성하고 컨테이너의 eth와 연결(도커엔진에 의해 자동으로 veth 인터페이스 생성)
    • docker() 브리지가 veth인터페이스와 바인딩되어 호스트의 eth 인터페이스와 연결
    • NAPT 기능을 이용 → 도커에서는 NAPT에 리눅스의 iptables를 사용
    • Ex) 컨테이너 내 웹서버가 사용하는 80번 포트를 호스트 OS의 8080 포트로 전송하도록 설정

5가지 네트워크 구현 방식

Bridge

  • 도커의 기본 네트워크 방식
  • 도커 데몬을 실행하게 되면 docker0이라는 브리지가 생성
    • 컨테이너 생성 시 각 컨테이너마다 고유한 네트워크 네임스페이스 영역이 하나씩 생성되며 docker0 브리지에 컨테이너의 인터페이스들이 하나씩 binding
docer network inspect bridge

Host

  • 컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용
  • 컨테이너 생성 시 --net=host 옵션 이용
docker run --net=host httpd web01

Container

  • 기존에 존재하는 다른 컨테이너의 네트워크 환경을 공유
docker run --name web02 -d httpd
docker run --name web03 --net=containere1b4a085348e -d httpd

Overlay

  • 인터페이스를 하나 만들어서 각 호스트의 도커 컨테이너들이 해당 채널을 통해서 통신할 수 있도록 설정
  • 같은 L2(MAC) 네트워크에 연결되어 있지 않은 서버들이 서로 L2 통신을 할 수 있도록 터널링 등의 기술 활용

None

  • 격리된 네트워크 영역을 갖긴 하지만 인터페이스가 없는 상태로 컨테이너 생성
docker run --name web04 --net=none -d httpd

도커 네트워크 목록 표시(docker network ls)

  • docker network ls [옵션]
hbeen@DESKTOP-EDC39JU:~$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
7e03ee90497d   bridge    bridge    local
2f605ac99eb3   host      host      local
13ee1402811c   none      null      local
  • 도커는 기본 값으로 bridge, host, none 네트워크를 만듬

네트워크 상세 정보 확인(docker network inspect)

  • docker network inspect [옵션] [네트워크]
hbeen@DESKTOP-EDC39JU:~$ docker network inspect web-network
[
    {
        "Name": "web-network",
        "Id": "48e2f2e57083cb631d25788a46181af785c1e924432eea1361ba7d6f79b2af5f",
        "Created": "2022-02-13T06:50:41.7420944Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "b5b62df9e5748177b00a4f8144be9b9522b9d636409b9ddcd359a92124a3f6f9": {
                "Name": "sad_cannon",
                "EndpointID": "5381c791de68fb3205911835e579df8474ef8dae0c004314417ee3e980eefbb1",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

사용자 정의 네트워크 작성(docker network create)

  • docker network create [옵션] [네트워크 이름]

옵션

  • -d : 네트워크 브리지 또는 오버레이
  • --ip-rage : 할당하는 IP 주소 범위 지정
  • --subnet : 서브넷 지정
  • -label : 네트워크 설정하는 라벨
//web-network라는 이름의 브리지 네트워크 작성
hbeen@DESKTOP-EDC39JU:~$ docker network create --driver=bridge web-network
48e2f2e57083cb631d25788a46181af785c1e924432eea1361ba7d6f79b2af5f

hbeen@DESKTOP-EDC39JU:~$ docker network ls
NETWORK ID     NAME          DRIVER    SCOPE
7e03ee90497d   bridge        bridge    local
2f605ac99eb3   host          host      local
13ee1402811c   none          null      local
48e2f2e57083   web-network   bridge    local

네트워크 연결(docker netowrk connect/docker network disconnect)

  • docker network connect [옵션] [네트워크 컨테이너]
    • 연결 후에는 동일한 네트워크 상에 있는 다른컨테이너와 통신 가능

옵션

  • --ip : ipv4 주소
  • --alais : 앨리어스 명
  • --link : 다른 컨테이너에 대한 링크
    • 같은 호스트에 있는 컨테이너를 연결하여 호스트에 포트를 노출시키지 않아도 직접 통신할 수 있게 해줌
    • 멀티호스트에서는 지원하지 않음
hbeen@DESKTOP-EDC39JU:~$ docker network connect web-network b5b62df9e574

네트워크 삭제(docker network rm)

  • docker network rm [옵션] [네트워크]