Log Stash

as an Industrial Personnel

Note

TIL: docker 컨테이너안에서 ip 바인딩은 localhost가 아니라 0.0.0.0으로 해야한다

SavvyTuna 2017. 7. 2. 20:50

요 며칠간 레일즈로 만들어진 웹앱을 도커 컨테이너 위에 deploy 시키려고 시도 했었었다. 결과적으로는 안돼서 그냥 때려쳤는데, 그 사이에 수 많은 삽질과 뻘짓 사이에 그래도 적어두면 괜찮을것이라고 생각되는게 하나 있어서 작성함.

도커 컨테이너 안에서 레일즈 앱을 하나 배포 시켜놓고 포트 매핑까지 잘 해줬는데 외부에서 접속이 안됐다. 컨테이너 내부에서 localhost로 curl을 날려보면 html 내용물이 잘 보이는데, 컨테이너 바깥 호스트에서 날려보면

curl: (56) Recv failure: Connection reset by peer

이렇게 커넥션이 리셋되는 문제가 있었다. 그래서 스택 오버플로우를 찾아보니 localhost(127.0.0.1) 말고 0.0.0.0으로 ip를 바인딩 시키라고 하더라. 그래서 아래처럼 레일즈의 -b 옵션으로 0.0.0.0에 바인딩 시켜서 서버를 실행했더니 컨테이너 밖에서도 접근할 수 있었다.

rails server -b 0.0.0.0

생각해보면 당연한게 localhost로 바인딩하면, 그 서버는 도커 컨테이너 내부의 127.0.0.1로 오는 요청만 받아들이게 된다. 대신에 '모든 인터페이스'를 의미하는 0.0.0.0에 바인딩하면 밖에서도 접근이 가능하게 되는거고. 레일즈 뿐만이 아니라 다른 웹앱들도 마찬가지.

localhost와 0.0.0.0의 차이점에 대해선 링크 참조.

이 외에도 rbenv에서 루비 2.3.1버전을 설치하려고 하면 최신 버전의 openssl과 충돌해서 sudo apt install libssl1.0-dev를 해줘야 한다거나, nginx conf 파일이 잘 되는지 확인해 보려면 nginx -t를 해봐야 한다거나 (수정하고 다시 /etc/init.d/nginx restart) 등의 다양한 삽질을 통해 deploy까지 다 했지만, localhost에 접속하자마자 "something's wrong" 이라며 반겨주는 웹 페이지를 보면서 그냥 때려치기로 했다. 딱히 필요한것도 아녔고 이거에 붙잡혀 있을 시간에 딴거 했으면 더 나았을 것이라는 생각이 들어서..

Refrerences