初めての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の方が動いてないのかということです。
理由としてコンテナが起動する際に、常に最新の依存関係をインストールするためだそうです。
そうすることによって開発中の依存関係の更新や変更をすぐに反映させることができるそうです。
この記事が気に入ったらサポートをしてみませんか?