見出し画像

初めてのDocker

元々Springの方でymlは書いたことがあったので構文などは大丈夫だったのですがまず何から書いたらいいかわからなかったのでとりあえずいろいろ調べながら書いてみました。
今回はフロントがNext.js、バックがLaravelでデータベースがMysqlということで作成しました。

docker-compose.yml

version: '3.8'

services:
  # Laravelのバックエンド
  backend:
    build:
      context: ./Server
      dockerfile: Dockerfile
    container_name: backend
    restart: unless-stopped
    working_dir: /var/www
    volumes:
      - ./Server:/var/www
      - ./Server/storage:/var/www/storage
    networks:
      - app-network
    ports:
      - "8000:8000"
    depends_on:
      - mysql
    environment:
      DB_CONNECTION: mysql
      DB_HOST: mysql
      DB_PORT: 3306
      DB_DATABASE: laravel_db
      DB_USERNAME: root
      DB_PASSWORD: Charlie@223
    command: php artisan serve --host=0.0.0.0 --port=8000

  # Next.jsのフロントエンド
  frontend:
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: frontend
    restart: unless-stopped
    working_dir: /app
    volumes:
      - ./:/app  # 正しいマウントパスに変更
    networks:
      - app-network
    ports:
      - "3000:3000"
    command: bash -c "npm install && npm run dev"

  # MySQL データベース
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: Charlie@223
      MYSQL_DATABASE: laravel_db
    volumes:
      - ./mysql:/var/lib/mysql
    networks:
      - app-network
    ports:
      - "3306:3306"

networks:
  app-network:
    driver: bridge
Dockerfile(front)

FROM node:18

# 作業ディレクトリを設定
WORKDIR /app

# ホストからファイルをコピー
COPY . .

# Next.jsの依存関係をインストール
RUN npm install

# 開発サーバーを起動
EXPOSE 3000
CMD ["npm", "run", "dev"]
Dockerfile(back)

# ベースイメージの指定
FROM php:8.2-fpm

# 必要なパッケージのインストール
RUN apt-get update && apt-get install -y \
    git \
    unzip \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    libzip-dev \
    && docker-php-ext-install pdo_mysql mbstring zip exif pcntl

# Composerのインストール
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# 作業ディレクトリの設定
WORKDIR /var/www

# Laravelアプリケーションのコピー
COPY . .

# Composerで依存パッケージをインストール
RUN composer install

# パーミッションの設定
RUN chown -R www-data:www-data /var/www

# エントリーポイントスクリプトのコピー
COPY docker-entrypoint.sh /usr/local/bin/

# 実行権限を付与
RUN chmod +x /usr/local/bin/docker-entrypoint.sh

# コンテナ起動時にエントリーポイントスクリプトを実行
ENTRYPOINT ["docker-entrypoint.sh"]

# Laravelアプリケーションを起動
CMD php artisan serve --host=0.0.0.0 --port=8000

苦労したところ

本当に苦労したのは下記のコードの部分です。

    command: php artisan serve --host=0.0.0.0 --port=8000
    command: bash -c "npm install && npm run dev"

何が苦労したと言いますとこの部分で私がMacOSを使っているのですがそちらでは動いたのにWindowsの友人が動かないということになりました。
元のコードがこちらです。

    command: --host=0.0.0.0 --port=8000
    command: npm run dev

原因として

  • Nextが見つかりません

  • comporserが見つかりません

ということでした。
てことはnpm installとcomporser installがうまく動いてない!!とわかったのでそこからはコードと睨めっこです。
するとあることに気がつきました
「ymlの方でインストール実行してなくね?」
Dockerfileではインストールしてるはずなのにそれが何が原因かわからないが動いていない!!じゃあymlの方ですればいいんじゃね?
と思い実際書いて動かしてみると…

[動いた!!!!!!!!!!!!!]

ということで問題は解決したのですがもう一つ問題がありましてそれはなぜDockerfileの方が動いてないのかということです。
理由としてコンテナが起動する際に、常に最新の依存関係をインストールするためだそうです。
そうすることによって開発中の依存関係の更新や変更をすぐに反映させることができるそうです。


この記事が気に入ったらサポートをしてみませんか?