【Rails・MySQL・Docker】기존의 Rails5+MySQL의 앱에 Docker를 도입한다

개요



기존 Rails5+MySQL 애플리케이션(AWS EC2에서 배포됨)에 나중에 Docker를 도입했습니다.

이번은 로컬 환경만의 구축입니다만, Docker 초학자로 꽤 고생했으므로 비망록으로서 정리합니다.

공부를 위해서 코드나 커멘드의 하나하나의 의미도 써 가고 싶습니다.

기존 Rails 앱에 Docker를 도입하고 싶은 분의 도움이 되시면 감사하겠습니다.

실수 등이 있으면 지적 해주십시오.

전제


  • Doker의 기초 지식
  • MacOS
  • Ruby 2.5.1
  • Rails 5.0.7.2
  • MySQL 5.6

  • Doker의 기초는 입문 DockerDOCKER/KUBERNETES 실천 컨테이너 개발 입문 에서 배웠습니다.

    Docker를 처음 만지는 분은 우선 Docker의 개념이나 기초적 부분을 상기 등으로 이해하는 것이 좋습니다.

    절차


  • Docker for Mac 설치
  • 필요한 파일 만들기
  • Dockerfile 편집
  • docker-compose.yml 편집
  • database.yml 편집
  • Docker 시작
  • DB 만들기
  • 브라우저 확인
  • Sequel Pro로 DB를 확인할 수 있도록 한다

  • ①Docker for Mac 설치



    여기 URL 에서 Mac용 Docker를 엽니다.

    "Get Docker"링크에서 Docker.dmg를 다운로드합니다.

    설치가 끝나면 응용 프로그램 폴더에서 Docker를 엽니다.

    "Docker needs privileged access"대화 상자가 나타나면 OK를 누릅니다.

    메뉴 바에 Docker 아이콘이 나오고 "Docker is starting"이 표시되면 조금 기다립니다.

    "Docker is now up and running"이 표시되면 준비 완료입니다.

    터미널에서,
    $ docker version
    

    를 실행하여 버전이 표시되면 올바르게 설치할 수 있습니다.

    ②필요한 파일의 작성



    응용 프로그램의 디렉토리 바로 아래에 "docker-compose.yml"과 "Dockerfile"파일을 만듭니다.

    구성
    myapp ---- Dockerfile
           |-- app
           |-- bin
           |-- config
           |-- db
           |-- docker-compose.yml
           |-- Dockerfile
           |-- Gemfile
           |-- Gemfile.lock
    

    ③Dockerfile 편집



    Dockerfile
    
    # 作成するDockerイメージのベースとなるイメージを指定
    FROM ruby:2.5.3
    
    # Dockerイメージビルド時に、Dockerコンテナ内で実行するコマンドを定義
    RUN apt-get update -qq && \
        apt-get install -y build-essential \ 
                           libpq-dev \        
                           nodejs           
    
    # 作業ディレクトリの作成
    RUN mkdir /app_name 
    # Dockerfileをもとに生成したDockerコンテナ内で使える環境変数を指定
    ENV APP_ROOT /app_name
    WORKDIR $APP_ROOT
    
    # ホストからGemfileをコンテナ上にコピー
    ADD ./Gemfile $APP_ROOT/Gemfile
    ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock
    
    # Gemfileをbundle install
    RUN bundle install
    ADD . $APP_ROOT
    

    ④docker-compose.yml 편집



    docker-compose.yml
    
    # Version 3はファイルの記述定義のうち安定して利用できる最新版とのことです
    version: "3"
    services:
    # "db"というコンテナを定義
      db:
        # MySQLのイメージを指定します
        image: mysql:5.7
        environment:
         # PasswordとUsernameはdatabase.ymlと合わせます
          MYSQL_ROOT_PASSWORD: password
          MYSQL_DATABASE: root
        ports:
          - "4306:3306"
         # ポートはどちらも"3306"でも大丈夫ですが、左側を"4306"と別の番号にすることでSequel ProでデータをDBを確認できるようになります。
    
    # "web"というコンテナを定義
      web:
        build: .
        command: rails s -p 3000 -b '0.0.0.0'
        # ローカルのディレクトリをマウント
        volumes:
          - .:/app_name
        ports:
          - "3000:3000"
        # appコンテナとdbコンテナを連携
        links:
          - db
    

    ⑤database.yml 편집



    database.yml
    
    default: &default
      adapter: mysql2
      encoding: utf8
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    # PasswordとUsernameはdocker-compose.ymlと合わせます
      username: root
      password: password
      host: db
    
    development:
      <<: *default
      database: myapp_development
    
    test:
      <<: *default
      database: myapp_test
    
    production:
      adapter: mysql2
      encoding: utf8
      pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
      username: root
      password:
      socket: /tmp/mysql.sock
      database: myapp_production
      username: root
      password: <%= ENV['DATABASE_PASSWORD'] %>
      socket: /var/lib/mysql/mysql.sock
    
    # <<: *defaultは「default」を一つにまとめて使用するという意味なので
    # 本番環境はDockerと干渉させないために「production」のみ個別で書きます
    

    ⑥Docker 시작


    # imageをビルド
    $ docker-compose build
    
    # コンテナの実行
    $ docker-compose up
    

    ⑦DB 만들기



    다른 터미널 탭을 열고 앱 디렉토리로 이동
    # DBを作成
    $ docker-compose run web rails db:create
    

    ⑧ 브라우저 확인



    http://localhost:3000/ 로 이동하여 부팅이 가능한지 확인합니다.

    ⑨Sequel Pro로 DB를 확인할 수 있도록 한다



    평소 Sequel Pro에서 DB를 확인했기 때문에 Docker 환경에서도 Sequel Pro에서 확인할 수 있도록 연결합니다.



    명명: 켜도 켜도 괜찮습니다.
    호스트 이름 : 기본적으로 127.0.0.1이 될까 생각합니다 (자신의 IP 주소입니다)
    사용자 이름: root (docker-compose.yml에 나열된 것입니다)
    비밀번호 : password (docker-compose.yml에 나열된 것입니다)
    데이터베이스: 비어 있고 괜찮습니다.
    포트 : 4306 (docker-compose.yml의 포트 왼쪽의 번호가됩니다)

    이상



    현재는 AWS의 ECS로 배포하고 있으므로, 향후는 프로덕션 환경도 Docker의 구축을 할 예정으로,

    CircleCI로 테스트 자동화와 terraform으로 인프라 구성의 코딩도 진행해 나가려고 합니다.

    수정점이 있으면 가르쳐 주시면 감사하겠습니다.

    참고



    입문 Docker
    DOCKER/KUBERNETES 실천 컨테이너 개발 입문

    좋은 웹페이지 즐겨찾기