본문 바로가기
Cloud/Docker

도커 네트워크

by 민휘 2023. 4. 22.
도커 네트워크 구조
- 컨테이너는 내부 IP를 받음
- (컨테이너) eth0 -> (호스트) veth -> (네트워크 드라이브) docker0 -> (호스트) eth0

도커 네트워크 드라이브
- 네트워크 상의 다른 컴퓨터 파일 시스템에 액세스할 수 있도록 도와주는 가상 드라이브
- 브리지 : 서브넷, 게이트웨이, IP 할당 범위 설정 가능
- 호스트 : 호스트의 네트워크 인터페이스 사용
- 논 : 외부 연결 안함

도커 컨테이너 공유
- 어떤 네트워크 인터페이스를 사용하고 있는 컨테이너 존재
- 이 컨테이너와 동일한 네트워크 인터페이스를 공유하는 컨테이너 실행 가능
- 호스트 이름 지정할 수 있음, 도커 내장 DNS 사용, 라운드 로빈 방식 할당

 

도커가 제공하는 네트워크

도커는 가상화된 환경에서 실행되는 애플리케이션을 컨테이너 단위로 관리한다.

컨테이너들의 실행과 통신을 위해서는 네트워크가 필요하다.

도커는 기본적으로 네트워크를 제공하고 컨테이너들은 해당 네트워크에 연결된다.

도커 제공 네트워크에 연결된 호스트는 호스트와 분리된다.

도커 네트워크 구조

도커 컨테이너는 내부 IP를 할당받으므로 외부와 연결되려면 veth라는 네트워크 인터페이스를 생성해서 연결해야한다.

 

  • 컨테이너의 eth0 인터페이스는 호스트의 veth.. 인터페이스에 연결된다.
  • veth 인터페이스는 docker0 브리지와 바인딩된다.
  • docker0는 호스트의 eth0 인터페이스와 연결된다.

도커는 컨테이너가 생성될 때 가상 네트워크 인터페이스인 veth를 자동으로 생성한다.

 

 

도커 네트워크 드라이브 소개

도커는 네트워크 드라이브가 없다면 네트워크 인터페이스만 알 수 있다.

(사설 IP, 게이트웨이, 라우팅 테이블, DNS 서비스 등)

네트워크 드라이브는 네트워크 상의 다른 컴퓨터 파일 시스템에 액세스할 수 있도록 도와주는 가상 드라이브이다. 네트워크 드라이브를 통해 원격 작업이 가능하다.

컨테이너를 실행하면 기본적으로 docker0 브리지 네트워크를 통해 외부와 통신할 수 있다.

사용자의 선택에 따라 다른 네트워크 드라이버를 사용할 수 있다.

도커가 자체적으로 제공하는 대표적인 네트워크 드라이버는 브리지, 호스트, 논, 컨테이너, 오버레이 등이 있다.

서브파티 플러그인으로 확장된 네트워크를 구성할 수 있다.

 

 

브리지 네트워크

컨테이너를 실행하면 기본적으로 docker0 브리지가 사용된다.

이 네트워크는 172.17.0.x IP 대역을 컨테이너에 IP를 순차적으로 할당한다.

docker network inspect bridge

# 172.17.0.x IP 대역
"Config": [
	{
		"Subnet": "172.17.0.0/16"
	}
]

# 컨테이너 생성시 자동 연결
"Containers": {...}

 

 

 

사용자 정의 브리지

커스텀 브리지를 만들어 컨테이너에 연결해 네트워크 인터페이스를 설정할 수 있다.

브리지는 도커 호스트(컨테이너가 설치된 운영체제)와 컨테이너 간의 통신을 위한 네트워크이다.

컨테이너 접속 후 네트워크 정보를 확인해보면 새로운 IP 대역이 할당된 것을 확인할 수 있다.

docker network create --driver bridge mybridge

docker run -it --name mynetwork_container \\
> --net mybridge \\
> ubuntu:14.04

root@747e8c66a131:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:12:00:02
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0

 

브리지를 생성할 때 서브넷, 게이트웨이, IP 할당 범위 등을 임의로 설정할 수 있다.

단 서브넷과 IP 할당 범위는 같은 대역이어야 한다.

docker network create --driver=bridge \\
--subnet=172.72.0.0.16 \\
--ip-range=172.72.0.0/24 \\
--gateway=172.72.0.1 \\
my_custom_network

 

사용자 정의 네트워크는 컨테이너에 유동적으로 붙이고 뗄 수 있다.

특정 IP 대역을 갖는 네트워크 모드에만 이 명령어를 사용할 수 있어 브리지, 오버레이만 가능하다.

docker network disconnect mybridge mynetwork_container
docker network connect mybridge mynetwork_container

 

 

호스트 네트워크

호스트의 네트워크 인터페이스를 사용해 컨테이너 간의 통신을 가능하게 한다.

네트워크를 생성할 필요 없이 host 이름의 네트워크를 사용한다.

docker run -it --name network_host \\
--net host \\
ubuntu:14.04

 

논 네트워크

네트워크를 쓰지 않는다. 외부와 연결이 단절된다.

docker run -it --name network_host \\
--net none \\
ubuntu:14.04

 

컨테이너 네트워크

다른 컨테이너의 네트워크 네임스페이스 환경을 공유한다.

내부 IP, 맥 주소 등이 공유된다. —net 옵션으로 container:[다른 네트워크 ID]를 준다.

docker run -itd --name network_container_1 
	ubuntu:14.04
docker run -itd --name network_container_2 \\
	--net container:network_container_1 \\
	ubuntu:14.04

특정 호스트 이름으로 컨테이너 여러개에 접근할 수 있다.

--net-alias으로 호스트 이름을 지정할 수 있다.

아래에서 생성한 컨테이너 세개는 alicek106 호스트 이름으로 접근이 가능하다.

IP는 라운드 로빈 방식으로 할당된다.

컨테이너의 IP는 도커 내장 DNS가 관리한다.

docker network create --driver bridge mybridge

docker run -itd --name network_alias_container_1
	--net mybridge
	--net-alias alicek106 
	ubuntu:14.04

docker run -itd --name network_alias_container_2
	--net mybridge
	--net-alias alicek106 
	ubuntu:14.04

docker run -itd --name network_alias_container_3
	--net mybridge
	--net-alias alicek106 
	ubuntu:14.04

MacVLan

MacVLan은 가상 네트워크 인터페이스를 생성하는 방법이다.

MacVLan을 사용하면 같은 네트워크 장비에 연결된 다른 장치와 통신이 가능해진다.

MacVLan에 연결된 컨테이너는 네트워크 장비의 IP를 할당받는다.

 

오버레이 네트워크

여러 도커 호스트 간의 컨테이너들 간의 통신을 가능하게 한다.

 

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

도커 이미지  (0) 2023.04.22
컨테이너 로깅, 컨테이너 자원 할당 제한  (0) 2023.04.22
도커 볼륨  (0) 2023.04.22
mysql 기반 wordpress 컨테이너 배포하기  (0) 2023.04.22
컨테이너 포트 포워딩  (0) 2023.04.22