개요
Docker를 사용하다 보면 컨테이너 내부에서 로컬 머신의 애플리케이션이나 데이터베이스에 접근해야 할 때가 있습니다.
이때 사용할 수 있는 기능이 바로 host.docker.internal 입니다.
본 글에서는 ~ 할 수 있는 "host.docker.internal"에 대해서 정리하고자 합니다.
host.docker.internal이란❓
컨테이너 내부에서 호스트 머신(로컬 컴퓨터)의 네트워크에 접근할 수 있도록 제공되는 특별한 도메인입니다.
즉, 컨테이너가 실행되는 호스트 머신의 IP를 자동으로 매핑해 주는 역할을 합니다.
기본적으로 localhost는 컨테이너 내부를 가리키기 때문에 "host.docker.internal"을 사용해야 호스트 머신의 서비스(DB 등) 에 접근할 수 있습니다. 주로 개발 환경에서 유용하게 사용됩니다.
주요 특징
- Docker Desktop을 사용할 때 Docker가 자동으로 제공하는 DNS 이름입니다.
- 컨테이너 내부에서 이 주소를 사용하면 호스트 머신의 localhost에 접근할 수 있습니다.
host.docker.internal 사용해보기
시나리오
- MongoDB는 호스트 머신(로컬)에서 실행 중 (포트 27017)
- Node.js 애플리케이션은 도커 컨테이너 내부에서 실행
- 컨테이너에서 'localhost'로 MongoDB 접근 시도 시 연결 실패
애플리케이션 코드
''''''''
생략
''''''''
mongoose.connect(
'mongodb://localhost:27017/swfavorites',
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
본 글에서 확인할 것은 컨테이너 내부에서 로컬 머신에 접근할 수 있는 지를 확인해보는 것이기 때문에 애플리케이션 코드의 일부를 발췌했습니다. 위 코드로 컨테이너를 실행하면 아래와 같은 에러가 발생합니다.
이 에러는 컨테이너가 호스트 머신에 연결하지 못했다는 의미입니다. 이는 예상된 결과인데, MongoDB는 로컬 머신에서 실행되고 있고 애플리케이션은 도커 컨테이너 내부에서 실행되고 있기 때문입니다.
수정된 애플리케이션 코드 : host.docker.internal
mongoose.connect(
'mongodb://host.docker.internal:27017/swfavorites',
{ useNewUrlParser: true },
(err) => {
if (err) {
console.log(err);
} else {
app.listen(3000);
}
}
);
- host.docker.internal 도입
- localhost를 도커가 이해할 수 있는 특별한 도메인으로 바꿔줘야 합니다. 이것이 바로 "host.docker.internal"입니다.
- 도메인 변환 과정:
- 이 특수 도메인은 도커에 의해 자동으로 인식됩니다.
- 도커 컨테이너 내부에서 호스트 머신의 실제 IP 주소로 자동 변환됩니다.
- 연결 프로세스:
- 컨테이너는 host.docker.internal을 통해 호스트 머신을 찾습니다.
- 호스트 머신의 27017 포트에서 실행 중인 MongoDB에 연결됩니다.
결론
host.docker.internal은 개발 환경에서 컨테이너와 호스트 머신 간의 통신을 단순화하는 유용한 도구입니다.
하지만 실제 운영 환경에서는 보안과 안정성을 고려한 적절한 네트워크 구성이 필요하며 개발 환경에서 사용하는 것이 권장됩니다.
'DevOps > Docker' 카테고리의 다른 글
[Docker] 도커 네트워크 이해하기 (Docker network) (0) | 2025.02.09 |
---|---|
[Docker] 도커 컨테이너 환경변수 설정 : ENV & ARG (0) | 2025.01.27 |
[Docker] 도커 바인드 마운트란 무엇일까❓: 데이터 저장과 실시간 공유 (0) | 2025.01.07 |
[Docker] Docker 컨테이너 데이터 관리: 익명 볼륨 vs 명명된 볼륨 (0) | 2025.01.06 |
[Docker] 컨테이너의 파일시스템 이해하기: 데이터는 어디에 저장될까❓ (0) | 2025.01.05 |