컨테이너가 통신하는 형태는 세가지
default로 이뤄진다. 요청만 하면 된다.
도커 컨테이너에서 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);
}
}
);
예를들어 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]
으로 네트워크를 연결하면 된다.
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 옵션을 유지한다.