docker container를 사용하는 pc를 host로 해서 올려보았다.
nginx에 루트 server port : 80으로 받고, proxy로 localhost:3000으로 보내주도록 설정을 짰다.
# 아래처럼 돌렸을 때 프록시를 연결 못하는 문제 발생
server {
listen 80;
server_name frontend;
location / {
proxy_pass http://localhost:3000;
}
}
}
근데, localhost:80에서는 502 error가 뜨고,
localhost:3000으로 들어갔을때는 frontend앱이 잘 돌아가고 있다..!
도대체 뭐지;;
docker container가 올라간 ip랑 내 local computer의 ip가 달라서 발생한 일
(docker container IP : 172.30… 내 컴퓨터는 172.20… 로 ip주소가 달랐다)
왜 host ip를 따르지 않는지 의문..(TBD 알아보겠음..)
무식하게 host ip를 nginx.conf에 지정해버린다
server {
listen 80;
server_name frontend;
location / {
proxy_pass http://999.99.9:3000; # 임의의 ip입니다..!
}
}
}
하지만 이 방법은 권장되지 않는다. 왜냐면, IP주소라는 건 유동적일 수 있기 때문에 매번 수정해줘야한다는 불편함 + 불안함과 함께해야하기 때문이다
docker compose 설정을 통해 nginx가 host ip를 받아올 수 있도록 세팅한다
nginx 설정을 통해서 위와 같은 문제를 해결할 수 있는데, host.docker.internal읈 사용하는 것이다.
Host.docker.internal은 docker container의 host ip를 담고 있는 녀석으로, 아무리 host ip가바뀌어도 알아서 척척 잘 가져온다.
사용하는 방법은 아래와 같다.
docker-compose.yml
설정
service:
nginx:
extra_hosts:
- "host.docker,internal:host-gateway"
Nginx.conf 수정
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://host.docker.internal:3000
}
}
https://stackoverflow.com/questions/38346847/nginx-docker-container-502-bad-gateway-response
https://shanepark.tistory.com/209