Docker는 기본적으로 네트워크 격리 방식을 제공하여 컨테이너 간 및 컨테이너와 호스트 간의 통신을 제어한다. 네트워크를 활용하여 보안 격리, 서비스 간 연결성, 외부와의 통신을 구성할 수 있다. Docker는 컨테이너의 네트워크 인터페이스와 가상 네트워크를 통해 이를 구현한다.
기본적으로 Docker는 bridge 네트워크를 사용한다. bridge 네트워크는 기본적인 격리 기능을 제공하며 컨테이너들이 이 네트워크에 연결된 다른 컨테이너들과 통신할 수 있도록 한다. bridge 네트워크는 로컬 머신의 IP 주소와는 분리된 IP 범위를 사용하며, Docker가 이 네트워크의 IP 할당 및 DNS 설정을 관리한다.
host 네트워크 모드는 Docker 컨테이너가 호스트의 네트워크와 동일한 네트워크 인터페이스를 사용하게 한다. 즉, 컨테이너는 호스트와 동일한 IP 주소를 공유하게 된다. 이 모드는 네트워크 오버헤드가 없으므로 성능이 중요할 때 유용할 수 있지만, 컨테이너의 격리성이 감소하게 된다.
none 네트워크는 네트워크 인터페이스가 없는 완전히 격리된 상태의 컨테이너를 생성할 때 사용한다. 네트워크가 필요 없는 경우나 수동으로 네트워크를 구성하려는 경우 유용하다.
overlay 네트워크는 여러 호스트에 걸쳐 네트워크를 생성할 때 유용하다. 주로 Swarm과 같은 클러스터링 환경에서 사용되며, 컨테이너 간의 네트워크 연결을 위해 멀티 호스트 연결을 제공한다. 컨테이너가 각 호스트에 있는 컨테이너와 통신할 수 있도록 가상 네트워크를 형성한다.
docker network create --driver bridge <NETWORK>
docker network ls // 현재 네트워크 목록 조회
docker network inspect <NETWORK> // 특정 네트워크에 대한 정보 확인
docker network connect <NETWORK> <CONTAINER> // 네트워크 연결
docker network disconnect <NETWORK> <CONTAINER> // 네트워크 연결 해제
version: '3'
services:
app:
image: myapp
networks:
- mynet
db:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: example
networks:
- mynet
networks:
mynet:
driver: bridge
위처럼 각 container를 'services'로 묶고 각각 'networks'를 지정할 수 있다.
이런 networks들의 각각 driver를 지정할 수 있다.
실제 서비스 배포에서는 다음과 같은 네트워크 구성을 활용할 수 있습니다.
단일 호스트 네트워크: 애플리케이션과 데이터베이스 컨테이너를 bridge 네트워크에 배치하여 격리된 환경에서 서로 통신하게 하면서 호스트에서 접근할 수 없도록 설정할 수 있습니다.
보안 강화 네트워크: 보안이 중요한 경우 각 컨테이너를 none 네트워크로 배포하고 필요한 경우에만 특정 네트워크를 연결하여 데이터 유출 위험을 줄입니다.
고성능 네트워크: 성능이 중요한 경우 host 네트워크 모드를 사용하여 네트워크 오버헤드를 줄이고 로컬에서 실행되는 애플리케이션처럼 컨테이너를 작동시킵니다.
분산 네트워크: Swarm 또는 Kubernetes 환경에서 overlay 네트워크를 사용하여 여러 노드에 걸친 애플리케이션 및 서비스 간의 네트워크 연결을 유지합니다.