@RyoyaTakeuchi40

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Docker上でLaravelが動かない【Docker × Nuxt × Laravel × nginx】

解決したいこと

Docker上でNuxt × Laravelのプロジェクトを作成し、nginxサーバーを用い、
localhost(:3000)でNuxtを表示し、localhost/api(:8000)でLaravelを表示したいです。

フロントはうまく動作しているのですが、バックエンドがうまくいきません。
具体的には、docker compose up -dを叩くとNuxtが立ち上がり、localhostでも3000番でも表示されます。
しかしLaravelは立ち上がらず、ローカルのLaravelディレクトリに降りてphp artisan serveすると立ち上がります。(cd ./services/backend  php artisan serve)
コンテナ内で立ち上げるにはどうすれば良いですか?

ディレクトリ構成

.
├── docker
│ ├── backend
│ │ ├── Dockerfile
│ │ └── php.ini
│ ├── frontend
│ │ └── Dockerfile
│ └── web
│   ├── Dockerfile
│   └── default.conf
│
├── services
│ ├── backend
│ │ └── Laravelファイル群
│ └── frontend
│   └── Nuxtファイル群
│
└── docker-compose.yml

具体的なコード

docker-compose.yml

version: "3.9"

services:

  backend:
    build: ./docker/backend
    container_name: nl-backend
    volumes:
      - ./services/backend:/backend
    command: sh -c 'composer install && php artisan serve'
    ports:
      - "8000:8000"
    tty: true
    environment:
      - DB_HOST=db
      - DB_DATABASE=laravel
      - DB_USERNAME=root
      - DB_PASSWORD=password

  frontend:
    build: ./docker/frontend
    container_name: nl-frontend
    volumes:
      - ./services/frontend:/frontend
    command: sh -c 'npm install && npm run dev'
    ports:
      - "3000:3000"
    tty: true
    environment:
      - NODE_ENV=development
      - HOST=0.0.0.0
      - CHOKIDAR_USEPOLLING=true

  web:
    build: ./docker/web
    container_name: nl-web
    volumes:
      - ./services/backend:/backend
      - ./services/frontend:/frontend
    ports:
      - "80:80"
    depends_on:
      - frontend
      - backend

  db:
    image: mysql:latest
    container_name: nl-db
    ports:
      - "3306:3306"
    volumes:
      - mysql-volume:/var/lib/mysql
    environment:
      MYSQL_DATABASE: shukatsu
      MYSQL_USER: shukatsu
      MYSQL_PASSWORD: shukatsu
      MYSQL_ROOT_PASSWORD: local

  phpmyadmin:
    image: phpmyadmin/phpmyadmin:latest
    container_name: nl-phpmyadmin
    ports: 
      - "8888:80"
    depends_on: 
      - db

volumes:
  mysql-volume:

docker/backend/Dockerfile

FROM php:8.3.0-fpm

WORKDIR /backend

RUN apt update \
    && apt install -y zlib1g-dev vim libzip-dev \
    && docker-php-ext-install zip pdo_mysql \
    && apt install -y git \
    && pecl install xdebug \
    && docker-php-ext-enable xdebug

RUN apt install -y npm \
    && npm install n -g \
    && n stable

COPY --from=composer:2.4 /usr/bin/composer /usr/bin/composer

COPY php.ini /usr/local/etc/php/

docker/backend/php.ini

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[PHP]
display_errors = On
memory_limit = 500M
upload_max_filesize = 500M
post_max_size = 500M

[xdebug]
xdebug.mode = debug
xdebug.start_with_request = yes
xdebug.client_host = "host.docker.internal"
xdebug.client_port = 9012
xdebug.log = "/var/log/xdebug.log"

docker/web/Dockerfile

FROM nginx:1.21.3

COPY default.conf /etc/nginx/conf.d/default.conf

docker/web/default.conf

server {
  listen 80;
  root /app/public;

  location / {
    proxy_pass http://frontend:3000;
  }
  location /api {
    proxy_pass http://backend:8000;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    add_header X-Server-Hostname $hostname;
    add_header X-Server-Address $server_addr;
  }

  client_max_body_size 100m;
  keepalive_timeout 5;
}
0 likes

3Answer

backendのlaravelが立ち上がらないとのことですが、

