Rails과 MySQL, docker-compose로 연결하기

JeanDeluge·2023년 5월 11일

rails

목록 보기
1/1

전제

docker-compose.yml과
rails앱 프로젝트 루트의 config/database.yml에서 설정해야한다.

MySQL에 따로 사용자를 생성하지 않고, root 계정으로 접속하도록 했다.

docker-compose.yml

version: "3.9"
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -e development -b '0.0.0.0'
    ports:
      - 3001:3000
    volumes:
      - .:/usr/src/app
    depends_on:
      - database
      - redis
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=basic
      - MYSQL_USERNAME=root
      - MYSQL_HOST=db

  redis:
    image: redis

  db:
    image: mysql:5.7
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=basic
    ports:
      - 3307:3306
    volumes:
      - db:/var/run/mysqld
  
volumes:
  db:

레일즈앱에서 필요한 MYSQL환경변수는

  1. MYSQL_ROOT_PASSWORD : root 계정의 비밀번호 설정
  2. MYSQL_DATABASE : 레일즈앱에서 사용할 데이터베이스이름
  3. MYSQL_HOST : MYSQL 호스트명 => docker-compose.yml에서 db이름을 입력. 여기서는 "db"임
  4. MYSQL_USERNAME: root (이유는 현재 컨테이너에서 root로 접속하기 위함)

DB에서 필요한 MYSQL 환경 변수는

  1. DB_ROOT_PASSWORD : mySQL root 를 만들때 사용할 비밀번호
  2. DB_DATABASE: 최초에 생성할 DB이름 -> 레일즈앱에서 필요한 데이터베이스 이름. MYSQL_DATABASE로 설정해준다.

volumes 설정

mysql서버와 연결하기 위해서 필요한 소켓파일을 위치를 지정해줘야한다.
mysql에서 소켓 파일 위치를 못찾으면 다음과 같은 에러를 띄운다. 가끔 다른 위치를 가르키는 경우가 있지만, 다음과 같은 오류에서 가르키는 위치를 확인하면 된다.

can't connect to local mysql server through socket '/run/mysqld/mysqld.sock' (2)

여기서 중요한건 '/run/mysqld/'에서 mysqld.sock을 찾는다는 것이므로 다음과 같이 위치를 지정해준다.

    volumes:
      - db:/var/run/mysqld

config/database.yml

default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  host: <%= ENV['MYSQL_HOST'] %> ##db
  username: <%= ENV['MYSQL_USERNAME'] %> ## root
  password: <%= ENV['MYSQL_ROOT_PASSWORD'] %> ## password
  socket: /var/run/mysqld/mysqld.sock
  timeout: 5000

development:
  <<: *default
  database: developmentdb

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: testdb

production:
  <<: *default
  database: productiondb

default에서
소켓위치를 다음과 같이 명시해준다.
socket: /var/run/mysqld/mysqld.sock

여기서 각 환경에 맞는 database이름을 지정해준다.

development:
  <<: *default
  database: developmentdb

실행

docker-compose run /<레일즈  컨테이너 이름>/ run rails db:setup

을 해주어 각 환경에 맞는 데이터베이스가 mysql 서버에 생성되도록 한다.

그 후 다음 명령어로 이미지를 빌드하고 컨테이너를 모두 실행시킨다.

docker-compose up -d --build

0개의 댓글