[Docker] 네트워크의 이해
[Docker] 네트워크의 이해
안녕하세요? 정리하는 개발자 워니즈입니다. 지난 시간에 도커의 설치 및 사용법에 대해서 알아봤는데요. 오늘은 도커의 네트워크가 어떻게 이루어져 있는지를 간단한 구성도와 예제를 통해 알아보려고 합니다.:smile:
1. 네트워크 드라이버
도커의 네트워크 방식은 크게 4가지입니다.
- 브릿지 네트워크
docker의 기본 network 방식은 bridge 이다.
docker daemon을 실행하면 먼저 docker0 라는 bridge가 생성된다.
컨테이너 생성하게 되면, 각 컨테이너 마다 고유한 network namespace 영역이 하나씩 생성되며,
이때 docker0 bridge에 container의 인터페이스들이 하나씩 binding 되는 구조이다. - 호스트 네트워크
host 방식으로 컨테이너를 생성하면, 컨테이너가 독립적인 네트워크 영역을 갖지 않고 host와 네트워크를 함께 사용하게 된다.
(네트워크 외 다른 환경은 기존과 동일하다)
컨테이너 생성시 –net=host 옵션을 이용하면 된다. - 컨테이너
이 방식으로 생성된 컨테이너는 기존에 존재하는 다른 컨테이너의 network 환경을 공유하게 된다.
- none
–net=none 옵션으로 컨테이너를 생성하면 격리된 네트워크 영역을 갖긴 하지만, 인터페이스가 없는 상태로 컨테이너를 생성하게 된다.
2. nginx 실행하기
간단한 예제로 네트워크를 알아보기 위해서 nginx image를 pull받고 실행하여 살펴보도록 하겠습니다.
1 2 |
docker pull nginx |
Docker Container 구동
1 2 |
docker run -d --name my-nginx -p 8080:80 nginx |
- **–name**: Container 명 지정
- **-p**:컨테이너 포트 지정(8080으로 접속시 80으로 포트포워딩)
접속 확인
1 2 3 4 |
curl http://127.0.0.1:8080 브라우저에서 http://127.0.0.1:8080 |
컨테이너 정보
1 2 3 4 5 6 |
# 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)
브라우저에서 http://127.0.0.1:8080 입력시 어떤 과정으로 컨테이너 안으로 접속했는지에 대해 알아봅시다.
- Host에 8080으로 요청이 들어옵니다.
- 들어온 요청은 Host에 구성된 NAT 테이블을 통해 HostIP:8080 -> ContainerIP:80으로 변환됩니다.
- 변환된 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
부분을 확인할 수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# 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임을 알수 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# 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에 대해서 정리를 해보도록 하겠습니다.