Docker를 사용한 Ruby on Rails + MySQL 환경 구축 절차

Docker, Rails, MySQL 환경 구축 절차 기록



Rails의 기본 홈 화면을 표시하는 곳까지.

환경
  • Windows10
  • Ruby2.7.1
  • Rails6.0.3.1
  • MySQL8.0

  • 1. Docker for Windows 설치



    htps : // 후 b. 도 c r. 코 m / 에이 치온 s / こむに ty / 도 c 케 루세로 sk와 p ぃんど ws /
    위 링크에 액세스하여 설치합니다.
    설치가 완료되면 한 번 다시 시작한 다음 Docker를 시작합니다.

    2. 필요한 파일 만들기



    원하는 위치에 디렉토리를 만듭니다.

    그런 다음 VScode에서 만든 디렉토리를 엽니다.
    설치가 계속되면 아래 링크에서 설치
    htps : // 오즈레. 미 c 로소 ft. 코 m / 쟈 jp / p 로즈 cts /
  • Dockerfile 만들기

  • VScode에서 디렉토리를 열면 디렉토리에 Dockerfile를 만들고,
    이하와 같이 기술한다.
    FROM ruby:2.7
    RUN apt-get update -qq && apt-get install -y nodejs yarnpkg
    RUN ln -s /usr/bin/yarnpkg /usr/bin/yarn
    RUN mkdir /app
    WORKDIR /app
    COPY Gemfile /app/Gemfile
    COPY Gemfile.lock /app/Gemfile.lock
    RUN bundle install
    COPY . /app
    
    # Add a script to be executed every time the container starts.
    COPY entrypoint.sh /usr/bin/
    RUN chmod +x /usr/bin/entrypoint.sh
    ENTRYPOINT ["entrypoint.sh"]
    EXPOSE 3000
    
    # Start the main process.
    CMD ["rails", "server", "-b", "0.0.0.0"]
    
  • Gemfile 만들기

  • 다음으로 같은 계층에 Gemfile를 작성해, 이하와 같이 기술한다.
    source 'https://rubygems.org'
    gem 'rails', '~>6'
    

    또 다른 Gemfile.lock라는 파일을 만듭니다.
    내용은 하늘에서 OK.
  • entrypoint.sh 만들기

  • 그런 다음 Dockerfile에서 ENTRYPOINT로 정의 된 entrypoint.sh를 만듭니다.

    entrypoint.sh
    #!/bin/bash
    set -e
    
    # Remove a potentially pre-existing server.pid for Rails.
    rm -f /app/tmp/pids/server.pid
    
    # Then exec the container's main process (what's set as CMD in the Dockerfile).
    exec "$@"
    
  • docker-compose.yml 만들기

  • 마지막으로 docker-compose.yml 라는 파일을 같은 계층에 작성해, 이하를 기술.

    docker-compose.yml
    version: '3'
    services:
      db:
        image: mysql:8.0
        volumes:
          - ./tmp/db:/var/lib/mysql
        environment:
          - MYSQL_ALLOW_EMPTY_PASSWORD=1
      web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        volumes:
          - .:/app
        ports:
          - "3000:3000"
        depends_on:
          - db
    
    MYSQL_ALLOW_EMPTY_PASSWORD를 설정하면 비밀번호가 비어 있더라도 루트로 연결할 수 있습니다.

    3. Rails new/docker-compose 빌드



    VScode의 터미널을 열고 만든 디렉토리의 계층 구조에 있는지 확인하면,
    다음을 수행한다.
    $ docker-compose run web bundle exec rails new . --force --database=mysql
    
    --force 는 기존 파일을 덮어쓰고 --database 에서 MySQL을 지정합니다.
    실행이 완료되면 빌드를 수행합니다.
    $ docker-compose build
    

    4, DB의 호스트명의 변경 / docker-compose up를 실시한다



    현재 상태이면 데이터베이스에 연결할 수 없으므로,
    처음에 만든 디렉토리에서 만든 config/database.ymlhost 값을 db 값으로 바꿉니다.

    database.yml
    default: &default
      adapter: mysql2
      encoding: utf8mb4
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: root
      password:
      host: db
    development:
      <<: *default
      database: app_development
    test:
      <<: *default
      database: app_test
    

    여기서 db는 컨테이너 이름입니다.

    이것이 가능하면 docker-compose build를 다시 한 다음 docker-compose up를 수행하십시오.
    이 상태에서 localhost:3000 에 접속하면 아마 에러가 나온다.
    웹 컨테이너가 mysql8.0의 caching_sha2_password認証方式 에 대응하고 있지 않기 때문에.
    다음 절차에 따라 인증 방법을 mysql_native_password로 변경합니다.

    5. MySQL 인증 체계 변경



    먼저 DB 컨테이너에 들어갑니다.
    (VScode에서 docker-compose up를 수행하고 있다고 생각하므로 powershell을 사용하여 해당 디렉토리를 엽니 다.)
    그래서 bash를 시작합니다.
    docker-compose exec db bash
    

    그런 다음 mysql 명령으로 연결합니다.
    mysql -u root
    

    장소가 mysql> 가 되어 있는 것을 확인하면,
    다음 쿼리를 실행합니다.
    mysql> select User,Host,plugin from mysql.user;
    

    그러면 다음과 같은 사용자 목록과 인증 방법이 나옵니다.
    +------------------+-----------+-----------------------+
    | User             | Host      | plugin                |
    +------------------+-----------+-----------------------+
    | root             | %         | caching_sha2_password |
    | mysql.infoschema | localhost | caching_sha2_password |
    | mysql.session    | localhost | caching_sha2_password |
    | mysql.sys        | localhost | caching_sha2_password |
    | root             | localhost | caching_sha2_password |
    +------------------+-----------+-----------------------+
    5 rows in set (0.00 sec)
    

    위에서 나온 rootplugin 에 있는 caching_sha2_passwordmysql_native_password 로 변경합니다.
    이번 대상 루트 @ %의 사용자 설정을 ALTER USER를 사용하여 변경합니다.
    다음 쿼리를 실행합니다.
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '';
    

    할 수 있으면 다시 select User,Host,plugin from mysql.user;를 실행하면,
    +------------------+-----------+-----------------------+
    | User             | Host      | plugin                |
    +------------------+-----------+-----------------------+
    | root             | %         | mysql_native_password |
    | mysql.infoschema | localhost | caching_sha2_password |
    | mysql.session    | localhost | caching_sha2_password |
    | mysql.sys        | localhost | caching_sha2_password |
    | root             | localhost | caching_sha2_password |
    +------------------+-----------+-----------------------+
    5 rows in set (0.00 sec)
    

    위와 같은 표시로 바뀌고 있다.

    그런 다음 exit를 두 번 실행하여 원래 계층으로 돌아갑니다.
    계층이 작성한 디렉토리인 것을 확인할 수 있으면 이하를 실행.
    $ docker-compose exec web bundle exec rails db:prepare
    

    6. Rails 홈 화면으로 이동



    DB를 만들고 localhost:3000 그러면 Rails 홈 화면에 액세스 할 수 있습니다.


    종료.

    좋은 웹페이지 즐겨찾기