1 분 소요

Network Namespace

  • 네트워크 네임스페이스는 도커와 같이 네트워크 독립성을 위해 사용된다.
  • 호스트를 집으로 상상해보면 네임스페이스는 집 안의 방이다.
  • 방안의 자식들은 자기 방만 볼 수 있고, 부모는 모든 집안을 볼 수 있다.
  • 필요하다면 방을 연결 시킬 수도 있다.
  • 호스트는 라우팅 테이블과 ARP 테이블을 갖는다.
  • 컨테이너는 자신만의 라우팅 테이블과 ARP 테이블을 갖는다.
  • 컨테이너 안의 네트워크는 독자적인 네트워크 체계이다.
# namespace 생성
$ ip netns add red

# namespace 조회
$ ip netns

Process Namespace

  • 호스트 안에 프로스세를 만들고 그 안에 네임스페이스를 줬을떄
  • 컨테이너 안에서 보면 프로세스는 하나이다.
  • 호스트 안에 프로스세를 확인해보면, 컨테이너 안의 프로세스를 포함한 모든 프로스세를 확인 할 수 있다.
  • 같은 프로세스가 다른 ID로 컨테이너 안과 밖에 동작하고 있는 것이다.
  • 이것이 네임스페이스가 동작하는 원리

Exec in Network Namespace

# 호스트내 존재하는 eth0 인터페이스와 루프백 인터페이스 조회
$ ip link

# 네임스페이스 정보 확인
$ ip nents exec red ip link

# 호스트의 전체 네트워크 확인
# 컨테이너 안에서는 못봄
$ arp

# 두 네임스페이스간의 연결을 위해서 가상 인터페이스 생성
# veth-red == veth-blue
$ ip link add veth-red type veth peer name veth-blue

# 설정
$ ip link set veth-red netns red
$ ip link set veth-blue nents blue

# IP 할당
$ ip -n red addr add 192.168.15.1 dev veth-red
$ ip -n blue addr add 192.168.15.2 dev veth-blue

# 인터페이스 up
$ ip -n red link set veth-red up
$ ip -n blue link set veth-blue up

  • 여러개의 네임스페이스를 연결하기 위해서는 가상 스위치를 만들어서 연결시킨다.
  • 가상스위치
    • Linux Bridge
    • Open vSwitch
# 브리지 생성
$ ip link add v-net-0 type bridge

# IP 할당 및 업
ip link set dev v-net-0 up
  • 도커의 가상인터페이스의 네트워크 바인딩 구조

Docker Networking

# none: 네트워크 생성 X
# 네트워크가 없기에 호스트든 컨테이너든 네트워크 접근이 안됌
docker run --network none nginx

# host: 호스트와 네트워크 동일(Linux만 가능)
docker run --network host nginx

# bridge(default): 내부 사설망이 생성
# 도커 호스트와 컨테이너가 연결됨
docker run nginx
  • docker는 호스트에 설치되면 기본적으로 bridge라는 내부 사설 네트워크가 생성됌
  • docker network lsbridge 확인 가능
  • 호스트에서는 docker0이라는 인터페이스 확인 가능

  • docker0container와 가상 케이블을 생성하여 붙임
  • 도커 컨테이너가 생성되면 docker0과 컨테이너를 연결함
  • 호스트와 연결을 위해선 port foward가 필요
# 포트포워드
$ docker run -p 8080:80 nginx

$ iptables \
-t nat \
-A PREROUTING \
-j DNAT \
--dport 8080 \
--to-destination 80

$ iptables \
-t nat \
-A DOCKER \
-j DNAT \
--dport 8080 \
--to-destination 172.17.0.3:80

댓글남기기