1. DB_HOST=localhost(APP local, DB Container)
어플리케이션이 로컬에서 직접 실행될 때(Docker로 빌드해서 띄운게 아닌 호스트에서 실행할 때)는 디비의 호스트를 localhost로 한다.
이 경우 localhost는 host os의 PSQL, MySQL 등을 가리킨다.
Docker 컨테이너 내부에서는 작동을 안한다는 점이 특징이다.
2. DB_HOST=host.docker.internal(APP Container, DB Container)
docker run -d --name my-postgres postgres
docker run -d --name my-app my-app-image
어플리케이션이 Docker 컨테이너 내부에서 실행된 상태에서 PSQL이 호스트 머신에서 실행중일 때
두개의 컨테이너는 서로 다른 네트워크에 올라가있어서 직접 통신이 불가능하다.
이 경우 host.docker.internal가 Docker 컨테이너 -> 다른 Docker 컨테이너 호스트로의 접속을 가능하게 해준다.
docker network create my-network
docker run -d --name my-postgres --network my-network postgres
docker run -d --name my-app --network my-network my-app-image
또는 같은 커스텀 네트워크로 연결해주면 DB_HOST=postgres 처럼 docker-compose와 같게 서비스명을 붙여 사용할 수 있다.
3. DB_HOST=DB 컨테이너 이름(DB_HOST=postgres)(docker-compose)
services:
postgres:
image: postgres
ports:
- "5432:5432"
app:
build: .
environment:
DB_HOST: postgres
위 같은 경우 PSQL이 docker-compose로 묶여 컨테이너로 실행중이며, 내부의 서비스로 연결된다.
즉, 동일 네트워크 (bridge)로 자동 연결되며 이는 내부 DNS 서비스 이름으로 연결을 하는 것이다.
정리
상황 | 설명 | 네트워크 연결 방식 | DB_HOST 환경변수 값 |
docker-compose로 같이 올림 | 동일 네트워크 (bridge)로 자동 연결 | 내부 DNS로 서비스 이름으로 연결 가능 | DB서비스이름 |
서로 다른 도커 커맨드로 올림 (docker run 따로 실행) | 네트워크 분리됨 → 직접 연결 안됨 | 공유 네트워크 수동 생성 후 둘 다 붙여야 함 | 컨테이너 IP 또는 host.docker.internal |
앱은 컨테이너, DB는 호스트 | 컨테이너가 호스트로 접속 | 컨테이너에서 localhost는 자기 자신이므로 host.docker.internal 사용 | host.docker.internal |
앱은 로컬, DB는 컨테이너 | 호스트가 컨테이너로 접속 | DB 컨테이너가 포트 포워딩 중 (-p 5432:5432) 이면 호스트에서 localhost:5432로 접근 가능 | localhost |
문제 요약
어플리케이션과 DB를 따로 도커 컨테이너로 띄우면 서로 다른 컨테이너로 간주해서 네트워크가 달라 통신이 안된다.
해결법
- 같은 네트워크로 묶거나 (공유 네트워크 생성) -> docker-compose
- 하나는 호스트, 하나는 컨테이너일 경우 host.docker.internal을 사용 -> 환경변수 다르게 설정
'도커 & 쿠버네티스 > docker' 카테고리의 다른 글
docker-compose.test.yml 파일 Property services is not allowed 에러 (0) | 2024.06.25 |
---|---|
Docker로 띄운 Mysql 접속 에러 (0) | 2023.05.02 |
Dockerfile ENV, ARG 차이 (0) | 2023.02.23 |
도커 컴포즈 (0) | 2022.05.13 |
도커 설치 및 실행 (0) | 2022.05.13 |