ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.