Docker Networking - Container Communication

Sunwu Park·2023년 7월 11일

Cloud & CI/CD

목록 보기
3/17
FROM node

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

CMD ["node", "app.js"]

이런 식의 Dockerfile이 있을때

docker built -t favorites-node

라는 명령어로 빌드하고

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

라는 명령어로 실행을 한다는 것을 기본 가정으로 한다
여기서 포트가 3000:3000은 app.js에서 app.listen(3000)으로 설정했기 때문이다

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

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

이것이 app.js파일의 일부이고 가장 중요한 부분이다

만약 localhost:27017로 빌드후 실행을 하게 되면 여기서 문제가 발생한다
이는 호스트 머신에 연결을 못했다는 것이다.
즉 노드는 컨테이너 안에 존재하지만 mongoDB는 로컬 호스트에 동작하여 이 둘을 연결하고 싶지만 그런 방식으로는 작동하지는 않는다.

하지만 기본적으로 컨테이너는 World Wide Web에 Request를 보낼수는 있다
도커화된 애플리케이션 내부에서 웹 API 및 웹 페이지와 통신할 수 있다.

mongoose.connect(
  'mongodb://host.docker.internal:27017/swfavorites',
   ~~~~~
); 

이를 작동하게 할려면 도커화된 컨테이너 코드와 로컬 호스트 머신과의 통신을 가능케 해야하는데 이는 도커가 이해할 수 있는 특별한 언어를 써야한다.
도커 컨테이너가 알 수 있는 호스트 머신의 ip주소로 변환된다.
도메인이 필요한곳, url이 필요한 어디서는 사용 가능하다
http request도 가능하다

컨테이너와 컨테이너와의 통신

1) Network 를 사용하지 않는 방법

  1. 먼저 MongoDB 이미지를 기반으로 새 컨테이너를 생성한다. 이 이미지는 MongoDB 데이터베이스를 가동한다.
docker run -d --name mongodb mongo
  1. docker container inspect mongodb 명령어를 쳐서 나오는 IP주소를 입력해준다
mongoose.connect(
  'mongodb://172.17.0.2:27017/swfavorites',
  { useNewUrlParser: true },
  (err) => {
    if (err) {
      console.log(err);
    } else {
      app.listen(3000);
    }
  }
); 
  1. 빌드
docker built -t favorites-node
  1. RUN
docker run --name favorites -d --rm -p 3000:3000 favorites-node

2) Network 사용하는 방법

이렇게 모든 컨테이너가 서로 통신이 가능한 네트워크를 생성하는 방법이다. 도커는 수동으로 했던 ip주회 및 해결작업을 자동으로 수행한다.

  1. docker network 를 create한다
docker network create favorites-net
  1. mongo container 만들기
docker run -d --name mongodb -- network favorites-net mongo
  1. nodejs의 코드를 바꿔준다
mongoose.connect(
  'mongodb://mongodb:27017/swfavorites',
  { useNewUrlParser: true },
  (err) => {
    if (err) {
      console.log(err);
    } else {
      app.listen(3000);
    }
  }
); 

mongodb 가 들어간 이유는 mongo container의 이름을 mongodb로 설정했기 때문이다. 만약 이름이 다르다면 그 다른 이름을 넣어주면 된다

  1. 빌드
docker built -t favorites-node
  1. RUN -> 여기서는 --network를 써서 같은 네트워크에 위치하도록 한다
docker run --name favorites --network favorites-net -d --rm favorites-node

-> 또한 컨테이너끼리 연결이 되어있다면 포트를 굳이 설정해줄 의미가 없다.
보통 로컬 -> 외부에서 컨테이너에 연결할려고 사용하는 것이기 때문이다

도커는 실제로 소스코드를 읽지는 않고 mongodb나 다른 http요청을 보낼때를 인지하여 실제 IP주소로 바꿔주는것이다.

Docker Network Driver

Docker Networks는 실제로 네트워크 동작에 영향을 미치는 다양한 종류의 '드라이버'를 지원합니다.

디폴트 드라이버는 'bridge' 드라이버입니다. 이 드라이버는 모듈에 나타난 동작을 제공합니다 (즉, 컨테이너가 동일한 네트워크에 있는 경우, 이름으로 서로를 찾을 수 있음).

드라이버는 네트워크 생성 시 '--driver' 옵션을 추가하여 간단히 설정할 수 있습니다.

0개의 댓글