[Docker 기본8] Docker의 Network

Docker의 Network

Docker Swarm은 두 가지 종류의 Traffic을 생성합니다.

  1. 제어 및 관리 영역 Traffic: Docker Swarm에 대한 참가 및 탈퇴 요청과 같은 Docker Swarm의 관리 Message가 포함됩니다. 해당 Traffic은 항상 암호화됩니다.
  2. Application Data 영역 Traffic: Container 및 외부 Client와의 Traffic이 포함됩니다.

이 중에서 해당 Post에서는, Application Data 영역의 Traffic에 대해서 확인해보고자 합니다.

Docker의 Network

먼저, Docker는 Overlay, Ingress, docker\_gwbridge의 세 가지 Network이 존재합니다. 각각에 대한 개념과 역할에 대해서 알아보겠습니다.

Overlay Network

  • Overlay Network는 Docker Swarm에 참여하는 Docker Daemon간의 통신을 관리합니다.
  • 독립실행형 Container의 Network를 생성하는 방법과 동일한 방식으로 Overlay Network를 생성할 수 있습니다.
  • 기존에 생성된 Overlay Network에 Service를 연결시켜 Service간 통신을 활성화할 수 있습니다.
  • Overlay Network는 Overlay Network Driver를 사용합니다.

Ingress Network

  • Ingress Network는 Service의 Node들간에 Load Balancing을 하는 Overlay Network입니다.
  • Docker Swarm의 모든 Node가 노출된 Port로 요청을 받게되면, 해당 요청을 IPVS라는 모듈로 전달합니다.
  • IPVS는 해당 Service에 참여하는 모든 IP 주소를 추적하고 그 중 하나를 선택한 뒤, 요청을 해당 경로로 Routing합니다.
  • Ingress Network는 Docker Swarm을 Init하거나 Join할 때 자동으로 생성됩니다.

docker_gwbridge

  • docker_gwbridge는 Overlay Network(Ingress Network 포함)를 개별 Docker Daemon의 물리적 Network에 연결하는 Bridge Network입니다.
  • 기본적으로, Service가 실행 중인 각각의 Container는 로컬 Docker Daemon Host의 docker_gwbridge Network에 연결됩니다.
  • docker_gwbridge Network는 Docker Swarm을 Init하거나 Join할 때 자동으로 생성됩니다.

Docker는 사용자가 정의한 Bridge, Overlay 및 MACVLAN Network들에게 Host 내의 모든 Container의 위치를 제공하는 내부 DNS Server를 갖고 있습니다. 각 Docker Container(또는 Docker Swarm의 Task)에 존재하는 DNS Resolver가, DNS 쿼리를 DNS Server 역할을 하는 Docker Engine으로 전달합니다. 그런 다음 Docker Engine은 DNS 쿼리가 요청한 Container가 Network 내에 포함되어있는지 확인합니다. Docker Engine은 key-value 저장소에서 Container, Task 또는 Service 이름과 일치하는 IP주소를 조회하고, 해당 IP 또는 Service Virtual IP(VIP)를 요청자에게 반환합니다. 이렇게 Docker는 내장 DNS를 사용하여, Single Docker Engine에서 실행되는 Container 및 Docker Swarm에서 실행되는 Task에 대한 Service Discovery기능을 제공합니다.

Service Discovery

Service Discovery는 Network 범위 내에서 동작합니다. 동일한 Network에 있는 Contrainer나 Task만 내장 DNS 기능을 사용할 수 있음을 의미합니다. 따라서, 동일한 Network에 있지 않은 Container는 서로의 주소를 확인할 수 없습니다. 또한, 특정 Network에 Container 또는 Task가 있는 Node만 해당 Network의 DNS 항목들을 저장합니다. 이러한 특징들이 Docker의 보안 및 성능을 향상시켜 줍니다. 만약 대상 Container 또는 Service가 원본 Container와 동일한 Network에 속하지 않는다면, Doker Engine은 구성된 기본 DNS Server로 DNS 쿼리를 전달합니다.

Service를 위한 Network 구성하기

Overlay Network 생성

Docker Swarm의 Manager Node에 접속합니다.

docker network create [OPTIONS] NETWORK로 새로운 Overlay Network를 생성합니다.

생성된 Overlay Network를 docker network ls [OPTIONS]로 확인합니다.

docker network inspect [OPTIONS] NETWORK [NETWORK...]로 생성된 Overlay Network의 상세정보를 확인합니다.

Worker Node에 접속합니다.

Worker Node에도 docker network ls [OPTIONS]로 Swarm Manager에서 생성한 Overlay Network가 존재하는지 확인합니다.

Worker Node에서는 아직 생성된 Overlay Network를 확인할 수 없습니다. 이는 Docker가 해당 Overlay Network를 필요할 때만, Host에 확장시키기 때문입니다. 따라서, 해당 Network에서 생성된 Service에서 Task될 때, Network 목록에 나타나게 됩니다.

Service Network 연결

Overlay Network에 연결할 Service를 docker service create [OPTIONS] IMAGE [COMMAND] [ARG...]으로 생성합니다. --network Option을 설정하여, 생성된 Overlay Network에 해당 Service를 추가할 수 있습니다.

생성된 Service와 Container의 정보를 확인합니다.

Worker Node에서 Overlay Network가 생성되었는지 docker network ls [OPTIONS]와 docker network inspect [OPTIONS] NETWORK [NETWORK...]로 확인합니다.

Overlay Network로 통신 확인하기

Worker Node에서 docker network inspect [OPTIONS] NETWORK [NETWORK...]로 Overlay Network의 상세정보를 확인하여 실행 중인 Container의 IP정보를 확인합니다.

다시 Docker Swarm의 Manager Node에 접속하고 실행 중인 Container ID를 확인한 뒤, Container에 접속합니다.

Networking Test를 위해, iptuils-ping을 다음의 명령어를 실행하여 설치합니다.

앞에서 확인한 Worker Node에서 실행 중인 Container의 IP로 Networking Test를 진행합니다.

Overlay Network로 Service Discovery 확인하기

다시 Manager Node의 Container로 돌아와, 아래의 명령어를 실행합니다.

여기서 관심을 가져야할 값은 nameserver 127.0.0.11입니다. 이 값은 Container 내부에서 실행되고 있는 DNS Resolver들에게 보내지고, 모든 Docker Container는 이 주소가 포함되어있는 내장 DNS Server를 실행합니다. Service이름으로 ping명령을 실행하여 Networking Test를 진행합니다.

Container내에서 exit명령으로 빠져나와 docker service inspect [OPTIONS] SERVICE [SERVICE...]로 Service의 상세정보를 확인합니다. ping을 통해 나온 결과에 출력된 10.0.0.5의 주소가 현재 Service의 Virtual IP인 것을 확인할 수 있습니다.

Worker Node에서도 Service이름으로 ping명령을 실행하게 되면, Service Virtual IP로 실행되어 출력되는 것을 확인할 수 있습니다.