Search
Duplicate
📒

[Docker Container] 05-1. 도커 네트워크 원리

상태
미진행
수업
Docker Container
주제
Docker
연관 노트
3 more properties
참고

Docker Network 원리

NOTE
Docker network ⇒ 커널의 네트워크 스택의 하위로, 상위에는 네트워크 드라이버를 생성한다! ⇒ 즉, docker network = Linux network
Docker network 아키텍쳐CNM(Container Networking Model)이라고 하는 인터페이스 위에서 구축한다.
OS 및 인프라에 구애 받지 않으므로 인프라 스택과 관련없이 동일한 환경을 가질 수 있다.
리눅스 네트워킹 블록
Linux bridge, Network namespace, veth(가상 이더넷 인터페이스) pair iptable를 포함
이 조합으로 복잡한 네트워크 정책을 위한 규칙, 분할 및 관리도구를 제공한다.

Linux bridge

NOTE
Linux bridge ⇒ 커널 내부의 물리적 스위치를 가상으로 구현한 OSI Layer 2 Device!
Linux bridge 이미지, VM1, VM2, network namespace 1은 브릿지를 통해 서로 통신이 가능해진다.
트래픽을 검사하여 동적으로 학습되는 MAC 주소를 기반으로 트래픽 전달한다.
Docker는 기본적으로 172.17.0.x 범위의 IP에 지정된다.
bridge network의 기본 대역폭
172-{17-31}.0.0/16 (65536)
192.168.{0-240}.0/20(4096)

Network namespace

NOTE
이미지 처럼, 격리된 네트워크 공간을 만드는 것!
커널에 격리된 네트워크 스택으로 자체 인터페이스, 라우트 및 방화벽 규칙을 보유
컨테이너와 리눅스의 보안적인 측면으로, 컨테이너 격리에 사용
일반적으로 CNM 네트워크 드라이버는 각 컨테이너에 별도의 네임스페이스 구현

CNM, libnetwork

NOTE
CNM의 전체적인 구성
CNM은 Sandbox, Endpoint, Network로 구성된다
Sandbox
container의 네트워크 스택 구성을 포함한다.
네트워크 스택(container network interface, routing table, DNS 설정 등)
Linux network namespace와 유사한 개념으로 구현될 수 있다.
Endpoint
Sandbox를 Network에 연결한다.
Endpoint는 veth pair(eth-veth pair), Open vSwitch 와 유사한것으로 구현된다.
Network
서로 직접 통신할 수 있는 Endpoint 그룹이다.
Linux bridge, VLAN 등으로 구현될 수 있다.
흠.. 뭔소리지

veth(virtual ethernet device)

NOTE
랜카드에 연결된 실제 네트워크 인터페이스가 아니라 가상으로 생성한 네트워크 인터페이스!
전체적인 흐름 (아래에서 위로)
생성되는 도커 컨테이너는 namespace로 격리되고 컨테이너 1개당, veth가 하나 할당된다고 생각하면 된다.
docker0 네트워크에 컨테이너 2개가 연결되어있다. (veth가 2개 생성됨)
veth는 각 네임스페이스에 단일 인터페이스가 있는 전이중 링크(full duplex link)
도커 네트워크를 만들 때 도커 네트워크 드라이버는 veth를 사용하여 네임스페이스간에 명시적 연결을 제공한다.

Docker Network 옵션

NOTE
도커 네트워크 설정 옵션
# Container DNS 서버 설정 docker run -it --dns=8.8.8.8 centos bash cat /etc/resolv.conf # Container MAC Address 설정 docker run -d --mac-address="92:d0:c6:0a:29:33" centos:7 docker inspect --format="{{ .Config.MacAddress }}" c268f1 # Host 명과 IP Address 설정 docker container run -it --add-host=fastcampus.co.kr:192.168.0.100 centos:7 bash cat /etc/hosts
Bash
복사
docker run -d -P --name=myweb --expose=40001 nginx:1.25.0 docker port myweb docker ps | grep myweb sudo netstat -nlp | grep 32773 // 앞서 본 proxy port 확인 ps -ef | grep 75516 // 프로세스 확인
Java
복사
docker-proxy
각 port로 연결해주는 proxy가 생성된다. 80 port = 32769 port
kernel이 아닌 사용자 환경에서 수행되기 떄문에 kernel과 상관없이 host가 받은 패킷을 그대로 container의 port로 전달.
port를 외부로 노출하도록 설정하면, docker host에는 docker-proxy라는 프로세스가 자동으로 완성

docker network overlay

NOTE
overlay network ⇒ 서로 다른 Host(node)에서 서비스되는 컨테이너를 네트워크로 연결하는데 사용
Host간 연결을 담당해줌!
네트워크로 연결된 여러 Docket Host안에 있는 Docker Daemon간의 통신을 관리하는 가상 네트워크다.
컨테이너는 overlay network의 서브넷에 해당하는 IP 대역을 할당받고, 받은 IP를 통해 상호간의 통신한다.
overlay network에 포함되어 있는 모든 컨테이너들은 서로 다른 Docker Host와 통신이 가능하다.
도커 네트워크는 도커 컨테이너 간의 통신을 관리하는 데 사용되는 매우 중요한 기능입니다. 도커 네트워크를 사용하면 도커 컨테이너를 연결하고 통신할 수 있습니다. 다양한 네트워크 유형이 있어서 다양한 상황에 맞게 선택할 수 있습니다.
일반적으로 도커 네트워크는 다음과 같은 목적으로 사용됩니다:
1.
컨테이너 간 통신: 도커 네트워크를 사용하여 도커 컨테이너 간에 통신할 수 있습니다. 이를 통해 서로 다른 컨테이너 간에 데이터를 전송하고 서비스를 제공할 수 있습니다.
2.
인터넷 연결: 도커 컨테이너를 인터넷에 연결하고 외부와 통신할 수 있습니다. 이를 통해 웹 서버나 데이터베이스 등의 서비스를 호스트할 수 있습니다.
3.
서비스 발견: 도커 네트워크를 사용하여 컨테이너가 서로를 발견하고 통신할 수 있습니다. 이를 통해 마이크로서비스 아키텍처를 구현하고 서비스를 확장할 수 있습니다.
도커 네트워크는 기본적으로 브리지, 호스트, 오버레이 등의 다양한 유형이 있습니다. 각 유형은 특정한 용도에 맞게 설계되었으며, 다음과 같은 특징을 가지고 있습니다:
브리지 네트워크: 기본적으로 도커가 생성하는 네트워크로, 컨테이너 간에 통신할 수 있도록 연결해줍니다. 이 네트워크는 호스트 시스템의 네트워크와 분리되어 있습니다.
호스트 네트워크: 컨테이너를 호스트의 네트워크와 공유하여 외부와 직접 통신할 수 있도록 해줍니다. 이 경우 컨테이너는 호스트의 IP 주소를 사용하여 통신합니다.
오버레이 네트워크: 여러 호스트에 분산된 컨테이너 간에 네트워크 통신을 제공하는 가상 네트워크입니다. 오버레이 네트워크는 다수의 도커 호스트 간에 컨테이너를 연결할 때 유용합니다.
도커 네트워크는 도커의 핵심 기능 중 하나이며, 컨테이너화된 애플리케이션의 네트워킹을 관리하는 데 필수적입니다. 따라서 도커를 사용하는 개발자나 시스템 관리자는 도커 네트워크에 대한 이해를 가지고 있어야 합니다.