개발 환경의 Rails 앱을 Docker 컨테이너에서 시작해 보았습니다.

목차



1. 소개
2. 전제
3. 거친 절차
4.docker의 설정 파일 작성
5. 앱용 컨테이너와 데이터베이스용 컨테이너의 연결 설정
6. 컨테이너 시작
7. 정리

소개



요전날 Rails에서 학습계의 웹 앱을 작성했습니다만, 환경 구축시에는, 뭔가 에러가 나오면 원인을 조사해 해소의 반복이었습니다. 다양한 지식을 얻는 좋은 기회였지만, 향후 개발을 할 때는 보다 효율적으로 할 수 있으면 좋겠다는 생각이 있습니다. 해결 수단의 하나로서는 「Docker」를 들 수 있을까 생각합니다. 다음에 앱 개발을 할 때는 초기 단계부터 Docker를 이용한 개발을 하고 싶습니다만, 우선은 이번 작성한 기존의 앱을 Docker 컨테이너로 기동할 수 없는지 시도해 보았기 때문에, 기록으로서 남깁니다.

전제



· 개발 단말기에 Docker를 설치 한 것
· 다음 절차의 각 소프트웨어 버전은 다음과 같습니다.
· Ruby : 2.6.5
·Rails: 6.0.3
· MySQL : 5.6
・이번에는 기존 앱을 2종류의 Docker 컨테이너(앱용 컨테이너, 데이터베이스용 컨테이너)를 연계시켜 기동한다

거친 절차



①docker의 설정 파일(Dockerfile과 docker-compose.yml) 작성
② 앱용 컨테이너와 데이터베이스용 컨테이너의 연결 설정
③ 컨테이너 기동

docker 설정 파일 만들기



우선은 기존 앱의 폴더 계층에서 이하, 2 종류의 파일을 작성합니다.
■ Dockerfile
→Docker 이미지의 기본이 되는 파일. 여기에 기술된 내용으로, 완전히 환경의 이미지가 생성됩니다. 이번에는 앱용 컨테이너의 본질이 되도록 기술해 갑니다.

■ docker-compose.yml
→ 여러 컨테이너를 관리할 때 사용하는 파일. 이번에는 앱 용 컨테이너와 데이터베이스 용 컨테이너의 정의를 작성하고 관리합니다.


파일을 작성하면 각각에 정의를 기술해 갑니다. ※ 각 행에서 무엇을 하고 있는지는 코멘트를 참조
■ Dockerfile의 내용
#アプリ用コンテナの素

#ベースとなるバージョン2.6.5のrubyイメージを公式リポジトリより取得
FROM ruby:2.6.5

#RUNをbashで実行
SHELL ["/bin/bash", "-c"]

#各ソフトウェア(yarn,nodejs,npm,mysql,vim,nodeバージョン管理ライブラリ)をインストール。
#イメージ軽量化のためにapt-getリストをクリア

RUN apt-get update && apt-get install -y curl apt-transport-https wget && \
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list && \
apt-get update && apt-get install -y yarn nodejs npm default-mysql-client vim && \
npm install n -g && \
n 12.13.0 && \
echo "export PATH=/usr/local/n/versions/node/12.13.0/bin/:$PATH" >> ~/.bashrc && \ 
source ~/.bashrc && \ 
rm -rf /var/lib/apt/lists/*

#結合テスト(Rspec)用にChrome関連のインストール
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

#アプリ用ディレクトリの作成 ※「memory_tank」の部分は適宜、自分のアプリ名にする
RUN mkdir /memory_tank

#ワークディレクトリを設定 ※「memory_tank」の部分は適宜、自分のアプリ名にする
WORKDIR /memory_tank

#ローカルのGemfileをアプリ用コンテナにコピーする
COPY Gemfile /memory_tank/Gemfile
COPY Gemfile.lock /memory_tank/Gemfile.lock

#アプリ用コンテナにgemをインストール
RUN gem install bundler
RUN bundle install
#結合テスト(Rspec)用にcapybara,selenium-webdriverを最新化
RUN bundle update capybara selenium-webdriver

#ローカルのアプリファイルをまるっとアプリ用コンテナにコピー
COPY . /memory_tank



■ docker-compose.yml의 내용

docker-compose.yml
version: "2"
services:
  db: #データベース用コンテナの定義
    image: mysql:5.6 #ベースとなるバージョン5,6のmysqlイメージを公式リポジトリより取得
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci #文字コードの設定
    environment:
      MYSQL_ROOT_PASSWORD: xxxxxxxx #データベースユーザ「root」のパスワード
      MYSQL_DATABASE: memory_tank_development #データベース名
    volumes:
      - mysql-data:/var/lib/mysql #名前付きボリュームでデータを永続化 ※ Dockerの管理下にデータを保管
    ports:
      - "4306:3306" #ポート設定

  app: #アプリ用コンテナの定義
    build: . #DockerFileを素にコンテナイメージを作成
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'" #Railsの起動

    volumes:
      - .:/memory_tank #ローカルのディレクトリをコンテナにマウント
    ports:
      - "3000:3000" #ポート設定
    depends_on: #作成順序の設定 「db」→「app」
      - db

volumes:
  mysql-data: #名前付きボリューム

앱 용 컨테이너와 데이터베이스 용 컨테이너 연결 설정



그런 다음 앱 컨테이너와 데이터베이스 컨테이너가 성공적으로 통신할 수 있도록 database.yml을 편집합니다.
※socket 통신에서의 DB 접속이 아니라 「host:db」와 같이, 데이터베이스용 컨테이너를 직접 지정합니다.

database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:*****
  host: db   #データベース用コンテナを指定

컨테이너 시작



여기까지 각종 정의가 완료되었으므로, 마지막에 컨테이너를 백그라운드에서 기동해 가동 확인을 실시합니다.
xxxx@xxxxnoMacBook-Pro memory_tank % docker-compose up -d
Starting memory_tank_db_1 ... done
Starting memory_tank_app_1 ... done
xxxx@xxxxnoMacBook-Pro memory_tank % docker-compose exec app bin/rails db:migrate #マイグレーション
・・・
xxxx@xxxxnoMacBook-Pro memory_tank % docker-compose exec app bin/rails webpacker:install #webpackerのインストール

localhost : 3000으로 앱에 연결할 수 있는지 확인


요약



이번 작업을 통해 어느 정도는 Docker에 대한 기초 지식이 익숙해 졌기 때문에, 향후는 web 앱 초기 단계에서의 Docker 도입이나 AWS ECS에의 프로덕션 배포에 연결해 나갈 수 있으면 좋겠습니다.

이상, 끝까지 읽어 주셔서 감사합니다!

좋은 웹페이지 즐겨찾기