본문 바로가기
docker-kub

docker - 네트워킹

by 오우지 2022. 10. 19.

컨테이너에서의 네트워킹에 대해 생각해보면 세 가지로 나눠 볼 수 있다.

1. 컨테이너와 외부 URL과의 통신

2. 호스트 머신과의 통신

3. 가상화된 DB 등과의 컨테이너간 통신

 

1. 컨테이너와 외부 URL과의 통신

첫번째는 당연하게도 그냥 url이나 ip주소 갖다 넣으면 된다.

 

2. 호스트 머신과의 통신

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

코드에 위와 같은 부분이 있고 호스트 머신에 몽고 DB가 설치되어 있는 상황을 가정했을 때

위의 코드를 다른 node 어플리케이션 같이 도커화해서 실행하면 당연하게도 호스트 머신에 설치된 몽고DB와 연결은 자동으로 되지 않는다. 에러를 뿜으며 어플리케이션이 멈추게 된다.

docker run --name favorites --rm -p 3000:3000 favorites-node

 

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

컨테이너가 호스트 머신과 통신하기 위해서는 host.docker.internal이라는 예약어를 사용하면 컨테이너가 인식해서 호스트 머신의 해당 포트와 통신한다.

 

3. 가상화된 DB 등과의 컨테이너 통신

노드 서버와 몽고db 두 개 모두 컨테이너에서 돌린다고 생각해보자. 둘 다 호스트 머신이 아니니 host.docker.internal 명령어는 통하지 않을 것이다. 우선 몽고db를 띄워보면

 

docker run -d --name mongodb mongo

잘 작동중이다.

 

해당 db에 접속하기 위해서 우선 IP 주소를 따보자.

 

docker container inspect mongodb

수 많은 항목 중 IPAddress를 찾을 수 있다.

 

이 주소를 위의 host.docker.internal에 입력해주면 

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

정상적으로 작동은 하지만 컨테이너를 내렸다 올리거나 다른 DB를 접속할 때마다 다시 이미지를 빌드해줘야 한다는 단점이 있다.

 

이를 해결하는 네트워크라는 개념이 있다. 

VPC 같은 느낌인데 하나의 네트워크로 묶인 컨테이너들이 그 안에서 통신하게 만드는 것이다.

 

docker network create private-network

와 같이 네트워크를 만들 수 있고 컨테이너를 실행할 때 --network를 통해 해당 네트워크에 포함시킬 수 있다.

 

이제 같은 네트워크 안의 다른 컨테이너에 연결할 때 다음과 같이 적어주면 된다.

 

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

해당 컨테이너 이름만 적어주면 통신시 도커가 알아서 치환해준다.