이번 장에서는 컨테이너의 네트워크 구성시 사용되는 도커 네트워크중
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 |