0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rails,nginx,mysqlでDocker環境で構築する

Last updated at Posted at 2025-01-11

Version

ruby 2.5.7
rails 5.2.4

構成

フォルダ構成
RailsProject
├── mysql
│ 
├── nginx
│   ├── Dockerfile
│   ├── default.conf
│ 
├── rails
│   ├── Dockerfile
│   ├── Gemfile
│   ├── Gemfile.lock
│
├── static 
│   ├── index.html
│
└── docker-compose.yml

image.png

STEP1_ブラウザからNGINXへアクセス

1.プロジェクトフォルダにnginxフォルダを作成し、Dockerfileを作成します

bash
$mkdir nginx
$cd nginx
nginx$ touch Dockerfile

2.Dockerfileを確認

Dockerfile
# (1)ベースイメージとして軽量のNginxイメージを使用
FROM nginx:alpine

# (2)ローカルのdefault.confファイルをNginxの設定ディレクトリにコピー
# COPY ./default.conf /etc/nginx/conf.d/default.conf

(1)軽量のNGINXをベースとして使います。
(2)default.confの説明は後述します。この工程ではNGINXにアクセスできることを
 確認するためコメントアウト

3.DockerfileからイメージをビルドしNGINXコンテナを起動します

bash
# ビルド
nginx$ docker build -t nginx .

# イメージ一覧を確認
nginx$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    93f9c72967db   6 weeks ago   47MB

# nginxコンテナを起動
nginx$ docker run -d -p 8888:80 nginx

4.ブラウザからNGINXにアクセスできるか確認します

ブラウザでhttp://localhost:8888/にアクセスします。
このように表示されれば接続は成功です。
スクリーンショット 2025-01-13 050016.png

STEP2_NGINXを介してRailsにアクセスします

1.default.confの設定

default.conf
server {
  listen 80;  # ポート80で待ち受け
  server_name localhost;  # サーバー名の設定

  location / {
    proxy_pass http://web:3000; #railsに接続
    proxy_set_header Host $host;  # クライアントのホスト名を設定
    proxy_set_header X-Real-IP $remote_addr;  # クライアントのIPアドレスを設定
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  # クライアントの元のIPアドレスを設定
    proxy_set_header X-Forwarded-Proto $scheme;  # プロトコル(httpまたはhttps)を設定
  }
}

2.Dockerfile・docker-compose.ymlの作成

Dockerfile
# ベースにするイメージを指定
FROM ruby:2.5.7

# RailsのインストールやMySQLへの接続に必要なパッケージをインストール
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs default-mysql-client vim

# rubygemsの更新
RUN gem update --system 3.2.3

# コンテナ内にappディレクトリを作成
RUN mkdir /app

# 作成したmyappディレクトリを作業用ディレクトリとして設定
WORKDIR /app

# ローカルの Gemfile と Gemfile.lock をコンテナ内のmyapp配下にコピー
COPY Gemfile /app/Gemfile
COPY Gemfile.lock /app/Gemfile.lock

# コンテナ内にコピーした Gemfile の bundle install
RUN bundle install

# ローカルのmyapp配下のファイルをコンテナ内のmyapp配下にコピー
COPY . /app
docker-compose.yml
version: '3'

services:
  nginx:
    build:
      context: ./nginx
    ports:
      - "80:80"
    depends_on:
      - web  # Nginxがwebに依存して起動
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf  # Nginx設定ファイルの追加
  web:
    build:
      context: ./rails
    command: bash -c 'rm -f /app/tmp/pids/server.pid && rails server -b 0.0.0.0'

    volumes:
      - ./rails:/app
    ports:
      - "3000:3000"

3.rails newでプロジェクトファイルの生成

railsの雛形をつくりGemfileを更新します。

bash
$ docker-compose run web rails new . --force --database=mysql --skip-bundle

4.ビルドを実行し更新されたGemをインストールします。

bash
$ docker-compose build

5.コンテナを起動します。

bash
$ docker-compose up -d

docker-compose psコマンドで起動中のコンテナを確認します。

bash
$ docker-compose ps
   Name                 Command               State                    Ports                  
----------------------------------------------------------------------------------------------
rp-nginx-1   /docker-entrypoint.sh ngin ...   Up      0.0.0.0:80->80/tcp,:::80->80/tcp        
rp-web-1     bash -c rm -f /app/tmp/pid ...   Up      0.0.0.0:3000->3000/tcp,:::3000->3000/tcp

6.ブラウザからrailsにアクセスします。

ブラウザでhttp://localhost:3000/にアクセスします。
Mysqlの設定をしてないので現時点ではこのように表示されれば接続は成功です。
web1.png

docker-compose run web rails new . --force --no-deps --database=mysql
docker-compose run: Docker Composeで新しいコンテナを一時的に実行します。

web: 実行するサービスの名前(この場合はwebサービス)。

rails new: Railsのコマンドで、新しいRailsアプリケーションを作成します。

.: 現在のディレクトリに新しいRailsアプリケーションを作成します。
DockerファイルのWORKDIRで指定したパスがカレントディレクトリとなる

--force: 既存のファイルがあっても上書きします。

--no-deps: 依存サービスを起動せずに、このサービスだけを実行します。

--database=mysql: データベースとしてMySQLを使用するように設定します。


docker-compose build
ymlに記載されたサービス全てに対してビルドを行う

docker-compose up
コンテナ起動

docker-compose logs web
ログを確認


docker ps
dockerの起動状態を確認

■Dockerfile
RUN ビルド時に実行
CMD コンテナ起動時に実行

■yml
command コンテナ起動時に実行。DockerfileのCMDを上書きする

■ビルドコンテキスト
 docker buildコマンドで指定したディレクトリ配下のファイル・ディレクトリが
dockerfileからのアクセス対象となる

/home/userでdocker build .とすると/home/user内のファイル・ディレクトリ
がビルドコンテキストとなる

dockercompose.ymlでビルドコンテキストを指定する場合は、ymlファイルからの相対パスで指定する

作業
database.yamlの変更

トラブルシューティング

  1. UnicornのPIDファイルの問題
    原因: 既存のPIDファイルが残っていたため、Unicornが起動できなかった。

対策: Dockerfileに、古いPIDファイルを削除するコマンドを追加。

  1. データベースエラー ("Unknown database 'app_development'")
    原因: 指定されたデータベースが存在しなかった。

対策: データベースを作成。

Dockerコマンド

dockerイメージのリストを表示する

docker image ls

コンテナのリストを表示する

docker container ls -a

未使用のイメージを一括削除

docker image prune

未使用のイメージを一括削除(tag付のイメージも含めて)

docker image prune -a

イメージを削除

docker image rm mysql:5.7

イメージをビルド

docker build [ -t {イメージ名} [ :{タグ名} ] ] {Dockerfileのあるディレクトリ}

稼働中のコンテナを表示

docker ps

コンテナの起動

docker start 

コンテナの作成・起動

docker run 

コンテナ内でコマンドを実行

docker-compose run web bash

停止コンテナを一括削除

docker container prune

メモ

unicornの設定はrails new の後
database.yml編集前に権限の変更

rails$ sudo chown -R $USER:$USER .
0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?