dcoker-composeを立ち上げた後に下のようにログをとるとどうなりますか?

docker-compose logs backend
0Like

Comments

  1. このようなログが返ってきます。

     docker-compose logs backend 
    
    nl-backend  | 
    nl-backend  | Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
    nl-backend  | 
    nl-backend  | Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
    nl-backend  | Installing dependencies from lock file (including require-dev)
    nl-backend  | Verifying lock file contents can be installed on current platform.
    nl-backend  | Nothing to install, update or remove
    nl-backend  | Generating optimized autoload files
    
  2. 順を追って説明します。
    このログはcomposer.jsonとしては何もインストールするものがない(ライブラリなどアップデートされない)ときに出る表示です。
    composer.json、composer.lock自体が存在しない場合はエラーが表示されるため、ちゃんとcomposer installコマンド自体はcomposer.jsonがあるディレクトリで実行されています。

     docker-compose logs backend 
    
    nl-backend  | 
    nl-backend  | Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
    nl-backend  | 
    nl-backend  | Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
    nl-backend  | Installing dependencies from lock file (including require-dev)
    nl-backend  | Verifying lock file contents can be installed on current platform.
    nl-backend  | Nothing to install, update or remove
    nl-backend  | Generating optimized autoload files
    
    

    貴方の発言を聞くと、おそらくはdocker仮想環境でcomposer installとするのとは別にローカルOS(ホスト側OS)でcomposer installなり、laravel newするなりしてホストOS側のcomposer のライブラリをインストールしてしまったのだと思います。

    ホスト側はMacOSで、docker側はdebianベースのphpコンテナのため、composer.lockがない場合は、composer installとするとOSごとに違う依存関係がインストールされます。
    composer installしたOSと、dockerで実際に動作させるOSで違うため、正しく動作できないということです。

    貴方がやることは下になります。

    docker-composeのインスタンスとimageの削除

    docker compose down --rmi all
    

    composerの依存関係とキャッシュの削除

    composer.jsonは削除しないこと。

    # laravelのプロジェクト直下で実行
    # インストールされたライブラリの削除
    rm -rf vendor/
    
    # インストールされた依存関係の記録を削除
    rm composer.lock
    

    docker-composeの立ち上げとビルドしなおし

    docker-compose up -d
    

    参考

    docker compose down

  3. 解決しました!
    ありがとうございます!

マルチステージビルド

Dockerfileを1つにして,build と up の機能を完全に分離することをお奨めします。

尚、Dockerfileには
FROM nginx:1.21.3 as nginxの行から次のFROMまでがセットです。nginxはtarget名

services:
  nginx:
    container_name: nginx
    build: 
      context: . 
      dockerfile: Dockerfile
      target: nginx
サービス名、コンテナ名、ターゲット名を同一にしてますが、適時変更のこと

FROM,RUN,COPY(ADD),WORKDIR(フルパス記述を推奨)のみで構成します。ENTRYPOINTは記載しない。最初は&&でRUNを短縮しないこと
build時、エラー表示されません。今のdocker compose以降は梱包率が高いので&&で一括にするよりは進行時間が長い処理はあえて分離することを推奨します。

docker-compose.ymlは

image:を削除し、command: /bin/sh を最後に記述しましょう。
environment:にPATHも記載すると確実です。depends_on:も先行が稼働していないとダウンしないなら、最初は記載しないこと

working_dirでcdを実行

  volumes:
      - ./services/backend:/backend
  working_dir: /backend
  command: sh  #php artisan serve

build, up -d後に docker compose exec -it nginx shでコンテナ内に入り、command:の正規のコマンドライン(php artisan serve)で目的のアプリが起動するのを確認して下さい。

0Like

composer.json が無いと言われていますね。
何か手順を間違えているのでは?

$ docker logs nl-backend

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0

Deprecated: PHP Startup: Use of mbstring.internal_encoding is deprecated in Unknown on line 0
Composer could not find a composer.json file in /backend
To initialize a project, please create a composer.json file. See https://getcomposer.org/basic-usage
composer install && php artisan serve
↓  ↓  ↓
composer create-project laravel/laravel app-name && cd app-name; php artisan serve

とか?

0Like

Your answer might help someone💌