-
[Docker] 개발용 데이터베이스 띄우기(MySQL, PostgreSQL, MongoDB)Backend 2022. 3. 27. 13:20반응형
실무에서 프로젝트를 진행할때나 개인 프로젝트를 진행할 때 로컬에 데이터베이스를 띄워야 하는 경우가 있다. 그런데 프로젝트마다 필요한 데이터베이스도 다르고, 같은 데이터베이스라도 여러 설정이 달라야할 수 있다.
이때 프로젝트별로 필요한 데이터베이스 환경을 컨테이너로 만들어놓으면 굉장히 편리한데, 특히 협업을 하는 경우 이 환경을 docker-compose.yml 파일로 만들어놓으면 동일한 데이터베이스 환경에서 개발을 할 수 있다.
Docker Compose를 이용해서 오픈소스 데이터베이스 3대장인 MySQL, PostgreSQL, MongoDB를 띄우는 방법을 알아보자.
MySQL
MySQL을 docker-compose로 띄우기 위한 기본 설정은 다음과 같다.
version: "3.9" services: database: image: mysql:8 environment: MYSQL_ROOT_PASSWORD: rootpassword restart: always
이미지 이름은 mysql이고, 이미지 저장소에서 사용할 수 있는 버전을 찾아서 명시해줄 수 있다. 필수로 설정해야하는 환경 변수는
MYSQL_ROOT_PASSWORD
로, root 계정의 비밀번호이다.Authentication plugin 'caching_sha2_password' cannot be loaded: The specified module could not be found 오류 발생시
MySQL 8 버전부터 기본 인증 플러그인이 caching_sha2_password로 바뀌었기 때문에 필요하다면 실행 옵션으로
--default-authentication-plugin=mysql_native_password
옵션을 추가해주자.필수 설정 외에 사용할 수 있는 유용한 설정들은 다음과 같다.
포트 매핑
컨테이너 네트워크 외부에서 데이터베이서에 접속하기 위해서는 컨테이너의
3306
포트를 로컬의 적절한 포트로 매핑하는 설정을 추가해주어야 한다.데이터 마운트
컨테이너가 종료된 이후에도 데이터를 유지하기 위해서는 컨테이너의
/var/lib/mysql
디렉토리를 로컬의 적절한 경로에 마운트 시켜줘야 한다.주요 환경 변수
MYSQL_DATABASE
이 환경변수가 명시된 경우, 해당 환경변수 값을 이름으로 하는 데이터베이스가 생성된다.
MYSQL_USER
,MYSQL_PASSWORD
이 환경변수 값들이 주어지면 해당 환경변수 값을 이름과 비밀번호로 가지는 유저가 생성된다(두 가지 모두 명시해야함). 만약 MYSQL_DATABASE 환경변수로 데이터베이스를 생성했다면 이 유저는 해당 데이터베이스의 슈퍼 유저가 된다.
초기화 설정
처음 인스턴스를 생성할 때 추가적인 데이터베이스 초기화를 위해 실행할 .sh 또는 .sql 파일이 있다면, 컨테이너의
/docker-entrypoint-initdb.d
디렉토리에 해당 파일이 들어있는 디렉토리를 마운트 시켜주어야 한다. 환경변수로 설정한 MYSQL_DATABASE 에 초기화가 이루어질 것이다.(파일명의 알파벳 순서로 실행)커스텀 설정 파일
직접 작성한 .cnf 파일을 기본 설정으로 사용하고 싶다면 컨테이너의
/etc/mysql/conf.d
디렉토리를 로컬의 .cnf 파일이 들어있는 디렉토리에 마운트 시켜주면 된다.MySQL의 자세한 설정파일 옵션들은 공식문서를 참고하자.
위에서 설명한 옵션들을 사용한 전체 docker-compose.yml 파일 형태는 다음과 같다.
version: "3.9" services: database: image: mysql:8 command: --default-authentication-plugin=mysql_native_password ports: - "3306:3306" volumes: - ./mysql/data:/var/lib/mysql # - ./mysql/conf:/etc/mysql/conf.d # - ./mysql/init:/docker-entrypoint-initdb.d environment: MYSQL_ROOT_PASSWORD: rootpwd MYSQL_DATABASE: dev MYSQL_USER: seungtaek MYSQL_PASSWORD: seungtaekpwd restart: always
PostgreSQL
PostgreSQL을 docker-compose로 띄우기 위한 기본 설정은 다음과 같다.
version: "3.9" services: database: image: postgres:14 environment: POSTGRES_PASSWORD: rootpwd restart: always
이미지 이름은 postgres이고, 이미지 저장소에서 사용할 수 있는 버전을 찾아서 명시해줄 수 있다. 필수로 설정해야하는 환경 변수는
POSTGRES_PASSWORD
로, 슈퍼유저의 비밀번호이다. 기본 슈퍼유저의 이름은 postgres이다.필수 설정 외에 사용할 수 있는 유용한 설정들은 다음과 같다.
포트 매핑
컨테이너 네트워크 외부에서 데이터베이서에 접속하기 위해서는 컨테이너의
5432
포트를 로컬의 적절한 포트로 매핑하는 설정을 추가해주어야 한다.데이터 마운트
컨테이너가 종료된 이후에도 데이터를 유지하기 위해서는 컨테이너의
/var/lib/postgresql/data
디렉토리를 로컬의 적절한 경로에 마운트 시켜줘야 한다.주요 환경 변수
POSTGRES_USER
이 환경변수 값이 명시된 경우, 해당 환경변수 값을 이름으로 하는 슈퍼유저가 생성된다. 이 계정의 비밀번호는 POSTGRES_PASSWORD 로 설정한 값이 된다. 그리고 아래에 설명할 POSTGRES_DB값이 주어지지 않는 경우, 같은 이름의 데이터베이스가 생성된다.
POSTGRES_DB
이 환경변수값이 명시된 경우, 처음 컨테이너 생성시 해당 환경변수 값을 이름으로 하는 기본 데이터베이스가 생성된다.
초기화 설정
처음 인스턴스를 생성할 때 추가적인 데이터베이스 초기화를 위해 실행할 .sh 또는 .sql 파일이 있다면, 컨테이너의
/docker-entrypoint-initdb.d
디렉토리에 해당 파일이 들어있는 디렉토리를 마운트 시켜주어야 한다. 환경변수로 설정한 POSTGRES_DB 에 초기화가 이루어질 것이다.(파일명의 알파벳 순서로 실행)커스텀 설정 파일
직접 작성한 .cnf 파일을 기본 설정으로 사용하고 싶다면 로컬의 .cnf 파일을 컨테이너의
/etc/postgresql/postgresql.conf
파일로 마운트시켜주고 실행 옵션으로-c config_file=/etc/postgresql/postgresql.conf
를 넣어주자.이때 설정파일에는
listen_addresses = '*'
이 있어야 외부에서 접속이 가능하다고 하니 꼭 넣어주자.PostgreSQL의 자세한 설정파일 옵션들은 공식문서를 참고하자.
위에서 설명한 옵션들을 사용한 전체 docker-compose.yml 파일 형태는 다음과 같다.
version: "3.9" services: database: image: postgres:14 command: -c config_file=/etc/postgresql/postgresql.conf ports: - "5432:5432" volumes: - ./pg/data:/var/lib/postgresql/data # - ./pg/my.conf:/etc/postgresql/postgresql.conf # - ./pg/init:/docker-entrypoint-initdb.d environment: POSTGRES_USER: seungtaek POSTGRES_PASSWORD: seungtaekpwd POSTGRES_DB: dev restart: always
MongoDB
MongoDB를 docker-compose로 띄우기 위한 기본 설정은 다음과 같다.
version: "3.9" services: database: image: mongo:5 restart: always
이미지 이름은 mongo이고, 이 친구는 특이하게 깃헙 레포지토리에서 사용할 수 있는 버전을 찾을 수 있다.
MongoDB는 기본 슈퍼유저가 없기 때문에 따로 설정해야할 필수 설정은 없고, 그 외에 사용할 수 있는 유용한 설정들은 다음과 같다.
포트 매핑
컨테이너 네트워크 외부에서 데이터베이서에 접속하기 위해서는 컨테이너의
27017
포트를 로컬의 적절한 포트로 매핑하는 설정을 추가해주어야 한다.데이터 마운트
컨테이너가 종료된 이후에도 데이터를 유지하기 위해서는 컨테이너의
/data/db
디렉토리를 로컬의 적절한 경로에 마운트 시켜줘야 한다.주요 환경 변수
MONGO_INITDB_DATABASE
docker-entrypoint-initdb.d 디렉토리 안의 *.sh 또는 *.js 파일을 통해 데이터베이스를 초기화하는 경우, 이 환경변수로 초기화할 데이터베이스 이름을 지정할 수 있다.
초기화 설정
처음 인스턴스를 생성할 때 추가적인 데이터베이스 초기화를 위해 실행할 .sh 또는 .js 파일이 있다면, 컨테이너의
/docker-entrypoint-initdb.d
디렉토리에 해당 파일이 들어있는 디렉토리를 마운트 시켜주어야 한다.커스텀 설정 파일
직접 작성한 .cnf 파일을 기본 설정으로 사용하고 싶다면 로컬의 .cnf 파일을 컨테이너의 /etc/mongo 파일로 마운트시켜주고 실행 옵션으로 --config=/etc/mongo/mongod.conf를 넣어주자.
MongoDB의 자세한 설정파일 옵션들은 공식문서를 참고하자.
위에서 설명한 옵션들을 사용한 전체 docker-compose.yml 파일 형태는 다음과 같다.
version: "3.9" services: database: image: mongo:5 command: --config=/etc/mongo/mongod.conf ports: - "27017:27017" volumes: - ./mongo/data:/data/db # - ./mongo/conf:/etc/mongo # - ./mongo/init:/docker-entrypoint-initdb.d environment: MONGO_INITDB_ROOT_USERNAME: seungtaek MONGO_INITDB_ROOT_PASSWORD: seungtaekpwd MONGO_INITDB_DATABASE: dev restart: always
References
반응형'Backend' 카테고리의 다른 글
[Nginx] Proxy 상황에서 Connection 유지하기 (1) 2021.12.13