개발 공부

Docker Compose, Localhost,DB 본문

Docker

Docker Compose, Localhost,DB

아이셩짱셩 2024. 12. 11. 12:10

Docker Compose는 여러 컨테이너를 함께 관리하고 설정할 수 있는 강력한 도구입니다. 본 포스트에서는 Docker Compose를 활용하여 네트워크 구성, 데이터베이스 연결, 그리고 전체적인 파일 로드 방식을 다루겠습니다.


1. 네트워크 컨텍스트 이해하기

Docker Compose에서 네트워크는 각 서비스가 서로 통신할 수 있도록 연결을 설정하는 핵심 요소입니다. 기본적으로 Docker Compose는 자체 네트워크를 생성하며, 각 컨테이너는 이름 기반으로 다른 컨테이너에 접근할 수 있습니다.

  • bridge 네트워크: Docker Compose의 기본 네트워크로, 같은 Compose 프로젝트 내의 컨테이너가 서로 통신할 수 있습니다.
  • host.docker.internal: 로컬 머신에서 실행 중인 호스트 서비스에 접근할 때 사용하는 특별한 이름입니다 (Windows와 macOS에서만 지원).
  • 네임스페이스: Docker 컨테이너는 기본적으로 분리된 네트워크 네임스페이스에서 실행됩니다. 따라서, 컨테이너 내부에서 localhost는 컨테이너 자체를 가리키며, 호스트 머신을 가리키지 않습니다. 호스트 머신에 접근하려면 적절한 호스트 이름(host.docker.internal 등)을 사용해야 합니다.

2. 데이터베이스 호스트 구성하기

데이터베이스 연결 문제를 해결하려면 상황에 따라 적절한 호스트 설정을 해야 합니다. 아래 두 가지 시나리오를 다뤄보겠습니다.

시나리오 A: 데이터베이스가 로컬 머신에서 실행 중인 경우

호스트 머신에서 데이터베이스를 실행하고 Docker 컨테이너에서 이를 접근하려면 host.docker.internal을 사용합니다.

 

Docker Compose는 여러 컨테이너를 함께 관리하고 설정할 수 있는 강력한 도구입니다. 본 포스트에서는 Docker Compose를 활용하여 네트워크 구성, 데이터베이스 연결, 그리고 전체적인 파일 로드 방식을 다루겠습니다.

version: '3.8'
services:
  nextjs-app:
    build:
      context: .
    ports:
      - "3000:3000"
    environment:
      DB_HOST: host.docker.internal
      DB_USER: root
      DB_PASSWORD: password
      DB_NAME: example_db
    volumes:
      - .:/usr/src/app
    command: "npm run dev"

 

시나리오 B: 데이터베이스가 별도의 Docker 컨테이너에서 실행 중인 경우

이 경우 Docker Compose를 사용하여 데이터베이스와 애플리케이션 컨테이너를 연결할 수 있습니다.

version: '3.8'
services:
  nextjs-app:
    build:
      context: .
    ports:
      - "3000:3000"
    environment:
      DB_HOST: mariadb
      DB_USER: admin
      DB_PASSWORD: admin123
      DB_NAME: example_db
    depends_on:
      - mariadb
    volumes:
      - .:/usr/src/app
    command: "npm run dev"

  mariadb:
    image: mariadb:10.6
    container_name: mariadb-container
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: example_db
      MYSQL_USER: admin
      MYSQL_PASSWORD: admin123
    ports:
      - "3306:3306"
    volumes:
      - mariadb_data:/var/lib/mysql

volumes:
  mariadb_data:

3. 주요 개념

1) docker-compose.yml 파일

docker-compose.yml 파일은 다음 요소들을 정의합니다:

  • 서비스: 애플리케이션의 각 구성 요소(예: Next.js, 데이터베이스 등).
  • 네트워크: 컨테이너 간의 통신을 설정하는 가상 네트워크.
  • 볼륨: 데이터를 지속적으로 저장하거나 컨테이너와 호스트 간 파일을 공유.

2) 데이터베이스 구성

docker-compose.yml 내의 데이터베이스 설정은 데이터베이스 컨테이너를 올바르게 실행하고 환경 변수를 통해 애플리케이션과 연결하는 데 사용됩니다.

  • 환경 변수 설정: 데이터베이스 이름, 사용자, 비밀번호 등을 설정.
  • 볼륨 사용: 컨테이너가 종료되더라도 데이터가 유지되도록 설정.

4. 파일 로드 방식

Docker Compose에서 파일을 로드하는 방법은 다음과 같습니다:

1) 환경 변수 파일 로드

docker-compose.yml에서 환경 변수 파일을 지정하여 환경 설정을 자동화할 수 있습니다:

env_file:
  - .env.local

2) 볼륨 마운트

로컬 파일을 컨테이너에 연결하여 코드 변경 사항이 즉시 반영되도록 설정:

volumes:
  - .:/usr/src/app

3) 종속성 관리

depends_on 옵션으로 애플리케이션과 데이터베이스 간의 실행 순서를 보장:

depends_on:
  - mariadb

5. Docker Compose 워크플로우

    1. Docker Compose 실행
      docker-compose up --build
    2. 컨테이너 종료 및 삭제
      docker-compose down
    3. 이미지 및 볼륨 내보내기 (선택 사항)
      • 이미지를 저장 :
        docker save -o nextjs_app_image.tar nextjs-app

      • 볼륨 데이터를 백업 :
        docker save -o nextjs_app_image.tar nextjs-app


    4. 다른 PC에서 실행 
      • 프로젝트와 환경 변수 파일을 복사.
      • 다음 명령어로 실행:
        docker-compose up --build

이 가이드를 통해 Docker Compose를 활용하여 Next.js 애플리케이션과 데이터베이스를 관리하고, 네트워크 및 설정 문제를 효과적으로 해결할 수 있습니다. 추가 질문은 댓글로 남겨주세요! 😊

'Docker' 카테고리의 다른 글

Docker 포트 맵핑  (0) 2024.12.11
Docker Linux 컨테이너 비추천 이유  (0) 2024.12.11
Docker Node.js vs. Nginx  (0) 2024.12.11
Comments