카테고리 없음

Docker 환경에서 컨테이너끼리 통신하는법?

1-yuna 2025. 3. 30. 01:59

애플리케이션이 통신하는 방법 

Docker는 애플리케이션의 배포, 실행, 관리를 위한 컨테이너 기반 가상화 기술이다. 기존 가상화 방식보다 경량화된 환경을 제공하며, 애플리케이션을 격리된 환경에서 실행할 수 있도록 돕는다.

이때, 컨테이너 내부의 애플리케이션은 다양한 방법으로 통신할 수 있으며, 주요 방식은 3가지이다. 

 

1️⃣ 웹 API를 호출 ( HTTP 요청) 

일반적인 프론트엔드와 백엔드 간의 HTTP 통신이다. 

GET, POST, PUT, DELETE 등의 HTTP 메서드를 이용해 요청, 응답한다. 

 

2️⃣ 로컬 PC와 통신 

컨테이너가 아닌 호스트 머신(로컬 PC)와 직접 통신하는 방법이다. 

예) 컨테이너에서 로컬에 있는 데이터베이스 (MySQL 등)와 연결

 

3️⃣ 다른 컨테이너와 통신 

도커에서 컨테이너는 독립적이기 때문에 여러 개의 컨테이너가 상호작용하는 환경을 만들기 위해서는 컨테이너간 통신이 필요하다. 

따라서 적절한 네트워크 설정이 필요하다. 

 

 


컨테이너 간 통신을 위한 네트워크 설정 방법

도커 네트워크란? 

네트워크 설정 방법을 알기 전에, 도커 네트워크에 대해 간략히 알고 있어야한다. 

도커 네트워크란, 컨테이너가 서로 안전하고 효율적으로 통신할 수 있도록 제공되는 가상 네트워크 환경이다. 

즉, 컨테이너 간의 통신은 도커 네트워크 위에서 이루어지며, 이는 호스트와 컨테이너, 또는 여러 컨테이너 간의 연결을 관리하고, 필요한 네트워크 규칙을 설정하여 데이터의 흐름을 제어한다.

 

🔷 네트워크 인터페이스 

eth0: 각 컨테이너 내에 존재하는 기본 이더넷 인터페이스

docker0: 호스트 머신에 존재하는 기본 가상 네트워크 인터페이스로, 컨테이너와 호스트 간의 연결을 담당

veth: 컨테이너와 호스트를 연결하는 가상 이더넷 인터페이스로, 도커가 자동으로 설정

 

🔷 도커 네트워크 흐름 

1. 컨테이너는 기본적으로 eth0 네트워크 인터페이스를 갖고 있으며, 이를 통해 veth와 연결하여 외부와 통신한다. 

2. veth 인터페이스는 컨테이너와 호스트 간의 연결을 담당한다. 

3. docker0은 호스트 머신에서 컨테이너 간의 트래픽을 중계하는 기본 네트워크 인터페이스이다. 

4. 컨테이너 간의 통신은 docker0을 통해 이루어지며, 네트워크 드라이버에 따라 추가적인 설정이 필요할 수도 있다. 

5. 외부와의 통신은 veth를 통해 docker0으로 전달되어, 호스트 머신의 네트워크 인터페이스와 연결된다. 

 

정리하면 컨테이너와 호스트머신은 통신을 위해 가상 인터페이스가 중간에 존재하며, 이때 특정 네트워크 설정이 필요하다. 

네트워크 설정은 도커가 제공하는 네트워크 드라이버를 이용해 설정할 수 있다. 

네트워크 드라이버 종류: Bridge, Host, None, container, Overlay 등

 


네트워크 드라이버 

1️⃣ Bridge Network

가장 많이 사용되는 네트워크 모드로, docker run을 하면 기본적으로 브릿지 네트워크에 자동으로 속한다. 

브릿지 네트워크는 컨테이너 간 통신을 위해 가상의 네트워크를 생성하여 같은 네트워크에 속한 컨테이너들끼리 통신이 가능하다. 

 

🔷 특징 

1. 같은 네트워크에 속한 컨테이너들끼리 이름으로 접근이 가능하다. 

예) app 컨테이너에서 db 컨테이너로 접근 -> db:3306 (db= 컨테이너 이름/ 3306= 포트번호)

 

