Docker

[Docker] host.docker.internal

kidmillionaire1998 2025. 2. 4. 10:53

host.docker.internal이란? 

host.docker.internal은 Docker 컨테이너가 호스트 머신(컨테이너를 실행하는 실제 컴퓨터) 에 접근할 수 있게 해주는 호스트 이름이다. 

왜 필요한가?

Docker 컨테이너는 기본적으로 격리된 네트워크 환경에서 동작한다.
하지만 가끔 컨테이너 내부에서 호스트 머신에 있는 서비스(예: DB, API 서버)에 접근해야 할 때가 있다.

 

vs localHost

컨테이너 내부의 localhost는 자기 자신을 가리킨다. 컨테이너의 관점에서, Ec2와 같은 호스트 머신을 의미하는 것이 아니다.

 

 

예시 

아래 예시의 서비스들은 모두 컨테이너로 배포되었다고 가정한다. 

Prometheus & Spring Actuator 

Prometheus 컨테이너에서는 같은 호스트이지만 다른 컨테이너인 Spring에 접근하여, /actuator/promethues의 데이터를 수집해야한다. 즉, 설정 파일에서의 targets은 다음과 같다. 

prometheus target health

 

scrape_configs:
  - job_name: 'monitor'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      //8080포트의 spring 컨테이너 
      - targets: ['host.docker.internal:8080']

 

 

Promtail & Loki 

Promtail 컨테이너에서는, Spring 로그파일을 Loki로 전송한다. 하지만, 앞의 경우와 달리, Spring 컨테이너의 로그파일을 도커 볼륨으로 설정하여, 이미 Promtail Container 내부에 위치시켜놨다. 즉, Promtail 컨테이너 내부의 로그 데이터를 가져와야하며, targets은 다음과 같다. 

scrape_configs:
  static_configs:
  - targets:
     //promtail 컨테이너 내부
      - localhost
    labels:
      job: varlogs
      //도커 볼륨 설정으로 이미 컨테이너 내부에 로그가 존재한다.
      //컨테이너 내부의 log확장자를 가지는 파일 수집 후 loki로 전송 
      __path__: /var/log/spring-boot/*.log