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 종류
- 브리지 네트워크: 이건 Docker 쓸 때 가장 많이 보게 되는 기본 네트워크예요. 한 컴퓨터 안에서 여러 Docker 컨테이너가 서로 통신할 수 있게 해줍니다. 컨테이너를 이 네트워크에 붙이면, Docker가 알아서 IP 주소를 줘요. 그리고 이거, 호스트 밖의 다른 네트워크랑은 일단 따로 동작해요. 근데 포트 매핑이라는 걸 사용하면, 바깥에서도 컨테이너에 접근할 수 있게 할 수 있어요.
- 공용 네트워크: 사실 Docker에서 '공용 네트워크'라는 말은 흔히 안 쓰이는데요, 보통 외부에서 접근할 수 있게 하려면, 브리지 네트워크에 포트를 열어주거나, 아니면 '호스트 네트워크'라고 해서 컨테이너가 직접 우리 컴퓨터의 네트워크를 쓰게 하는 방법이 있어요.
- 사설 네트워크: 이건 좀 특별한 컨테이너끼리만 통신할 수 있는 네트워크예요. Docker에서는 사용자가 직접 네트워크를 만들고, 그 안에 원하는 컨테이너만 연결할 수 있어요. 이렇게 하면 다른 컨테이너나 외부 네트워크와는 격리되어서, 더 안전하게 정보를 주고받을 수 있죠.
Docker Network 요약
- 단일 호스트에서 실행되는 컨테이너가 서로 통신하는 방법에 대해 배웠습니다.
- 컨테이너 네트워크의 요구 사항을 정의하는 CNM을 살펴보고, 브리지 네트워크와 같은 CNM의 여러 구현을 살펴보았습니다.
- 브리지 네트워크가 어떻게 작동하는지 자세히 살펴보고, 도커가 네트워크와 해당 네트워크에 연결된 컨테이너에 대해 제공하는 정보에 대해 알아보았습니다.
'AWS > Docker+CICD' 카테고리의 다른 글
| Container 가상화 (0) | 2024.04.08 |
|---|---|
| Docker Image 심화 (0) | 2024.04.08 |
| Docker의 고급사용법 (Docker volume) (0) | 2024.04.05 |
| Github Actions, github repository 그리고 AWS ec2 간단 사용법. (0) | 2024.04.05 |
| Docker 모니터링&로깅 (1) | 2024.04.05 |