🔷 접근 방법 

컨테이너 이름: 포트번호 로 접근 할 수 있다. 

예) db:3306

 

🔷 사용

# 새로운 네트워크 생성
docker network create my_bridge_network

# 컨테이너를 해당 네트워크에 연결하여 실행
docker run -d --name app --network my_bridge_network my_app_image
docker run -d --name db --network my_bridge_network my_db_image

 

docker run: 새로운 컨테이너를 생성하고 실행 

-d: 백그라운드 실행 ( 터미널을 차지하지 않고 백그라운드에서 실행됨) 

--name app: 컨테이너 이름을 app으로 설정 

--network my_bridge_network: my_bridge_network라는 브릿지 네트워크에 컨테이너를 연결 

my_app_image: 실행할 컨테이너의 이미지 이름 

 

 


 

 

2️⃣ Host Network

컨테이너가 호스트의 네트워크를 직접 사용한다. 

 

🔷 특징 

1. 호스트의 IP를 그대로 사용하기 때문에 컨테이너 내부의 포트 매핑이 필요 없다. 

 

2. 컨테이너 간의 네트워크 격리가 없어 보안적으로 위험할 수 있다. 

-> 컨테이너가 호스트의 네트워크를 직접 사용하는 것이기 때문에 방화벽이나 격리된 네트워크가 적용되지 않는다. 

-> 다른 컨테이너나 애플리케이션과 포트가 같으면 충돌할 위험이 있다. 

-> 호스트 네트워크가 노출이 될 수 있다. 

 

3. 성능이 빠르다 

-> host의 네트워크를 사용하여, 네트워크 변환과정이 필요 없기 때문에 성능이 빠르다. 

 

🔷 접근 방법

localhost 또는 host의 IP: 포트 번호로 접근할 수 있다. 

예) localhost : 5000

 

🔷 사용 

docker run -d --name my_app --network host my_app_image
docker run -d --name my_app --network host my_db_image

 

 


 

3️⃣ None Network 

어떠한 네트워크에도 연결되지 않는다. 따라서 외부와 통신이 필요 없는 컨테이너에서 사용한다. 

 

🔷 특징 

1. 네트워크 인터페이스가 존재하지 않아, 완전히 독립된 상태에서 실행한다. 

2. 보안이 중요할때 사용한다. 

 

🔷 사용

docker run -d --name isolated_container --network none my_image

 


 

4️⃣ container network 

특정 컨테이너가 다른 컨테이너의 네트워크를 사용하여 같은 네트워크에서 실행되는 것과 동일하다. 

 

🔷 특징 

1. 같은 네트워크 환경을 공유하므로 IP 충돌 없이 사용 가능하다. 

2. Bridge는 컨테이너끼리 통신할 수 있지만 IP는 각각 다르다 그러나 container는 네트워크 스택을 완전히 공유하여 완전히 같은 IP를 사용한다. 

 

🔷 접근 방법

공유받은 컨테이너 IP : 포트번호 

예) primary_container_ip:3306

 

 

🔷 사용 

# 먼저 하나의 컨테이너 실행
docker run -d --name primary_container my_image

# 새로운 컨테이너를 primary_container의 네트워크를 공유하도록 실행
docker run -d --name secondary_container --network container:primary_container my_image

 

 


 

5️⃣ Overlay Network

여러 개의 서버(호스트)에 걸쳐 실행되는 컨테이너들이 마치 같은 네트워크에 있는 것처럼 통신할 수 있도록 해주는 네트워크 모드이다.

Docker Swarm에서 주로 사용되며, 컨테이너 간 보안이 강화된 네트워크 통신을 지원한다.

 

🔷 사용

 # Swarm 모드 활성화
docker swarm init

 # Overlay 네트워크 생성
docker network create --driver overlay my_overlay_network 

 # 네트워크 연결
docker service create --name web --network my_overlay_network -p 8080:80 nginx 
docker service create --name db --network my_overlay_network -e MYSQL_ROOT_PASSWORD=root mysql

network create : 새 네트워크 생성

--driver overlay: 네트워크 드라이버를 overlay로 설정

my_overlay_network: 생성할 네트워크 이름

service create: 새로운 서비스 생성

--name web: 서비스 이름을 web으로 설정

--network my_overlay_network : my_overlay_network 네트워크에 연결

