Docker +Railsにnginxを追加する

に公開

前回、DockerにRailsを追加したので、次はnginxを追加してみました。
前回↓
https://zenn.dev/articles/48534de806c55a/edit

###コマンドで一度コンテナを終了しておく。
docker compose down

##compose.yml(または docker-compose.yml)に Nginxを追加
今の compose.yml(または docker-compose.yml)に Nginx サービスを追加

version: "3.8"
services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: myapp_development
      MYSQL_USER: myapp
      MYSQL_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql
    ports:
      - "3306:3306"

  web:
    build: .
    command: bundle exec rails s -b 0.0.0.0
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - web

volumes:
  db-data:

ポイント:
-nginx/default.conf はホスト側で作成しておきます。
-web サービスの 3000 ポートにリバースプロキシします。

##nginx の設定
nginx/default.conf:

server {
    listen 80;

    server_name localhost;

    location / {
        proxy_pass http://web:3000;  # webサービスを指定
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

ポイント:
-proxy_pass http://web:3000; の web は Compose 内のサービス名と一致させる必要があります。
-Rails サーバーは 0.0.0.0:3000 で起動していること。

##Docker Compose 再構築
docker compose build で再度イメージをビルド
docker compose up でコンテナ起動
docker compose run web rails db:createで、データベースを再度作成

http://localhost にアクセス
Rails アプリが Nginx 経由で見られるようになります。

Discussion