728x90

개요

Docker를 사용하다 보면 여러 컨테이너 간의 통신이 필요한 상황이 발생합니다. 도커는 이런 상황에서 컨테이너 간 안전하고 효율적인 통신이 가능하게 하는 network기능을 제공합니다.

 

본 글에서는 Docker Network에 대해서 정리하고자 합니다.

 

Docker Network란❓

https://www.docker.com/blog/understanding-docker-networking-drivers-use-cases/

 

Docker Network컨테이너 간의 통신을 가능하게 하는 가상의 네트워크 인프라입니다. 여러 컨테이너가 서로 통신해야 하는 상황에 필수적인 요소입니다.

Docker Network가 필요한 이유

 

  • 컨테이너 간 안전한 통신 환경 구축
  • 마이크로서비스 아키텍처(MSA) 구현
  • 애플리케이션 컴포넌트 간의 격리
  • IP 주소 대신 컨테이너 이름으로 통신 가능

Docker Network 사용 방법

1. 네트워크 생성

 

볼륨과 달리 Docker는 네트워크를 자동으로 생성하지 않습니다. 따라서 네트워크를 사용하기 전에 먼저 생성해야 합니다.

docker network create [네트워크_이름]

2. 네트워크에 컨테이너 연결

 

네트워크를 생성한 후에는 컨테이너를 실행할 때 --network 옵션을 사용하여 해당 네트워크에 연결할 수 있습니다.

 

생성된 네트워크에 컨테이너를 연결하는 방법은 다음과 같습니다.

docker run -d --name mongodb --network [네트워크_이름] mongo

 

Docker Network 특징 : 컨테이너 이름을 통한 통신

Docker Network의 가장 큰 장점 중 하나는 IP 주소 대신 컨테이너 이름을 사용할 수 있다는 점입니다.

 

1. 컨테이너 이름을 통한 통신

1.1 기존의 IP기반 통신

mongoose.connect(
  'mongodb://172.17.0.2:27017/swfavorites',
  { useNewUrlParser: true }
);

 

 

1.2 Docker Network를 사용한 통신

mongoose.connect(
  'mongodb://mongodb:27017/swfavorites',
  { useNewUrlParser: true }
);

 

Docker는 자동으로 컨테이너 이름해당 IP 주소로 변환해주므로, 하드코딩된 IP 주소를 사용할 필요가 없습니다.


2. 포트 게시 없는 자유로운 통신

docker run -d --name mongodb --network facorites-net mongo

 

위 코드를 보면 컨테이너에 연결하기 위해 실행할 때 포트를 게시하지 않은 것을 확인할 수 있습니다.

 

이는 의도된 것으로, 같은 네트워크 내의 컨테이너들은 포트 게시 없이도 자유롭게 통신할 수 있기 때문입니다. 포트 게시는 로컬 호스트나 외부에서 컨테이너에 접근해야 할 때만 필요합니다.

 

Docker Network 활용 예시

 

[Docker] Docker 컨테이너에서 호스트 머신에 접근하기: host.docker.internal

개요Docker를 사용하다 보면 컨테이너 내부에서 로컬 머신의 애플리케이션이나 데이터베이스에 접근해야 할 때가 있습니다.이때 사용할 수 있는 기능이 바로 host.docker.internal 입니다. 본 글에서

pixx.tistory.com


 

위 포스팅에서의 간단한 시나리오에 Docker Network를 활용하는 방법을 살펴보겠습니다.


1) 네트워크 연결 시도

먼저 MongoDB 컨테이너를 실행하면서 네트워크에 연결해보겠습니다.

docker run -d --name mongodb --network favorites-net mongo

 


예상대로 "네트워크를 찾을 수 없다" 에러가 발생합니다. Docker는 볼륨과 달리 네트워크를 자동으로 생성하지 않기 때문입니다.

 

2) 네트워크 생성

docker network create favorites-net


docker network --help 명령어
로 확인해보면 네트워크 생성을 위한 create 옵션을 확인할 수 있습니다. 이를 사용하여 네트워크를 생성해보겠습니다.

 

이렇게 생성된 네트워크는 Docker 내부 네트워크로, 컨테이너 간 통신에 사용됩니다.

 

 

3) MongoDB 컨테이너 실행

이제 생성된 네트워크를 사용하여 다시 MongoDB 컨테이너를 실행합니다.

docker run -d --name mongodb --network favorites-net mongo

 

4) 컨테이너 간 통신 설정

기존에는 다음과 같이 MongoDB의 IP 주소를 직접 지정했습니다.

mongoose.connect(
  'mongodb://container-ip:27017/swfavorites', // 127.17.0.2
  { useNewUrlParser: true },
  (err) => {
    if (err) {
      console.log(err);
    } else {
      app.listen(3000);
    }
  }
);

 

하지만 이런 IP 하드코딩 방식은 좋지 않습니다. Docker Network를 사용하면 IP 대신 컨테이너 이름을 사용할 수 있습니다.

mongoose.connect(
  'mongodb://mongodb:27017/swfavorites',
  { useNewUrlParser: true },
  (err) => {
    if (err) {
      console.log(err);
    } else {
      app.listen(3000);
    }
  }
);

 

Docker가 자동으로 컨테이너 이름을 해당 IP 주소로 변환해주기 때문에, 더 안정적이고 관리하기 쉬운 방식입니다.