컨테이너에서 네트워크 통신하기

·2023년 2월 13일
0

docker

목록 보기
4/7
post-thumbnail

컨테이너에서 네트워크 통신 살펴보기

  • 컨테이너에서 외부 API에 요청보내기
  • 컨테이너에서 호스트 머신에 요청보내기
  • 컨테이너에서 다른 컨테이너에게 요청보내기

컨테이너에서 외부 API에 요청보내기

특별한 작업이 필요하지 않다. 기존의 코드와 같이 컨테이너에서 실행한다 하더라도, 그냥 해당 API 주소로 정상 요청이 이루어진다.

컨테이너에서 호스트 머신에 요청보내기

컨테이너를 생성한 경우, 코드에 localhost 는 일반적으로, 컨테이너 자신을 의미한다. 만약 데이터베이스가 호스트 머신에 있다면 요청 보내는 주소를 컨테이너가 아닌 호스트 머신의 좌표로 설정할 필요가 있다.

컨테이너에서 호스트 머신을 가리키는 특정 구문은 다음과 같다.

host.docker.internal

ex.

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

컨테이너에서 다른 컨테이너에게 요청보내기

요청에 IP 주소를 직접적으로 설정하기

예를 들어 localhost:27017 이라는 경로는, 내 PC 안에 27017 포트로 요청을 보내는 것이다. 즉 localhost 를 컨테이너 IP 주소로 바꿔주면 통신이 가능하다.

컨테이너의 IP 주소를 확인하는 명령어는 다음과 같다.

$ docker container inspect <CONTAINER_NAME>

inspect 명령어를 통해 컨테이너 정보 내의 IP 주소를 확인하여 localhost 를 해당 IP로 변경하면 통신이 가능하다. 단 이 방법은 좋은 방법이 아니다. 컨테이너의 기본 특징인 격리성을 침해하며, IP 주소가 외부에 노출되기 쉬우며, 매번 컨테이너가 재설정, 재실행 되는 경우 IP 주소를 다시 찾아 다시 재설정하는 과정이 필요하다.

도커 컨테이너 네트워크

컨테이너간 격리된 환경을 유지하면서도, 컨테이너간 통신을 하는 방법으로서 docker network 가 있다.

Docker 네트워크는 bridgehostoverlay 등 목적에 따라 다양한 종류의 네트워크 드라이버(driver)를 지원한다.

  • bridge 네트워크는 하나의 호스트 컴퓨터 내에서 여러 컨테이너들이 서로 소통할 수 있도록 해준다.
  • host 네트워크는 컨터이너를 호스트 컴퓨터와 동일한 네트워크에서 컨테이너를 돌리기 위해서 사용한다.
  • overlay 네트워크는 여러 호스트에 분산되어 돌아가는 컨테이너들 간에 네트워킹을 위해서 사용한다.

bridge 기능을 이용하여 컨테이너 간 통신환경을 만들자.

먼저 네트워크를 생성해야한다. 해당 명령어는 다음과 같다.

$ docker network create <NETWORK_NAME>

그 다음 컨테이너들을 네트워크에 연결한다. 해당 명령어는 다음과 같다.

$ docker network connect <NETWORK_NAME> <CONTAINER_NAME>

혹은 컨테이너를 실행 시 --network 옵션을 통해 연결하는 것도 가능하다. 해당 명령어는 다음과 같다.

$ docker run -d --network <NETWORK_NAME> <IMAGE_NAME>

두 개의 컨테이너를 실행하면서 두 개의 컨테이너를 동일한 하나의 네트워크에 연결해보자.

// network 생성
$ docker network create favorites-net
// 컨테이너 1. node 서버용 컨테이너 실행
$ docker run -d --name favorites --network favorites-net --rm -p 3000:3000 favorites-node
// 컨테이너 2. mongoDB 용 컨테이너 생성
$ docker run -d --name mongodb --network favorites-net mongo

이제 서버를 통해 오는 POST 요청을 저장하기 위해서는 mongoDB 컨테이너의 DB에 저장이 되도록 해야한다. 동일한 네트워크간 연결된 컨테이너는 IP 주소 대신 서로의 이름을 사용하여 요청하는 것이 가능해진다. 따라서 다음과 같이 node 서버 코드를 작성하면 정상적으로 mongoDB 컨테이너에 데이터가 저장이 된다.

mongoose.connect(
  'mongodb://mongodb:27017/swfavorites',
  { useNewUrlParser: true },
  (err) => {
    if (err) {
      console.log(err);
    } else {
      app.listen(3000);
    }
  }
);
profile
새로운 것에 관심이 많고, 프로젝트 설계 및 최적화를 좋아합니다.

0개의 댓글