정리하기/Docker

[Docker] 컨테이너 네트워크

디리릭 2023. 3. 5. 16:51
728x90

컨테이너 내에 있는 어플리케이션은 아래의 그림과 같이 3가지 방법으로 통신할 수 있다. 

  1. 웹 API를 호출
  2. 컨테이너 외부인 로컬 PC(host machine)과 통신
  3. 다른 컨테이너와 통신

 

 

웹 API와 통신

어플리케이션에서 웹 API와 통신, 즉 HTTP request는 별 조치 없이 통신 가능하다.

const response = await axios.get('https://swapi.dev/api/people');

javascript 프로젝트일 경우 보통 axios를 통해 웹과 통신을 하는데, 맞는 method(get,post,put 등) 사용하여 호출하면 된다. 

 

Host Machine(로컬 PC)과 통신

컨테이너 내의 어플리케이션에서 로컬PC 내의 데이터베이스(mongo DB)와 통신이 필요할 경우를 예로 들자. 
코드 내에서 로컬 DB의 주소를 통해 통신해야하고 그 주소는 host.docker.internal으로 사용한다. 

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

위의 코드와 같이 하면 로컬의 mongDB와 통신할 수 있다. 

 

다른 컨테이너와의 통신

통신하려는 컨테이너의 IP를 통해 통신할 수 있다. mong DB를 컨테이너로 생성하고 어플리케이션 컨테이너에서 mong DB 컨테이너와 통신한다고 예를 들어보자. 

# docker hub의 mongo db 이미지로 컨테이너 생성, 컨테이너 이름을 mongodb라고 함
docker run -d --name mongodb mongo
# mongodb 컨테이너의 ip 조회하기
docker container inspect mongodb

 나온 결과 중 NetworkSettings-> IPAddress 의 값이  mongodb 컨테이너의 ip이다. 

이걸 이용해 다른 컨테이너에서 mongodb와 통신 할 수 있다. 샘플 코드는 아래와 같다. 

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

 

그런데 컨테이너의 ip를 매번 조회하고 설정해야하는것은 너무 귀찮은 일이다.
도커에서는 다른 컨테이너와 통신할 수 있도록 network컨테이너를 생성할 수 있다. 그리고 컨테이너 생성시 같은 network로 구성 되어 있다면 컨테이너 이름으로 컨테이너 간에 통신이 가능하다. 

 

# 네트워크 컨테이너 생성. 이름을 favorites-net으로 함 
docker network create favorites-net
# 생성한 네트워크를 mongodb에 설정함 
docker run -d --name mongodb --network favorites-net  mongo
# 어플리케이션 컨테이너에도 mongodb와 동일한 네트워크를 설정함 
docker run --name favorites --network favorites-net  -d --rm  -p 3000:3000 favorites-node

 

코드 내에서는 컨테이너 이름으로 통신하도록 하면 된다.  샘플 코드는 아래와 같다. 

 

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

 

 

추가로 docker network에서 제공하는 다양한 드라이버를 설정 할 수 있다. 

디폴트 드라이버는 'bridge' 드라이버이고 컨테이너가 동일한 네트워크에 있는 경우, 이름으로 서로를 찾을 수 있다.

아래의 명령어로 드라이버를 설정할 수 있다.

docker network create --driver bridge my-net

드라이버 종류는 아래와 같다. 

  • host: 스탠드얼론 컨테이너의 경우, 컨테이너와 호스트 시스템 간의 격리가 제거(즉, localhost를 네트워크로 공유함).
  • overlay: 여러 Docker 데몬 (즉, 서로 다른 머신에서 실행되는 Docker)이 서로 연결될 수 있음. 여러 컨테이너를 연결하는 구식의 / 거의 사용되지 않는 방법인 'Swarm' 모드에서만 작동
  • macvlan: 컨테이너에 커스텀 MAC 주소를 설정할 수 있음. 그러면 이 주소를 해당 컨테이너와 통신하는데 사용할 수 있음.
  • none: 모든 네트워킹이 비활성화
  • 써드파티 플러그인: 모든 종류의 동작과 기능을 추가할 수 있는 타사 플러그인을 설치할 수 있음.

.

728x90

'정리하기 > Docker' 카테고리의 다른 글

[Docker] Volumes  (0) 2023.02.19
[Docker] Image & Container  (0) 2023.01.14
[Docker] Docker란?  (0) 2023.01.14
[Docker] window에 설치 (WSL2)  (0) 2023.01.10