Docker 공부 끄적(4) - 컨테이너 통신

JH Bang·2023년 2월 22일
0

개발 지식

목록 보기
9/11

컨테이너가 통신하는 형태는 세가지

1) WWW와 통신

default로 이뤄진다. 요청만 하면 된다.

2) 호스트 머신과 통신

도커 컨테이너에서 localhost는 컨테이너 내의 localhost를 의미한다. 따라서 호스트머신의 로컬호스트에 접근하기 위해서는

localhost -> host.docker.internal 

로 바꿔준다.

예를들어 node 앱에서

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

3) 컨테이너 간 통신

예를들어 mongodb를 컨테이너로 실행한다고 하면,

docker run -d --name mongodb mongo 

이제 컨테이너를 살펴본다

docker inspect mongodb

그러면 "NetworkSettings"에 ipaddress가 "172.17.0.0/16"범위에 할당돼 있는 것을 볼 수 있다.

예를들어 node 앱에서

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

컨테이너 네트워크 구축

docker network

docker network create [my network name]

이 상태는 컨테이너들을 동일한 네트워크 상에 있게 해주므로 ip주소 대신 특정 컨테이너(예를들어 node app)에서 ip주소 대신 다른 컨테이너의 이름을 적는다.

예를들어 node 앱에서

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

docker run 시에

--network [my network name]

으로 네트워크를 연결하면 된다.

예시

network 없이

mongodb를 컨테이너로 실행

docker run -d --rm --name mongodb -p 27017:27017 mongo

백엔드용 Dockerfile

FROM node

WORKDIR /app

COPY package.json .

RUN npm install

COPY . .

EXPOSE 80

CMD ["node", "app.js"]
docker build -t backend-img .

mongoose.connect()에 host.docker.internal:27017로 설정한 다음

docker run -d --rm --name backend-app -p [port]:[port] backend-img 

프론트(react)용 Dockerfile

FROM node
WORKDIR /app
COPY package.json .
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "start"]
docker build -t front-img .
docker run --name front-app --rm -d -p 3000:3000 front-img

네트워크

-p [port]:[port] 대신 --network [network]로 설정
단, 그전에 리액트 같은 경우에는 컨테이너에서 실행되는 것이 아니라 웹브라우저가 실행하는 것이므로 코드 내 연결 주소를 localhost로 설정하고 docker run 시 backen나 forned 컨테이너에 모두 -p 옵션을 유지한다.

profile
의지와 행동

0개의 댓글