티스토리 뷰
반응형
백엔드, 프론트엔드, 소켓 서버를 각각 다른 컨테이너로 만들어서 소통하는 프로젝트를 실행했다.
그러나 Localhost 실행이 안되는 문제가 발생했다.
결론부터 말하자면 docker-compose.yml을 이렇게 써야 한다.
version: '3.8'
services:
backend:
build:
context: .
dockerfile: Dockerfile.backend
ports:
- "8000:8000"
volumes:
- ./AIVLE_Backend:/app/AIVLE_Backend
networks:
- app-network
extra_hosts:
- "host.docker.internal:host-gateway"
frontend:
build:
context: .
dockerfile: Dockerfile.frontend
ports:
- "3000:3000"
volumes:
- ./client:/app
depends_on:
- backend
networks:
- app-network
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- REACT_APP_BACKEND_URL=http://host.docker.internal:8000
- REACT_APP_SOCKETIO_URL=http://host.docker.internal:5000
socketio:
build:
context: .
dockerfile: Dockerfile.backend
command: python AIVLE_Backend/socketio_server/server.py
ports:
- "5000:5000"
depends_on:
- backend
networks:
- app-network
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
app-network:
driver: bridge
Docker을 사용할 때는 항상 내부 ip로 자동 연결이 된다고 한다.
그렇기에 localhost를 연결해주려면 extra_hosts에 저렇게 internal로 써주는 게 중요하다.
또한 Docker를 사용할 때는 경로를 하드 코딩이 아니라 항상 BASE_DIR을 설정하는 걸 생활화하는게 중요하다.
만약 DB를 인식하지 못한다면 꼭 BASE_DIR을 잘 설정해 뒀는지 한번 봐주자.
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': BASE_DIR / 'DB.sqlite3', # 컨테이너 내 경로와 일치하도록 수정
}
}
반응형