컨테이너와 호스트 머신 간 통신 시 생기는 문제
우리가 로컬에서 여러 애플리케이션을 실행하면, 해당 애플리케이션들과 통신하기 위해 localhost를 사용한다. 하지만, 컨테이너 위에서 실행되는 애플리케이션은 격리된 네트워크망 내부에 있기 때문에 localhost를 사용하면 호스트 머신에서 실행되는 애플리케이션과 통신하지 못한다.
호스트 머신에서 실행 중인 웹 애플리케이션과 Mongo DB의 통신을 생각해보자. Mongo DB가 27017번 포트를 점유해 실행된다고 할 때, 웹 애플리케이션에서 Mongo DB에 접속하기 위해서는 다음 주소를 사용하면 된다.
mongodb://localhost:27017/[데이터 베이스 이름]
하지만 컨테이너 위에서 실행 중인 웹 애플리케이션과 호스트 머신에서 실행 중인 Mongo DB와 통신하려 할 때 위의 주소를 사용하면. 27017번 포트에서 실행 중인 Mongo DB를 찾지 못한다. 외부의 네트워크와 격리된 네트워크에서 실행 중이기 때문이다.
컨테이너와 호스트 머신 간 통신하기
이런 문제를 해결하려면 Docker에서 호스트 머신과 연결하기 위해 제공되는 호스트인 host.docker.internal을 사용해야 한다. 즉, 컨테이너 환경에서 실행 중인 웹 애플리케이션에서 호스트 머신의 Mongo DB에 접속하기 위해서는 다음 주소를 사용해야 한다.
mongodb://host.docker.internal:27017/[데이터 베이스 이름]
host.docker.internal의 한계
host.docker.internal는 Window와 macOS에서만 제공된다. 만약 Linux에서 사용하려면 해당 애플리케이션이 실행 중인 IP 주소를 확인해 통신해야 한다. IP 주소를 확인하려면 docker inspect 명령어를 쓰면 된다.
docker inspect mongodb
그러면 Network - bridge 섹션에 IPAddress가 나오는 것을 확인할 수 있다. 이를 사용해 통신하면 된다.
'Docker' 카테고리의 다른 글
[Docker] docker network 사용해 컨테이너 간 통신하는 방법 완벽 정리 (0) | 2025.01.31 |
---|---|
[Docker] Dockerfile내부, .env 파일 혹은 터미널을 사용해 환경 변수 설정하는 방법 한 번에 정리하기 (0) | 2025.01.30 |
[Docker] .dockerignore 사용해 컨테이너에 복사되지 말아야 할 파일 정의하기 (0) | 2025.01.29 |
[Docker] Bind Mount 통해 호스트 머신의 경로를 컨테이너 경로와 연결하기 (0) | 2025.01.28 |
[Docker] Named Volume 이란 무엇인가? 사용 방법과 특징 정리 (0) | 2025.01.27 |