[Docker] 네트워크의 이해

[Docker] 네트워크의 이해

안녕하세요? 정리하는 개발자 워니즈입니다. 지난 시간에 도커의 설치 및 사용법에 대해서 알아봤는데요. 오늘은 도커의 네트워크가 어떻게 이루어져 있는지를 간단한 구성도와 예제를 통해 알아보려고 합니다.:smile:

1. 네트워크 드라이버

도커의 네트워크 방식은 크게 4가지입니다.

  • 브릿지 네트워크

    docker의 기본 network 방식은 bridge 이다.
    docker daemon을 실행하면 먼저 docker0 라는 bridge가 생성된다.
    컨테이너 생성하게 되면, 각 컨테이너 마다 고유한 network namespace 영역이 하나씩 생성되며,
    이때 docker0 bridge에 container의 인터페이스들이 하나씩 binding 되는 구조이다.

    docker bridge network

  • 호스트 네트워크

    host 방식으로 컨테이너를 생성하면, 컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용하게 된다.
    (네트워크 외 다른 환경은 기존과 동일하다)
    컨테이너 생성시 –net=host 옵션을 이용하면 된다.

  • 컨테이너

    이 방식으로 생성된 컨테이너는 기존에 존재하는 다른 컨테이너의 network 환경을 공유하게 된다.

  • none

    –net=none 옵션으로 컨테이너를 생성하면 격리된 네트워크 영역을 갖긴 하지만, 인터페이스가 없는 상태로 컨테이너를 생성하게 된다.

2. nginx 실행하기

간단한 예제로 네트워크를 알아보기 위해서 nginx image를 pull받고 실행하여 살펴보도록 하겠습니다.

docker pull nginx

Docker Container 구동

docker run -d --name my-nginx -p 8080:80 nginx
  • **–name**: Container 명 지정
  • **-p**:컨테이너 포트 지정(8080으로 접속시 80으로 포트포워딩)

접속 확인

curl http://127.0.0.1:8080

브라우저에서 http://127.0.0.1:8080

컨테이너 정보

# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
e2a871a929e8        nginx               "nginx -g 'daemon of…"   3 minutes ago       Up 3 minutes        0.0.0.0:8080->80/tcp   my-nginx

# docker container inspect e2a871a929e8

3.브릿지 네트워크(Default)

Dockr bridge network

브라우저에서 http://127.0.0.1:8080 입력시 어떤 과정으로 컨테이너 안으로 접속했는지에 대해 알아봅시다.

  1. Host에 8080으로 요청이 들어옵니다.
  2. 들어온 요청은 Host에 구성된 NAT 테이블을 통해 HostIP:8080 -> ContainerIP:80으로 변환됩니다.
  3. 변환된 ContainerIP:80는 Docker0이라는 가상네트워크 인터페이스가 Subnet 172.17.0.1/16으로 구성되어 있으므로 172.17.0.2의 IP로 접근가능하게 됩니다.

기동된 Container의 네트워크 정보를 살펴보면 위에서 설명한 내용되로 구성되어 있음을 확인 할 수 있습니다.

  • NAT 정보

iptables -t nat -L -n로 출력된 내용중
DNAT tcp — 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.17.0.2:80
부분을 확인할 수 있습니다.

# iptables -t nat -L -n
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCAL

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCAL

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0           
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:80

Chain DOCKER (2 references)
target     prot opt source               destination         
RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.2:80

bridge network정보
docker network inspect bridge 명령을 통해 네트워크 정보를 살펴보면
contaner network는 “Subnet”: “172.17.0.1/16”, “Gateway”: “172.17.0.1” 으로 구성되며, Gateway 역할을 하는 인터페이스 네트워크는 docker0임을 알수 있습니다.

# docker network inspect bridge

[
    {
        "Name": "bridge",
        "Id": "f7ab26d71dbd6f557852c7156ae0574bbf62c42f539b50c8ebde0f728a253b6f",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.1/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Containers": {
            "3386a527aa08b37ea9232cbcace2d2458d49f44bb05a6b775fba7ddd40d8f92c": {
                "Name": "networktest",
                "EndpointID": "647c12443e91faf0fd508b6edfe59c30b642abb60dfab890b4bdccee38750bc1",
                "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": "9001"
        },
        "Labels": {}
    }
]

4. 마치며

이상으로 Docker 네트워크에 대해서 알아봤습니다. 위에서 설명한 Docker의 네트워크 구조는 docker가 지원하는 방식 중 bridge 모드에 대한 설명이다. bridge 모드는 dokcer 네트워크의 default 설정이자 가장 많이 쓰이는 방식이다.
다음시간에는 Docker Volume에 대해서 정리를 해보도록 하겠습니다.

워니즈 블로그
워니즈 깃헙

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다