AWS/Docker+CICD

Docker Network

sehunbang 2024. 4. 8. 20:47

Docker Network 이해

 

도커 네트워크는 도커 컨테이너끼리 서로 통신할 수 있게 도와주는 네트워크예요. 이걸 쓰면 컨테이너들이 서로 통신하는 걸 더 쉽게 할 수 있고, 보안도 더 강하게 만들 수 있어요.

 

실제 비즈니스 애플리케이션을 컨테이너화할 때, 여러 개의 컨테이너가 서로 협력해야 목표를 달성할 수 있어요. 그래서 각각의 컨테이너가 서로 소통할 수 있는 방법이 필요하죠. 이를 위해 컨테이너들 사이에서 데이터 패킷을 주고받을 수 있는 경로, 즉 네트워크를 설정해야 해요. 도커에서는 이런 네트워크를 쉽고 효율적으로 구축할 수 있도록 도와주는 간단한 네트워크 모델을 만들었어요. 이 모델을 컨테이너 네트워크 모델(CNM)이라고 부른답니다. 이 모델은 컨테이너 네트워크를 구현할 때 필요한 기본 요건들을 정해줘요.

 

 

  • 샌드박스: 샌드박스는 컨테이너를 외부 세계로부터 완전히 분리해요. 바깥에서 들어오는 네트워크 연결은 이 샌드박스 안의 컨테이너로는 들어올 수 없죠. 그런데 컨테이너가 완전히 소통 불가능하면 큰 쓸모가 없겠죠? 그래서 여기에 엔드포인트가 필요해요.
  • 엔드포인트: 엔드포인트는 외부 세계와 샌드박스(컨테이너가 아닌) 사이의 연결점이에요. 이게 컨테이너를 안전하게 지켜주는 거죠. 엔드포인트는 샌드박스를 다음 요소인 네트워크에 연결해요.
  • 네트워크: 네트워크는 엔드포인트에서 다른 엔드포인트로, 결국은 컨테이너에서 다른 컨테이너로 데이터를 보내는 길이에요.
  • 하나의 네트워크 샌드박스 안에는 여러 개의 엔드포인트가 있을 수 있어요. 즉, 하나의 샌드박스 안에 있는 컨테이너는 네트워크에 전혀 연결되지 않거나, 여러 네트워크에 동시에 연결될 수 있어요. 가령, 세 개의 샌드박스 중 하나는 엔드포인트를 통해 두 개의 네트워크에 동시에 연결된 상태일 수 있죠.
  • 이 네트워크 모델은 꽤 범용적이에요. 개별 컨테이너가 네트워크에서 어디에서 작동하는지는 정하지 않아요. 모든 컨테이너가 한 호스트에서 실행될 수도 있고(로컬), 여러 호스트에 걸쳐 있을 수도 있어요(글로벌).
  • 물론 CNM은 그냥 네트워크가 어떻게 작동하는지 설명하는 모델일 뿐이에요. 실제로 네트워크를 사용하려면 CNM을 구현해야 해요. 로컬이든 글로벌이든, CNM을 구현하는 여러 방법이 있답니다.

실제와 유사한 사례

우리에게 웹 API, 제품 카탈로그, 데이터베이스 세 개의 서비스로 이루어진 애플리케이션이 있다고 해요. 이때 우리는 웹 API가 제품 카탈로그와는 통신할 수 있지만, 데이터베이스와는 통신하지 못하게 하고 싶어요. 반면, 제품 카탈로그는 데이터베이스와도 통신할 수 있으면 좋겠죠. 이걸 해결하는 방법 중 하나는 웹 API와 데이터베이스를 서로 다른 네트워크에 두고, 제품 카탈로그는 두 네트워크에 모두 연결하는 거예요. 이렇게 하면 원하는 대로 통신 구조를 설정할 수 있어요.

각 네트워크는 외부에서 오는 권한 없는 접근으로부터 리소스를 보호해서 더 많은 보안을 제공해요. 그래서 애플리케이션을 만들고 운영할 때 여러 네트워크를 사용하는 게 좋아요. 그리고 서로 꼭 통신해야 하는 서비스들만 같은 네트워크에 두는 거죠. 방금 본 예제에서는 웹 API가 데이터베이스와 직접 통신할 필요가 없으니까, 이 둘을 다른 네트워크에 두었어요. 이렇게 하면 만약 해커가 웹 API를 해킹해도, 제품 카탈로그 서비스를 먼저 해킹하지 않고서는 데이터베이스에 접근하기 어렵게 됩니다.

 

# back, front 네트워크 생성
docker network create --driver=bridge back
docker network create --driver=bridge front

# 각 서비스를 생성 및 실행
docker run --name=webapi -itd --net=front ubuntu:14.04
docker run --name=catalog -itd --net=back ubuntu:14.04
docker run --name=database -itd --net=back ubuntu:14.04

# catalog 서비스는 기본 back 네트워크 뿐만 아니라 front 네트워크에도 연결
docker network connect front catalog

# webapi 의 라우팅 테이블
docker exec webapi route

# catalog 의 라우팅 테이블
docker exec catalog route

# database 의 라우팅 테이블
docker exec database route

docker network inspect front # webapi / catalog
docker network inspect back # catalog / database


docker exec -it webapi bash
# 머신 안에서
ping -c 1 catalog # 가능
ping -c 1 database # 연결 불가능
exit


docker exec -it catalog bash
# 머신 안에서
ping -c 1 webapi
ping -c 1 database

# 리소스 정리
docker network disconnect front catalog

docker stop webapi catalog database

docker rm webapi catalog database

docker network rm back

docker network rm front

 

 

 

 

Docker Network 종류

  1. 브리지 네트워크: 이건 Docker 쓸 때 가장 많이 보게 되는 기본 네트워크예요. 한 컴퓨터 안에서 여러 Docker 컨테이너가 서로 통신할 수 있게 해줍니다. 컨테이너를 이 네트워크에 붙이면, Docker가 알아서 IP 주소를 줘요. 그리고 이거, 호스트 밖의 다른 네트워크랑은 일단 따로 동작해요. 근데 포트 매핑이라는 걸 사용하면, 바깥에서도 컨테이너에 접근할 수 있게 할 수 있어요.
  2. 공용 네트워크: 사실 Docker에서 '공용 네트워크'라는 말은 흔히 안 쓰이는데요, 보통 외부에서 접근할 수 있게 하려면, 브리지 네트워크에 포트를 열어주거나, 아니면 '호스트 네트워크'라고 해서 컨테이너가 직접 우리 컴퓨터의 네트워크를 쓰게 하는 방법이 있어요.
  3. 사설 네트워크: 이건 좀 특별한 컨테이너끼리만 통신할 수 있는 네트워크예요. Docker에서는 사용자가 직접 네트워크를 만들고, 그 안에 원하는 컨테이너만 연결할 수 있어요. 이렇게 하면 다른 컨테이너나 외부 네트워크와는 격리되어서, 더 안전하게 정보를 주고받을 수 있죠.

Docker Network 요약

  • 단일 호스트에서 실행되는 컨테이너가 서로 통신하는 방법에 대해 배웠습니다.
  • 컨테이너 네트워크의 요구 사항을 정의하는 CNM을 살펴보고, 브리지 네트워크와 같은 CNM의 여러 구현을 살펴보았습니다.
  • 브리지 네트워크가 어떻게 작동하는지 자세히 살펴보고, 도커가 네트워크와 해당 네트워크에 연결된 컨테이너에 대해 제공하는 정보에 대해 알아보았습니다.