본문 바로가기

STUDY/Docker & Kubernetes: 실전 가이드 -2022년판

10. 네트워킹: 컨테이너 통신

통신의 종류

 

스타워즈 영화와 인물들을 검색하고 선호하는 영화와 인물을 저장하고 관리할 수 있는 favorite 어플리케이션이 있다. 이 어플리케이션으로 3가지의 네트워크 통신을 테스트해보고자 한다. 먼저 인터넷을 통한 어플리케이션과 외부 API와의 통신이다. favorite는 swapi.dev의 api로 요청을 보내서 스타워즈의 영화와 인물 정보를 가져온다. 그 다음은 컨테이너와 로컬 호스트의 통신이다. favorite는 localhost의 mongodb에 사용자의 데이터를 저장할 것이다. 마지막으로 컨테이너간의 통신이다. 이는 favorite의 사용자 데이터를 로컬호스트가 아니라 새로운 mongodb 컨테이너를 띄워서 저장할 것이다.

 

 


외부와의 통신

 

> docker build -t favorite .
> docker run --name favorite -d --rm -p 3000:3000 favorite

favorite의 /movies, /peopple api로 요청을 보내봤다. 해당 api는 내부적으로 swapi.dev의 api를 요청해서 그 결과를 반환해준다. 실행 결과 /movies, /peopple는 잘 동작한다. 즉 컨테이너에서 인터넷을 통한 외부와의 통신은 별도의 설정이 없어도 잘 동작한다.

 

 


컨테이너와 로컬호스트의 통신

 

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

 

> docker build -t favorite .
> docker run --name favorite -d --rm -p 3000:3000 favorite
...
failed to connect to server [localhost:27017]
...

사용자의 정보를 저장하기 위해 로컬호스트에 mongodb를 설치하고 컨테이너에서 실핼될 코드에 mongodb에 연결하는 부분을 추가하였다. 그리고 소스를 수정했으니 이미지를 다시 빌드하고 컨테이너로 실행했다. 하지만 컨테이너는 실행중에 mongodb 연결에 실패한다. 컨테이너에서 localhost는 실행중이 컨테이너 스스로를 가르킨다. 컨테이너를 실행한 호스트를 가르키려면 host.docker.internal을 사용해야한다.

 

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

 

> docker build -t favorite .
> docker run --name favorite -d --rm -p 3000:3000 favorite

해당 코드를 localhost에서 host.docker.internal로 수정하여 다시 빌드하고 컨테이너를 실행하면 정상 동작하는것을 확인할 수 있다.

 

 


컨테이너간의 통신

 

> docker run -d --name mongodb mongo
> docker inspect mongodb
...
"IPAddress": "172.0.0.2",
...

 

 

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

 

> docker build -t favorite .
> docker run --name favorite -d --rm -p 3000:3000 favorite

이제 mongodb를 로컬 호스트가 아니라 컨테이너에 띄워서 컨테이너간 통신을 하고자 한다. mongo 이미지로 컨테이너를 만들고 docker inspect 명령어를 실행해보면 해당 컨테이너의 IPAdress가 나온다. 해당 IP를 복사해서 mongodb를 연결하는 소스에 붙여넣고 컨테이너를 실행하면 정상 동작하는걸 확인할 수 있다. 하지만 매번 IP주소를 확인하고 소스에 넣는 작업을 할 수는 없다.

 

> docker network create favor-net
> docker run -d --name mongodb --network favor-net mongo

 

 

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

 

> docker build -t favorite .
> docker run --name favorite -d --rm -p 3000:3000 --network favor-net favorite

docker network create 명령어로 도커 네트워크를 생성하고 컨테이너를 --network 옵션으로 같은 네트워크에 넣어주면, 컨테이너의 이름만으로 서로간에 통신할 수 있다.

 

728x90