1. 글을 작성하게 된 계기
서버 비용을 절감하기 위해 로컬 환경에서 부하 테스트를 진행하고 있었습니다. 이 과정에서 도커와 호스트 간 통신이 되지 않는 이슈가 발생했는데, 어떤 문제가 있었고, 어떻게 해결했는지에 대해 정리하기 위해 작성한 글입니다.
2. 상황
AWS에 배포 후 테스트하는 것은 비용이 지속적으로 발생했습니다. 이를 해결하기 위해 로컬에서 애플리케이션을, 도커를 사용해 ngrinder를 실행해 테스트 비용을 절감하려고 시도하고 있었습니다.
- localhost로 애플리케이션 실행
- 도커로 ngrinder 실행
Ngrinder에서는 localhost로 접근하면 에러가 나기 때문에 다음과 같이 127.0.0.1로 접근하고 있었습니다.
이때 validate를 누르니 다음과 같은 에러가 발생했습니다.
1
2
3
4
5
6
7
Connection refused
java.net.ConnectException: Connection refused
at org.apache.hc.core5.reactor.InternalConnectChannel.onIOEvent(InternalConnectChannel.java:64)
at org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalChannel.java:51)
at org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleCoreIOReactor.java:179)
at org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreIOReactor.java:128)
at
3. 해결
host.docker.internal을 사용하면 컨테이너와 호스트의 통신이 가능합니다. 이는 도커 컨테이너에서 외부 환경(host)에 접속하기 위해 DNS 이름을 제공하며, 이를 통해 도커가 자동으로 호스트 시스템의 IP 주소를 해석해 줍니다.
1
http://host.docker.internal:${PORT}/URL
이를 적용하면 다음과 같이 로컬 애플리케이션과 연결이 된 것을 볼 수 있습니다.
4. 정리
도커 컨테이너에서 호스트와 통신하기 위해서는 host.docker.internal를 사용해야 합니다. 이를 적용하면 DNS를 제공해 도커가 호스트와 통신할 수 있습니다.