-p 8080:80: 포트 매핑 ( 호스트의 8080포트를 컨테이너의 80포트에 연결)

nginx: 실행할 이미지

 


어떤 네트워크 모드를 사용해야 할까? 

Bridge Network

컨테이너 간 통신이 필요할때 사용된다. 

컨테이너 간의 네트워크 격리 필요 시 유용하다. 

-> 다른 호스트와의 연결이 필요 없다면, Bridge Network는 컨테이너들끼리만 네트워크를 형성하므로, 격리된 환경을 만들어준다.

 

Host Network

네트워크 성능이 중요한 애플리케이션에서 빠른 네트워크 성능을 요구할 때 사용된다. 

호스트와 컨테이너 간의 네트워크 충돌이 없도록 사용해야 할 때 사용된다. 

보안상의 이유로 외부와의 고립된 통신이 필요 없을 때 사용된다. 

 

 

 

None Network

컨테이너가 네트워크 연결이 필요 없을 때 사용된다. 

완전한 네트워크 격리가 필요할 때 (예: 네트워크가 전혀 필요 없는 애플리케이션) 사용된다. 

다른 컨테이너나 외부와 통신하지 않고 독립적인 환경에서 실행해야 할 때 사용된다. 

 

 

 

Container Network

다른 특정 컨테이너와 네트워크를 공유해야 할 때 사용된다. 

다수의 컨테이너가 하나의 네트워크를 공유하여 서로의 네트워크 자원에 접근해야 할 때 사용된다. 

여러 컨테이너가 단일 컨테이너의 네트워크 스택을 공유해야 할 때 사용된다. 

 

 

 

Overlay Network

멀티 호스트 환경에서 여러 호스트에 걸쳐서 네트워크를 구성해야 할 때 사용된다. 

Docker Swarm과 같은 클러스터링 환경에서 여러 컨테이너 간의 통신이 필요할 때 사용된다. 

분산 시스템에서 각기 다른 물리적 서버에 있는 컨테이너들이 서로 연결되어야 할 때 사용된다. 

 

 

 

 


자동 네트워크 설정 

위의 도커 네트워크 드라이버는 각각의 컨테이너가 어떤 방식으로 통신할지 결정하였다. 

만약 여러개의 컨테이너를 한 번에 실행하고 자동으로 같은 네트워크에 연결되길 원한다면 도커 컴포즈를 사용하면된다.

 

1️⃣ Docker Compose 사용

여러 개의 컨테이너를 한 번에 실행하고, 자동으로 같은 네트워크에 연결한다. 

 

🔷 특징 

1. 도커 컴포즈의 기본 네트워크 설정은 브릿지 네트워크이다. 

-> 도커 컴포즈가 docker run을 내부적으로 실행하기 때문에 기본 네트워크는 브릿지로 설정되어 있기 때문이다. 

 

🔷 사용

version: '3'
services:
  app:
    image: my_app_image
    networks:
      - my_custom_network
  db:
    image: my_db_image
    networks:
      - my_custom_network
networks:
  my_custom_network:
    driver: bridge

-> docker-compose.yml에서 networks 설정을 추가하여 컨테이너 간 연결을 해준다. 

 

 

 

여러 컨테이너를 연결하고 설정하여 한 번에 실행해야 할 때 사용된다. 

여러 컨테이너의 배포 및 관리를 자동화하고 싶을 때 사용된다. 

애플리케이션 스택을 여러 컨테이너로 구성하고 이를 하나의 파일로 관리하고 싶을 때 사용된다. 

서비스 간의 의존성이 있는 경우 (예: 데이터베이스와 애플리케이션 서버) 사용된다. 

 


정리

Docker에서 컨테이너 간 통신은 기본적으로 브리지 네트워크를 사용하며, 같은 네트워크 내에서는 컨테이너 이름으로 접근할 수 있다. host 네트워크는 호스트와 동일한 네트워크를 공유하지만 보안에 유의해야 하며, none 네트워크는 네트워크 연결을 제거한다.

Docker Compose를 사용하면 컨테이너 간 통신을 쉽게 설정할 수 있으며, 외부 통신이 필요할 경우 포트 매핑을 활용하거나, 필요에 따라 Overlay 네트워크 등을 고려할 수 있다.