LoginSignup
0
1

More than 1 year has passed since last update.

dockerとdocker composeでwebアプリをdocker化する方法

Last updated at Posted at 2023-02-21

dockerとdocker-composeでwebアプリをdocker化

今回構築したいDocker環境

  • docker-compose upでrailsプロセスとdbが起動し、http://localhost:3000 でアクセスできるようにすること
  • nodejs,yarnはマルチステージビルドでインストールすること(apt-getは使用しない)
    ※マルチステージビルド
    • 1つのDockerfileに複数のイメージを作る
    • 複数のFROMが存在する

手順

  • 今回はrails newはしてある

  • 必要なファイルを準備する
    touch [Dockerfile docker-compose.yml]

    • Dockerfileに以下を記述
    # FROMが2つあり、nodeとrubyの2つのイメージ
    FROM node:14.17.6 as node
    FROM ruby:3.0.2
    
    # railsのセットアップ
    WORKDIR /rails-docker
    # 複数コピーする場合はtargetのディレクトリの最後にスラッシュ(/)を追加しないとエラーになるらしい
    COPY Gemfile Gemfile.lock /rails-docker/
    RUN bundle install
    
    
    # nodeのイメージからyarnを取得、hostのパッケージを持ってくる
    COPY --from=node /opt/yarn-* /opt/yarn
    COPY --from=node /usr/local/bin/node /usr/local/bin/
    COPY --from=node /usr/local/lib/node_modules/ /usr/local/lib/node_modules/
    
    # npmが入っているファイルに扱いやすい名前でシンボリックリンクを作成
    # -sでシンボリックリンク、デフォはハードリンク
    # -fでリンクファイルと同じ名前のファイルがあっても強制的に上書きする、ビルド時にファイル重複でエラーを吐かせないため
    RUN ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm \
      && ln -fs /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npx \
      && ln -fs /opt/yarn/bin/yarn /usr/local/bin/yarn \
      && ln -fs /opt/yarn/bin/yarnpkg /usr/local/bin/yarnpkg
    
    # docker-compose up時にrailsサーバーを立ち上げる
    CMD [ "rails", "s", "-b", "0.0.0.0" ]
    
    • docker-compose.ymlに以下を記述
    docker-compose.yml
    version: '3.9'
    
    volumes:
      # dbのデータを入れておくためのdocker volume
      db-data:
    
    services:
      web:
        build: .
        ports:
          - "3000:3000"
        volumes:
          - '.:/rails-docker'
        environment:
          - 'DATABASE_PASSWORD=postgres'
        tty: true
        stdin_open: true
        depends_on:
          - db
    
      
      db:
        # DBをpostgresqlに
        image: postgres
        volumes:
          - 'db-data:/var/lib/postgresql/data'
    
  • /config/database.ymlの変更
    default: &defaultに以下を追記
    host, user, port, paswordを追加

database.yml
host: db
user: postgres
port: 5432
password: <%= ENV.fetch("DATABASE_PASSWORD") %>
  • docker-compose upして、http://localhost:3000/ にアクセスしてrailsの画面が表示されていれば成功

自分はvolumes先のパスの指定をWORKDIRで指定したものと違うものによくなっているのでチェックを忘れないようにしたい。コンテナが立ち上がったあとコンテナに入ってlsでちゃんとビルドコンテキストがマウントできているか確認するのが良さそう。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1