남기면 좋잖아
[Docker] Container 간 Connection Refused 지옥 해결 본문
docker 혹은 docker compose를 쓰며 컨테이너간 API 통신이나 DB연결 등 서로간의 연결이 필요하다.
나같은 경우 외부 API서버(container1)에서 django서버(container2)로 데이터를 가져와야 했는데 (curl container1:8000) Connection Refused 에러가 나왔다.
1. 외부 서버의 AllowHost 체크하기. 설정 잘되어 있었다..
2. 도커-컴포즈 컨테이너 간 통신은 도커가 자동으로 생성해준 브릿지 네트워크안에서 컨테이너 이름으로 서로 통신할 수 있다. 이때 실제 서로간의 ping test로 통신을 확인했지만(ping container1), 여전히 curl container1:9000 명령으로는 Connection Refused....
3. 포트설정을 잘 못한것인가? 내가 여태 포트설정 개념을 잘못알고 있었던가? 생각하여 모든 방법을 동원하여 새롭게 build, run을 시도했지만 해결되지 않았다.
4. 최신버전에 문제가 있는가? docker-compose.yml 파일을 읽기 위해 docker-compose를 가장 최신버전으로 업그레이드 했었는데, docker-compose를 다운그레이드를 해볼까도 생각했지만 차라리 도커 엔진을 이에 맞게 업데이트를 해야겠다 싶어서 업데이트 했다. 결과는? Connection Refuesed...
5. 내 맥북도 업데이트해야하나? 생각까지 들었다. 관련하여 구글신에게 물어보니 도커 공식 레퍼런스에서 mac과 관련해 해당 제한사항이 있다는 것을 알았다. 결론부터 말하자면 Docker Desktop for Mac에서는 브릿지 네트워크가 MacOS에서 연결을 안한다는 것이다.
그렇다고 방법이 없는것이 아니고, 컨테이너간의 직접적인 통신은 안되더라도 MacOS Host를 거쳐 통신할 수는 있는 방법을 제시했다.
$ docker run --rm -it alpine sh
$ apk add curl
$
$ curl http://172.18.0.3:8000 # Bad
[Error!!] Connection Refused...
$
$ curl http://container1:8000 # Bad
[Error!!] Connection Refused...
$
$ curl http://host.docker.internal:8000 # Good
[Hello World] Response Data..
$
해당 방법으로 내 장고 서버에도 숨통이 트였다. 허무하기도하고 감격스럽기도하고 ㅋㅋㅋ 그리고 8시간만에 마저 개발을 했다.
나중에 또 까먹고 삽질할까봐 오늘도 기록해둔다.
아마 비슷한 문제로 Docker Desktop for Window에서도 이런 현상이 있다면 한번 참고해보면 좋지 않을까싶다..? (찾아보진 않음)
참고 : docs.docker.com/docker-for-mac/networking/