【Laravel入門】Laravel SailでDokerを使って開発環境の構築

2024年3月13日Laravel,PHP

ミニマリスト_カミ

kamiです。
TwitterYoutubeもやってます。

今回はSailを使ってLaravel でDokerを使って開発環境の構築をしていきます。

Sail(セイル)とは

Laravel Sail(セイル)は、Laravel AppのDocker開発環境を操作するための軽量コマンドラインインターフェイスです。
Sailは、Dockerの経験、知見がなくても環境構築ができます。
今回は、PHP、MySQL、phpMyadminを使用してLaraveの環境構築を行います。

Laravelプロジェクトの作成

以下コマンドで、Laravelのプロジェクトを生成します。

curl -s https://laravel.build/アプリ名 | bash
icon

しばらく、時間がかかりますので待ちましょう。

Last login: Fri Jul 21 13:17:22 on ttys022
kami@kami ~ % cd Desktop/work/dev
kami@kami dev % curl -s https://laravel.build/laravel-app | bash
Docker is not running.
kami@kami dev % 
  [復元日時2023/07/21 13:29:09]
Last login: Fri Jul 21 13:29:01 on console
Restored session: 2023年 7月21日 金曜日 13時28分16秒 JST
kami@kami dev % curl -s https://laravel.build/laravel-app | bash
latest: Pulling from laravelsail/php82-composer
Digest: sha256:37549f980be6146efcb16b0dc352644edfc5cca32b9862494631eb197ef89737
Status: Image is up to date for laravelsail/php82-composer:latest

   _                               _
  | |                             | |
  | |     __ _ _ __ __ ___   _____| |
  | |    / _` | '__/ _` \ \ / / _ \ |
  | |___| (_| | | | (_| |\ V /  __/ |
  |______\__,_|_|  \__,_| \_/ \___|_|


// 以下省略
icon

「Please provide your password so we can make some final adjustments to your application’s permissions.」が表示された後はパスワード入力してください

Please provide your password so we can make some final adjustments to your application's permissions.

Password:

「Thank you! We hope you build something incredible.」が実行されれば、プロジェクト作成ができています。

Thank you! We hope you build something incredible. Dive in with: cd laravel-app && ./vendor/bin/sail up

カレントディレクトリをlarave-appに移動へと「./vendor/bin/sail」のコンテナを起動させてください。

スポンサードサーチ

Dockerデスクトップでイメージ確認

Docker Desktopを見てもらえればわかるように、「laravelsail/php81-composer」という名前のイメージが作成されています。

laravelsail/php81-composer」というDockerイメージを利用しているようです。

docker info > /dev/null 2>&1

# Ensure that Docker is running...
if [ $? -ne 0 ]; then
    echo "Docker is not running."

    exit 1
fi

docker run --rm \
    --pull=always \
    -v "$(pwd)":/opt \
    -w /opt \
    laravelsail/php82-composer:latest \
    bash -c "laravel new laravel-app && cd laravel-app && php ./artisan sail:install --with=mysql,redis,meilisearch,mailpit,selenium "

cd laravel-app

# Allow build with no additional services..
if [ "mysql redis meilisearch mailpit selenium" == "none" ]; then
    ./vendor/bin/sail build
else
    ./vendor/bin/sail pull mysql redis meilisearch mailpit selenium
    ./vendor/bin/sail build
fi

CYAN='\033[0;36m'
LIGHT_CYAN='\033[1;36m'
BOLD='\033[1m'
NC='\033[0m'

echo ""

if sudo -n true 2>/dev/null; then
    sudo chown -R $USER: .
    echo -e "${BOLD}Get started with:${NC} cd laravel-app && ./vendor/bin/sail up"
else
    echo -e "${BOLD}Please provide your password so we can make some final adjustments to your application's permissions.${NC}"
    echo ""
    sudo chown -R $USER: .
    echo ""
    echo -e "${BOLD}Thank you! We hope you build something incredible. Dive in with:${NC} cd laravel-app && ./vendor/bin/sail up"
fi

Laravel Sailを起動

Sailコマンドを使用してDockerコンテナを起動します。

laravel-app % ./vendor/bin/sail up

Laravel Sailをバッググラウンドで起動

Sailコマンドを使用してDockerコンテナをバックグラウンドで起動します。

laravel-app % ./vendor/bin/sail up -d
laravel-app % ./vendor/bin/sail up -d
[+] Running 10/10
 ⠿ Network laravel-app_sail               Cr...                            0.0s
 ⠿ Volume "laravel-app_sail-meilisearch"  Created                          0.0s
 ⠿ Volume "laravel-app_sail-mysql"        Created                          0.0s
 ⠿ Volume "laravel-app_sail-redis"        Created                          0.0s
 ⠿ Container laravel-app-mysql-1          Started                          0.8s
 ⠿ Container laravel-app-meilisearch-1    Started                          0.8s
 ⠿ Container laravel-app-redis-1          Started                          0.6s
 ⠿ Container laravel-app-mailpit-1        Started                          0.7s
 ⠿ Container laravel-app-selenium-1       Started                          0.6s
 ⠿ Container laravel-app-laravel.test-1   Started                          1.6s

スポンサードサーチ

ローカルサーバーでLaravelのアプリページを確認する

localhostでローカルサーバー上で、Lalavel-appページ確認ができます。
もし、別でローカルサーバーで同じ起動している場合は、サーバーを切ってください。
※他のポート番号のローカルサーバーの場合は問題ありません。

http://localhost/

Laravel Sailを停止

Sailコマンドを使用してDockerコンテナを閉じます。

./vendor/bin/sail stop

スポンサードサーチ

sailコマンドをエイリアス対応する

「.bashrc」を起動して、下記のaliasをコピペしてください。

alias sail="./vendor/bin/sail"
alisa sail
// sail=./vendor/bin/sail

以降は「laravel-app」ディレクトリで「sail」と実行すれば「./vendor/bin/sail」が実行されます。

sail up
sail up -d
sail stop

phpMyAdminを追加

phpmyadminを追加するにはdocker-composer.ymlを編集します。

icon

docker-composer.ymlとはDockerコンテナの情報を定義するファイルです。

以下のコードをdocker-composer.ymlに記述します。

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 8080:80
        environment:
            MYSQL_USERNAME: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            PMA_HOST: mysql
        networks:
            - sail

全体のコード

version: '3'
services:
    laravel.test:
        build:
            context: ./vendor/laravel/sail/runtimes/8.2
            dockerfile: Dockerfile
            args:
                WWWGROUP: '${WWWGROUP}'
        image: sail-8.2/app
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        ports:
            - '${APP_PORT:-80}:80'
            - '${VITE_PORT:-5173}:${VITE_PORT:-5173}'
        environment:
            WWWUSER: '${WWWUSER}'
            LARAVEL_SAIL: 1
            XDEBUG_MODE: '${SAIL_XDEBUG_MODE:-off}'
            XDEBUG_CONFIG: '${SAIL_XDEBUG_CONFIG:-client_host=host.docker.internal}'
            IGNITION_LOCAL_SITES_PATH: '${PWD}'
        volumes:
            - '.:/var/www/html'
        networks:
            - sail
        depends_on:
            - mysql
            - redis
            - meilisearch
            - mailpit
            - selenium
    mysql:
        image: 'mysql/mysql-server:8.0'
        ports:
            - '${FORWARD_DB_PORT:-3306}:3306'
        environment:
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ROOT_HOST: '%'
            MYSQL_DATABASE: '${DB_DATABASE}'
            MYSQL_USER: '${DB_USERNAME}'
            MYSQL_PASSWORD: '${DB_PASSWORD}'
            MYSQL_ALLOW_EMPTY_PASSWORD: 1
        volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './vendor/laravel/sail/database/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - mysqladmin
                - ping
                - '-p${DB_PASSWORD}'
            retries: 3
            timeout: 5s
    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 8080:80
        environment:
            MYSQL_USERNAME: '${DB_USERNAME}'
            MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
            PMA_HOST: mysql
        networks:
            - sail
    redis:
        image: 'redis:alpine'
        ports:
            - '${FORWARD_REDIS_PORT:-6379}:6379'
        volumes:
            - 'sail-redis:/data'
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - redis-cli
                - ping
            retries: 3
            timeout: 5s
    meilisearch:
        image: 'getmeili/meilisearch:latest'
        ports:
            - '${FORWARD_MEILISEARCH_PORT:-7700}:7700'
        volumes:
            - 'sail-meilisearch:/meili_data'
        networks:
            - sail
        healthcheck:
            test:
                - CMD
                - wget
                - '--no-verbose'
                - '--spider'
                - 'http://localhost:7700/health'
            retries: 3
            timeout: 5s
    mailpit:
        image: 'axllent/mailpit:latest'
        ports:
            - '${FORWARD_MAILPIT_PORT:-1025}:1025'
            - '${FORWARD_MAILPIT_DASHBOARD_PORT:-8025}:8025'
        networks:
            - sail
    selenium:
        image: seleniarm/standalone-chromium
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        volumes:
            - '/dev/shm:/dev/shm'
        networks:
            - sail
networks:
    sail:
        driver: bridge
volumes:
    sail-mysql:
        driver: local
    sail-redis:
        driver: local
    sail-meilisearch:
        driver: local

ログイン不要にする場合

    phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 8080:80
        environment:
            PMA_USER: "${DB_USERNAME}"
            PMA_PASSWORD: "${DB_PASSWORD}"
            PMA_HOST: mysql
        networks:
            - sail

phpmyadminへアクセス

http://localhost:8080/

ログイン時のユーザー名とパスワードは以下になります。

ユーザー名パスワード
sailpassword

この情報は「.env」ファイルに記述されています。

Laravel,PHPLaravel

Posted by kami