본문 바로가기

Container/Docker

13. Docker Network Overview

이번 장에서는  컨테이너의 네트워크 구성시 사용되는 도커 네트워크중 
 
default 로 사용되는 bridge 네트워크에 대한 구조를 설명한다.
 
 
가상 네트워크의 종류
 
Host-Only 
 
외부와 단절된 내부 네트워크로 구성된 가상머신들끼리만 통신이 가능하다.
 
NAT
 
호스트 PC 로부터 IP 를 할당 받아 가상머신 프로그램이 자체 DHCP 서버를 띄워 
 
내부 네트워크 대역 할당 및 통신을 한다. 호스트 PC 를 통해서 외부 네트워크와 통신이 가능하다.
 
BRIDGE
 
공유기로부터 IP 를 항당받아 호스트 PC 와 동일한 네트워크 대역의 IP 를 가지게 된다.
 
공유기를 통해 외부 네트워크와 통신이 가능하다.
 
 
 
Bridge Network
 
 
일반적으로 컴퓨터에는 물리적인 네트워크 인터페이스가 설치되어 있다.
 
아래 그림과 같이  pNIC(Physical Network Interface Card) 로 표현한 인터페이스 카드를 통해 
 
물리적으로 스위치와 컴퓨터를 연결하며 컴퓨터는 pNIC 를 통해
 
스위치에 패킷을 보내고 스위치는 이를 인터넷으로 전송한다.
 
 
Docker Bridge Network (Default)
 
 
도커를 설치하면 "docker0" 이라고 하는
 
소프트웨어로 구현한 가상 스위치 ( Virtual Switch ) 가 생성된다.
 
 
아래와 같이 확인해 볼 수 있다.
 
$ sudo ifconfig docker0
docker0   Link encap:Ethernet  HWaddr 02:42:9a:9d:12:6a  
          inet addr: 172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0
          inet6 addr: fe80::42:9aff:fe9d:126a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:62 errors:0 dropped:0 overruns:0 frame:0
          TX packets:96 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:5347 (5.3 KB)  TX bytes:12005 (12.0 KB)
 
 
vSwitch 의 IP 는 자동으로 172.17.0.1 로 설정 되며 16 bit netmask(255.255.0.0) 로 설정된다.
 
그리고 컨테이너가 하나 생성되면 172.17.0.2 라는 Private IP 를 컨테이너에 하나 발급해 준다.
 
두번째 컨테이너가 생성되면 172.17.0.3 이라는 Private IP 를 컨테이너에 발급해 줄 것이다. 
 
 
실제로 그런지 한번 확인해 보자.
 
brctl 로 찍어보면 docker0 스위치를 사용하고 있는 interfaces 를 확인해 볼 수 있고
 
ifconfig 에서 해당 이름으로 검색해 보면 되겠다.
 
# 아래와 같이 두 개의 컨테이너가 실행중일 때
$  docker container ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS             ..
40df1de919ba        nginx:latest        "nginx -g 'daemon of…"   36 minutes ago      Up 36 minutes 
b9b966b4105e        mongo               "docker-entrypoint.s…"   24 hours ago        Up 24 hours      
 
# vethXXXX 형태의 interface가 docker0 브릿지에 binding 된 상태로 생성된 것을 볼 수 있다.
$ sudo apt-get install bridge-utils
$ sudo brctl show docker0
bridge name    bridge id        STP enabled    interfaces
docker0        8000.02429a9d126a    no        veth2ba1aba
                                                            vethcb1f6a7
 
# 실제로 IP 할당 된 부분도 간단히 아래와 같이 확인해 볼 수 있다.
$ docker container inspect --format '{{ .NetworkSettings.IPAddress}}' mongo
172.17.0.2
 
$ docker container inspect --format '{{ .NetworkSettings.IPAddress}}' webhost
172.17.0.3
 
 
 
Docker NAT Network
 
NAT 네트워크는 다른말로 호스트 네트워크라고도 한다.
 
내부 네트워크에서는 사설 IP 를 사용하고 외부 네트워크로 나가는 경우
 
공인 IP 주소로 변환되어 나가게 하는 기술이며 공인 IP 주소 부족으로 많이 사용된다.
 
내부에서는 결국 데이터가 들어오고 나갈 때 IP Table 에서 이 과정을 IP 변경을 수행하게 되는데 
 
 
 이런 특징 때문에 컨테이너간에 동일한 포트를 여러번 사용할 수 없게 된다.
 
 
 
Docker Host Only Network
 
이 네트워크를 사용하면 외부와 분리된 네트워크를 가지며
 
외부와 통신이 불가능한 상태가 된다.
 
 
 
User-Defined networks
 
기본적으로 Docker Network 를 구성하면 아래와 같이 Bridge 네트워크를 구성한다.
 
 
만약 사용자가 아래와 같이 컨테이너의 네트워크를 분할하고자 하는 경우 어떻게 해야 할까?
 
 
이 경우 docker network create 명령을 사용하여 자체 내부 네트워크를 만들고 
 
드라이버 ( Bridge , NAT, HostOnly ) 를 지정할 수 있다.
 
# Custom 네트워크 생성
$  docker network create --driver bridge --subnet 182.18.0.0/16 custom-isolated-network
 
# 현재 사용가능한 네트워크 조회
$  docker network ls
 
   
 
 
도커 컨테이너를 특정 네트워크로 연결
$ docker container run --network custom-isolated-network 
 
 
Inspect Network 
 
docker inspect 명령을 사용하여 컨테이너의 네트워크 설정을 확인할 수 있다.
 
$  docker inspect blissful_hopper
 
 
 
Docker Network Lists
 
설치된 도커 엔진이 만들어 놓은 네트워크에 대한 확인은 docker network ls 로 확인할 수 있다.
 
$ docker network ls
NETWORK ID          NAME             DRIVER            SCOPE
d71772f48c76         bridge             bridge             local
625ca034a6a7         host                host                local
a3970a7db0b0        none               null                 local
조회시 나오는 것처럼 로컬에서 사용 가능한 네트워크인 
 
bridge, host, none 라는 네트워크를 도커 설치시 기본적으로 만들어 놓았다.
 
컨테이너는 이렇게 구성해 놓은 네트워크를 사용하거나
 
혹은 새로운 네트워크를 생성하여 컨테이너를 새로운 네트워크에 연결해도 된다.
 
이외에도 기존에 만들어 놓은 container 의 네트워크를 공유하는 방식도 있다.
 
각 네트워크에 물려있는 컨테이너 리스트를 얻고자 하는 경우
 
docker network inspect <networkName> 명령을 사용한다.
 
$ docker container run -p 8080:80 --name webhost -d nginx
fd5f8b016695429180911e3f4dcc44e7f2fcb89094a9bfd0339bb278552d86a1
 
$ docker network inspect bridge
[
    {
        "Name": "bridge",
        ...
        "Containers": {
            "fd5f8b016695429180911e3f4dcc44e7f2fcb89094a9bfd0339bb278552d86a1": {
                "Name": "webhost",
                "EndpointID": "66a8b2b81952204293a6e9c3f6888ea850cfbc8197b72f273435656f4762362a",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        ...
    }
]
 
 

'Container > Docker' 카테고리의 다른 글

15. Docker Network DNS  (0) 2020.01.14
14. Docker Network Test  (0) 2020.01.14
12. Docker Compose  (0) 2020.01.14
11. Docker Container Life Cycle  (0) 2020.01.14
10. Docker Image 생성 (도커파일)  (0) 2020.01.14