본문 바로가기
[DevOps]/Docker

Docker - 컨테이너 통신

by 팡펑퐁 2023. 7. 5.
728x90
💡
도커에서는 컨테이너 간의 통신을 크게 세 가지로 나눌 수 있다.
이 세 가지 방법에 대해 간단히 알아보자.

 

기본적인 웹 통신

  • 컨테이너는 기본적으로 외부에 포트를 노출시키는 것만으로 웹에 요청을 보낼 수 있다.
  • 도커화된 애플리케이션 내부에서 웹 API 및 웹 페이지와 통신하는 데에 특별한 설정이나 코드변경이 필요하지 않다.

 

 

로컬 호스트 머신과의 통신

  • 로컬 호스트 머신과의 통신에는 두 가지 방법이 있다.
  • 위 코드는 로컬 호스트 머신의 mongoDB와 연결하기 위한 Node.js(도커 컨테이너) 코드의 일부이다.
  • 'mongodb://localhost:27017/swfavorites'라고 적혀있는 것을 보니 로컬 호스트 머신의 mongoDB와 연결하게 되는데 이때 컨테이너의 3000번 포트를 통한다.

 

  • 이때 도커화된 애플리케이션이 로컬 호스트 머신과 통신하기 위해서는 'localhost' 대신 'host.docker.internal'을 입력해야 한다.
  • 'host.docker.internal'는 도커가 로컬 호스트 머신의 ip주소와 연결할 수 있도록 도와주는 명령어이다.

 

 

컨테이너 간 통신

직접 연결

  • 현재 예제 코드는 위에서 언급했듯이 Node.js 기반의 코드이며, api 요청으로 get과 post를 수행할 수 있다.
    • Node 서버를 통해 사용자가 좋아하는 스타워즈 시리즈를 mongDB에 등록하고 조회("/favorites")하는 기능을 가지고 있다.

 

  • mongodb의 공식 이미지를 다운로드하고 컨테이너를 실행시켰다.

 

docker container inspect mongodb
  • 위 명령어로 mongodb 컨테이너의 구성 정보를 확인해 보았다.

 

  • 구성 정보 중에 IPAddress를 확인하여 

 

  • app.js에 mongoDB 컨테이너 ip를 적어주었다.
  • 이렇게 하면 Node.js 코드 안에 mongoDB와 연결하는 정보를 적게 되어 직접 연결할 수 있게 된다.

 

docker build -t favorites-node .

  • 수정한 코드를 반영하기 위해 node.js 프로젝트를 빌드해 주고

 

  • 수정 사항을 반영한 컨테이너를 생성했다.

 

  • localhost:3000으로 get 요청을 날리니 빈 배열과 함께 200 OK가 나옴으로써 두 컨테이너 간의 통신이 원활하게 이뤄지고 있음을 확인할 수 있다.
    • 빈 배열이 나온 것은 당연하게도 아무것도 데이터를 입력하지 않았기 때문이다.

 

 

--network 옵션 이용

  • 위의 직접 연결 방식은 컨테이너의 ip를 조회하여 수동으로 연결하는 방식이다.
  • 이는 매우 비효율적인데 사실 도커에는 모든 컨테이너를 하나의 동일한 컨테이너로 묶을 수 있는 network 옵션이 존재한다.

 

docker network create favorites-net
docker network ls

  • 우선 네트워크를 생성한다.
  • 네트워크는 볼륨과는 달리 생성과 동시에 사용할 수 없어 우선 네트워크를 만들어줘야 한다.
  • ls 명령어로 현재 존재하는 네트워크를 확인할 수 있다.
  • favorites-net 이외의 네트워크는 디폴트로 설정되어 있는 네트워크이다.

 

  • mongoDB 컨테이너를 facorites-net이라는 네트워크 안에 넣어 실행했다.
  • mongoDB의 컨테이너명은 mongodb이다.

 

  • mongoDB와 동일한 네트워크로 node.js 컨테이너를 생성할 것이기 때문에 mongodb(컨테이너명)라고 적어주었다.
    • 같은 컨테이너 상에서는 컨테이너 명만으로 도커가 해당 컨테이너의 ip를 찾을 수 있다.
    • 따라서 favorite-net 네트워크의 mongodb 컨테이너 명을 입력하여 같은 네트워크 상의 mongoDB와 연결되도록 했다.

 

  • node 이미지를 재빌드하고 컨테이너를 생성할 때 --network 옵션을 추가하여 node.js 컨테이너를 mongoDB 컨테이너와 동일한 네트워크에 두었다.

 

  • --network 옵션으로 하나의 네트워크에 두 컨테이너를 두어 서로 통신할 수 있음을 확인할 수 있다.

 

 

 

참고

Udemy - Docker & Kubernetes : 실전가이드

728x90