Docker Network
- Docker 네트워크는 컨테이너 간 통신과 보안을 관리하는 도구입니다.
- 컨테이너가 서로 데이터를 주고받을 수 있도록 경로를 제공하며, 네트워크 격리를 통해 보안을 강화합니다.
실제 비즈니스 애플리케이션을 컨테이너화할 때, 여러 개의 컨테이너가 서로 협력해야 목표를 달성할 수 있어요. 그래서 각각의 컨테이너가 서로 소통할 수 있는 방법이 필요하죠. 이를 위해 컨테이너들 사이에서 데이터 패킷을 주고받을 수 있는 경로, 즉 네트워크를 설정해야 해요. 도커에서는 이런 네트워크를 쉽고 효율적으로 구축할 수 있도록 도와주는 간단한 네트워크 모델을 만들었어요. 이 모델을 컨테이너 네트워크 모델(CNM)이라고 부른답니다. 이 모델은 컨테이너 네트워크를 구현할 때 필요한 기본 요건들을 정해줘요.
2. Docker Network 개념
구성 요소 | 설명 |
샌드박스 | 컨테이너를 외부 세계와 격리하며, 네트워크 요청을 안전하게 처리. |
엔드포인트 | 샌드박스와 네트워크를 연결하는 접점으로, 데이터를 주고받는 역할. |
네트워크 | 엔드포인트 간 데이터를 전달하는 경로로, 여러 컨테이너가 소속될 수 있음. |
- 하나의 네트워크 샌드박스 안에는 여러 개의 엔드포인트가 있을 수 있어요. 즉, 하나의 샌드박스 안에 있는 컨테이너는 네트워크에 전혀 연결되지 않거나, 여러 네트워크에 동시에 연결될 수 있어요. 가령, 세 개의 샌드박스 중 하나는 엔드포인트를 통해 두 개의 네트워크에 동시에 연결된 상태일 수 있죠.
- 이 네트워크 모델은 꽤 범용적이에요. 개별 컨테이너가 네트워크에서 어디에서 작동하는지는 정하지 않아요. 모든 컨테이너가 한 호스트에서 실행될 수도 있고(로컬), 여러 호스트에 걸쳐 있을 수도 있어요(글로벌).
- 물론 CNM은 그냥 네트워크가 어떻게 작동하는지 설명하는 모델일 뿐이에요. 실제로 네트워크를 사용하려면 CNM을 구현해야 해요. 로컬이든 글로벌이든, CNM을 구현하는 여러 방법이 있답니다.
- 각 네트워크는 외부에서 오는 권한 없는 접근으로부터 리소스를 보호해서 더 많은 보안을 제공해요. 그래서 애플리케이션을 만들고 운영할 때 여러 네트워크를 사용하는 게 좋아요. 그리고 서로 꼭 통신해야 하는 서비스들만 같은 네트워크에 두는 거죠. 방금 본 예제에서는 웹 API가 데이터베이스와 직접 통신할 필요가 없으니까, 이 둘을 다른 네트워크에 두었어요. 이렇게 하면 만약 해커가 웹 API를 해킹해도, 제품 카탈로그 서비스를 먼저 해킹하지 않고서는 데이터베이스에 접근하기 어렵게 됩니다.
3. Docker Network 종류
종류 | 설명 | 특징 |
브리지 네트워크 | Docker의 기본 네트워크로, 단일 호스트 내에서 컨테이너 간 통신 가능. | IP 자동 할당, 포트 매핑으로 외부 연결 가능. |
호스트 네트워크 | 컨테이너가 호스트 머신의 네트워크를 직접 사용. | 높은 성능 제공, 네트워크 격리 불가. |
오버레이 네트워크 | 다중 호스트 간 컨테이너를 연결하는 네트워크. | Swarm 모드 또는 Kubernetes에서 사용, 분산 애플리케이션에 적합. |
사설 네트워크 | 사용자 정의 네트워크로, 특정 컨테이너만 연결 가능. | 격리된 환경 제공, 보안 강화. |
macvlan 네트워크 | 컨테이너가 물리적 네트워크 인터페이스에 직접 연결. | 고유 IP 주소 제공, 네트워크 트래픽의 격리 가능. |
4. 실제와 유사한 사례
예제: API, 카탈로그, 데이터베이스 서비스 네트워크
- 목표:
- API는 카탈로그와 통신하지만, 데이터베이스와는 통신하지 않음.
- 카탈로그는 두 네트워크 모두 연결.
구현 코드
# 네트워크 생성
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 컨테이너를 front 네트워크에 추가 연결
docker network connect front catalog
# 각 컨테이너에서 네트워크 상태 확인
docker exec webapi route
docker exec catalog route
docker exec database route
# 네트워크 정보 확인
docker network inspect front
docker network inspect back
# 네트워크 통신 테스트
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
exit
# 네트워크 및 컨테이너 정리
docker network disconnect front catalog
docker stop webapi catalog database
docker rm webapi catalog database
docker network rm back front
5. Docker Network 명령어
명령어 | 설명 |
docker network create <이름> | 사용자 정의 네트워크 생성. |
docker network ls | 현재 생성된 네트워크 리스트 확인. |
docker network inspect <이름> | 특정 네트워크의 상세 정보 확인. |
docker network connect <네트워크> <컨테이너> | 컨테이너를 네트워크에 연결. |
docker network disconnect <네트워크> <컨테이너> | 컨테이너를 네트워크에서 분리. |
docker network rm <이름> | 네트워크 삭제. 컨테이너가 연결된 네트워크는 삭제 불가. |
6. Docker Network 사용 이유
이유 | 설명 |
컨테이너 간 통신 | 여러 컨테이너가 데이터를 주고받으며 협력 가능. |
보안 강화 | 네트워크 격리를 통해 외부 및 불필요한 통신 차단. |
구조적 연결 | 서비스 간 통신 구조를 체계적으로 설계 가능. |
다중 호스트 지원 | 오버레이 네트워크를 활용해 여러 호스트에 분산된 컨테이너 연결. |
7. Docker Network의 장단점
장점 | 단점 |
네트워크 격리로 보안 강화. | 복잡한 네트워크 설정 시 추가 학습 필요. |
컨테이너 간 효율적 데이터 전송. | 여러 네트워크 드라이버 사용 시 성능 차이 발생 가능. |
다중 호스트에서도 네트워크 연결 가능. | Swarm 모드 또는 Kubernetes 설정 필요. |
8. 부가적으로 알아야 할 정보
- Bridge와 Host 네트워크 차이:
- 브리지 네트워크는 컨테이너 간 독립적 IP와 네트워크 격리 제공.
- 호스트 네트워크는 컨테이너가 호스트의 네트워크를 직접 사용해 높은 성능 제공.
- 오버레이 네트워크:
- Swarm 클러스터에서 여러 호스트를 연결할 때 사용.
- 분산 애플리케이션과 마이크로서비스 환경에서 필수적.
- macvlan 네트워크:
- 고유 IP 주소를 컨테이너에 직접 제공해 외부 네트워크와의 원활한 통신 가능.
# 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 > Docker' 카테고리의 다른 글
[Docker] Docker Volume (0) | 2025.02.05 |
---|---|
[Docker] Docker 모니터링&로깅 (0) | 2025.02.04 |
[Docker] Docker Compose (0) | 2025.02.03 |
[Docker] Dockerfile (1) | 2025.02.01 |
[CI/CD] Github Actions CI (0) | 2025.01.31 |