[Docker] MariaDB 컨테이너와 서버 컨테이너 연동

김지현·2024년 7월 29일
0

FastAPI로 구현된 간단한 서버 프로젝트를 도커 이미지로 빌드하여 컨테이너로 실행해두었다. 데이터베이스도 컨테이너로 실행하여 서버와 연동해보는 작업을 해보자.

MariaDB Container

  1. MariaDB image pull

우선 MariaDB 사용을 위해 이미지를 pull 받아 설치한다.

$ (sudo) docker pull mariadb
  1. MariaDB 컨테이너 실행

이미지를 실행하여 컨테이너가 동작되도록 한다. 개발자가 필요한 옵션들을 사용하면 된다.

docker run --name {Container Name} -e MYSQL_ROOT_PASSWORD={password}
-p 3306:3306 -d mariadb:lates
  • —name : 컨테이너 이름 설정
  • -e : 환경설정
  • -p : 포트 매핑
  • -d : 백그라운드 실행
  1. MariaDB 접속

컨테이너에 접속한 뒤 mariadb에 접속한다. 이후 DB와 테이블 등을 생성한다.

docker exec -it mariadb bash
mariadb -u root -p
  1. FastAPI 프로젝트 DB URL 변경

DB를 컨테이너로 띄웠으므로 이를 프로젝트와 연동하기 위해 DB URL을 설정해준다.

SQLALCHEMY_DATABASE_URL = 
"mysql+pymysql://{username}:{password}@{IP Address}:3306/{DB name}"

컨테이너 IP 주소는 inspect로 확인할 수 있다.

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <컨테이너_ID>
  1. 서버 실행 후 확인

이렇게 간단히 서버 컨테이너와 DB 컨테이너를 연동할 수 있다. 서버를 실행하여 연동이 잘 됐는지 확인하면 된다.

uvicorn main:app --reload

트러블 슈팅

  1. 잘못된 DB URL의 설정
SQLALCHEMY_DATABASE_URL = 
"mysql+aiomysql://{username}:{password}@{IP Address}:3306/{DB name}"
  • pymysql이 아닌 aiomysql을 사용할 경우 비동기 설정을 해주어야 하며 그렇지 않을 경우 오류가 발생한다
  1. 잘못된 옵션 설정
engine = create_engine(
    SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread" : False})
  • check_same_thread 옵션은 sqlite 데이터베이스를 사용할 때만 필요한 설정이므로 mysql DB를 사용할 때는 삭제해야한다
  • mysql DB는 멀티 스레드를 지원하기 때문이다

0개의 댓글