티스토리 뷰

반응형

백엔드, 프론트엔드, 소켓 서버를 각각 다른 컨테이너로 만들어서 소통하는 프로젝트를 실행했다.

그러나 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',  # 컨테이너 내 경로와 일치하도록 수정
    }
}

 

반응형