나의 상황 🤔
내 서버에 mongoDB를 잘 구축했고 telnet 명령어를 통해 mongoDB 포트도 잘 연결되는 것을 확인했다. 하지만 도커 컨테이너로 배포한 서버와 연동해보려 하니 자꾸만 connection refused error가 떴다..
Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017
암튼 대략적으로 이런 에러가 자꾸 떴는데... 이유를 모르겠었다..
알고보니 도커는 기본적으로 '브리지 네트워크(bridge network)'를 사용하는데, 이는 독립적인 네트워크 인터페이스 로 같은 서버(같은 호스트)에서 돌아가고 있더라도 도커 네트워크 스페이스 외의 아이들 ( 도커 컨테이너를 제외한 나머지 서버 프로그램들?) 을 다른 네트워크라고 여긴다는 것이다.
즉, 도커입장에서 localhost=같은 네트워크 시스템
는 같은 도커 네트워크 인터페이스에 있는 애들 뿐인것이다. ( * 같은 호스트(서버)의 다른 컨테이너는 같은 localhost )
도커 컨테이너와 호스트(서버 = 나의 경우에는 mongoDB) 간 통신을 하기 위해서는 그냥 도커 인터페이스의 ip를 확인해서 spring에 연결 설정하는 ip만 변경해주면 된다.
$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:daff:fe6c:46e3 prefixlen 64 scopeid 0x20<link>
ether 02:42:da:6c:46:e3 txqueuelen 0 (Ethernet)
RX packets 312896 bytes 71769036 (71.7 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 227443 bytes 75636874 (75.6 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
나같은 경우에는 docker0의 ipv4 주소는 172.17.0.1 이였다.
이를 그냥 설정만 바꿔주면 성공적으로 연결이 된다.
이 사실을 모르고 계속해서 포트 청기백기 한 나 ... 슬프다.
이참에 도커 네트워크 인터페이스에 대해서 알아보자
→ 알아보았다.
도커네트워크 인터페이스 vs 네트워크 인터페이스