FastAPI로 구현된 간단한 서버 프로젝트를 도커 이미지로 빌드하여 컨테이너로 실행해두었다. 데이터베이스도 컨테이너로 실행하여 서버와 연동해보는 작업을 해보자.
우선 MariaDB 사용을 위해 이미지를 pull 받아 설치한다.
$ (sudo) docker pull mariadb
이미지를 실행하여 컨테이너가 동작되도록 한다. 개발자가 필요한 옵션들을 사용하면 된다.
docker run --name {Container Name} -e MYSQL_ROOT_PASSWORD={password}
-p 3306:3306 -d mariadb:lates
컨테이너에 접속한 뒤 mariadb에 접속한다. 이후 DB와 테이블 등을 생성한다.
docker exec -it mariadb bash
mariadb -u root -p
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>
이렇게 간단히 서버 컨테이너와 DB 컨테이너를 연동할 수 있다. 서버를 실행하여 연동이 잘 됐는지 확인하면 된다.
uvicorn main:app --reload
SQLALCHEMY_DATABASE_URL =
"mysql+aiomysql://{username}:{password}@{IP Address}:3306/{DB name}"
pymysql
이 아닌 aiomysql
을 사용할 경우 비동기 설정을 해주어야 하며 그렇지 않을 경우 오류가 발생한다engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread" : False})
check_same_thread
옵션은 sqlite
데이터베이스를 사용할 때만 필요한 설정이므로 mysql
DB를 사용할 때는 삭제해야한다