著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにThe FreeBSD Foundationを選択しました。
前書き
過去数年間、Dockerは、一時的なcontainersでのアプリケーションの実行と展開を簡素化する方法のおかげで、アプリケーションを展開するために頻繁に使用されるソリューションになりました。 たとえば、PHP、Nginx、MySQL、およびLaravelフレームワークでLEMPアプリケーションスタックを使用する場合、Dockerはセットアッププロセスを大幅に合理化できます。
Docker Composeは、開発者がアプリケーションサービス、ネットワーク、ボリュームなどのインフラストラクチャを1つのファイルで定義できるようにすることで、開発プロセスをさらに簡素化しました。 Docker Composeは、複数のdocker container create
およびdocker container run
コマンドを実行する代わりの効率的な方法を提供します。
このチュートリアルでは、NginxをWebサーバー、MySQLをデータベースとして、すべてDockerコンテナー内で、Laravelフレームワークを使用してWebアプリケーションを構築します。 スタック構成全体を、PHP、MySQL、およびNginxの構成ファイルとともにdocker-compose
ファイルで定義します。
前提条件
開始する前に、次のものが必要です。
-
1つのUbuntu18.04サーバー、および
sudo
特権を持つ非rootユーザー。 これを設定するには、Initial Server Setup with Ubuntu 18.04チュートリアルに従ってください。 -
How To Install and Use Docker on Ubuntu 18.04のステップ1と2に従って、Dockerがインストールされました。
-
How To Install Docker Compose on Ubuntu 18.04のステップ1に従って、DockerComposeがインストールされました。
[[step-1 -—- downloading-laravel-and-installing-dependencies]] ==ステップ1—Laravelのダウンロードと依存関係のインストール
最初のステップとして、Laravelの最新バージョンを入手し、PHPのアプリケーションレベルのパッケージマネージャーであるComposerを含むプロジェクトの依存関係をインストールします。 Composerをグローバルにインストールする必要がないように、これらの依存関係をDockerでインストールします。
まず、ホームディレクトリにいることを確認し、最新のLaravelリリースをlaravel-app
というディレクトリに複製します。
cd ~
git clone https://github.com/laravel/laravel.git laravel-app
laravel-app
ディレクトリに移動します。
cd ~/laravel-app
次に、Dockerのcomposer
imageを使用して、Laravelプロジェクトに必要なディレクトリをマウントし、Composerをグローバルにインストールするオーバーヘッドを回避します。
docker run --rm -v $(pwd):/app composer install
-v
および--rm
フラグをdocker run
とともに使用すると、削除される前に現在のディレクトリにバインドマウントされるエフェメラルコンテナが作成されます。 これにより、~/laravel-app
ディレクトリーの内容がコンテナーにコピーされ、Composerがコンテナー内に作成するvendor
フォルダーが現在のディレクトリーに確実にコピーされます。
最後のステップとして、プロジェクトディレクトリに権限を設定して、root以外のユーザーが所有するようにします。
sudo chown -R $USER:$USER ~/laravel-app
これは、ステップ4でアプリケーションイメージのDockerfileを作成するときに重要になります。これにより、アプリケーションコードを操作し、root以外のユーザーとしてコンテナー内のプロセスを実行できるようになります。
アプリケーションコードを配置したら、Docker Composeを使用してサービスの定義に進むことができます。
[[step-2 -—- creating-the-docker-compose-file]] ==ステップ2—Docker作成ファイルの作成
Docker Composeを使用してアプリケーションを構築すると、インフラストラクチャのセットアップとバージョン管理のプロセスが簡素化されます。 Laravelアプリケーションをセットアップするために、Webサーバー、データベース、およびアプリケーションサービスを定義するdocker-compose
ファイルを作成します。
ファイルを開きます。
nano ~/laravel-app/docker-compose.yml
docker-compose
ファイルでは、app
、webserver
、およびdb
の3つのサービスを定義します。 次のコードをファイルに追加します。必ず、db
サービスでenvironment variableとして定義されているMYSQL_ROOT_PASSWORD
のrootパスワードを、選択した強力なパスワードに置き換えてください。 :
~/laravel-app/docker-compose.yml
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
networks:
- app-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
networks:
- app-network
#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
ここで定義されるサービスは次のとおりです。
-
app
:このサービス定義にはLaravelアプリケーションが含まれており、ステップ4で定義するカスタムDockerイメージdigitalocean.com/php
を実行します。 また、コンテナ内のworking_dir
を/var/www
に設定します。 -
webserver
:このサービス定義はDockerからnginx:alpine
imageをプルし、ポート80
と443
を公開します。 -
db
:このサービス定義はDockerからmysql:5.7.22
imageを取得し、アプリケーションのlaravel
というデータベースやデータベースのrootパスワードなど、いくつかの環境変数を定義します。 データベースには任意の名前を付けることができます。your_mysql_root_password
を独自の強力なパスワードに置き換える必要があります。 このサービス定義は、ホストのポート3306
をコンテナーのポート3306
にもマップします。
各container_name
プロパティは、サービスの名前に対応するコンテナの名前を定義します。 このプロパティを定義しない場合、Dockerは、歴史的に有名な人の名前とアンダースコアで区切られたランダムな単語を組み合わせて、各コンテナに名前を割り当てます。
コンテナ間の通信を容易にするために、サービスはapp-network
と呼ばれるブリッジネットワークに接続されます。 ブリッジネットワークは、同じブリッジネットワークに接続されたコンテナが互いに通信できるようにするソフトウェアブリッジを使用します。 ブリッジドライバは、異なるブリッジネットワーク上のコンテナが互いに直接通信できないように、ホストマシンにルールを自動的にインストールします。 これにより、アプリケーションのセキュリティレベルが向上し、関連するサービスのみが相互に通信できるようになります。 また、関連する機能に接続する複数のネットワークとサービスを定義できることも意味します。たとえば、フロントエンドアプリケーションサービスはfrontend
ネットワークを使用でき、バックエンドサービスはbackend
ネットワークを使用できます。
ボリュームを追加してマウントをサービス定義にバインドし、アプリケーションデータを保持する方法を見てみましょう。
[[step-3 -—- persisting-data]] ==ステップ3—データの永続化
Dockerには、データを永続化するための強力で便利な機能があります。 このアプリケーションでは、volumesとbind mountsを使用して、データベース、およびアプリケーションと構成ファイルを永続化します。 ボリュームは、コンテナのライフサイクルを超えたバックアップと永続性の柔軟性を提供し、バインドマウントは開発中のコード変更を容易にし、コンテナでホストファイルまたはディレクトリの変更をすぐに利用できるようにします。 私たちのセットアップは両方を利用します。
[.warning]#Warning:バインドマウントを使用すると、重要なシステムファイルまたはディレクトリの作成、変更、削除など、コンテナで実行されているプロセスを通じてホストファイルシステムを変更できます。 これはセキュリティに影響を与える強力な機能であり、ホストシステム上のDocker以外のプロセスに影響を与える可能性があります。 バインドマウントは注意して使用してください。
#
docker-compose
ファイルで、db
サービス定義の下にdbdata
というボリュームを定義して、MySQLデータベースを永続化します。
~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
networks:
- app-network
...
名前付きボリュームdbdata
は、コンテナー内に存在する/var/lib/mysql
フォルダーの内容を保持します。 これにより、データを失うことなく、db
サービスを停止および再起動できます。
ファイルの最後に、dbdata
ボリュームの定義を追加します。
~/laravel-app/docker-compose.yml
...
#Volumes
volumes:
dbdata:
driver: local
この定義を導入すると、サービス全体でこのボリュームを使用できるようになります。
次に、ステップ7で作成するMySQL構成ファイルのdb
サービスにバインドマウントを追加します。
~/laravel-app/docker-compose.yml
...
#MySQL Service
db:
...
volumes:
- dbdata:/var/lib/mysql
- ./mysql/my.cnf:/etc/mysql/my.cnf
...
このバインドマウントは、コンテナ内の~/laravel-app/mysql/my.cnf
を/etc/mysql/my.cnf
にバインドします。
次に、バインドマウントをwebserver
サービスに追加します。 2つあります。1つはアプリケーションコード用で、もう1つは手順6で作成するNginx構成定義用です。
~/laravel-app/docker-compose.yml
#Nginx Service
webserver:
...
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
最初のバインドマウントは、~/laravel-app
ディレクトリ内のアプリケーションコードをコンテナ内の/var/www
ディレクトリにバインドします。 ~/laravel-app/nginx/conf.d/
に追加する構成ファイルは、コンテナー内の/etc/nginx/conf.d/
にもマウントされるため、必要に応じて構成ディレクトリの内容を追加または変更できます。
最後に、アプリケーションコードと構成ファイルのapp
サービスに次のバインドマウントを追加します。
~/laravel-app/docker-compose.yml
#PHP Service
app:
...
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
app
サービスは、アプリケーションコードを含む~/laravel-app
フォルダーをコンテナー内の/var/www
フォルダーにバインドマウントします。 これにより、ローカルアプリケーションディレクトリに加えられた変更がコンテナ内に即座に反映されるため、開発プロセスが高速化されます。 また、PHP構成ファイル~/laravel-app/php/local.ini
をコンテナー内の/usr/local/etc/php/conf.d/local.ini
にバインドしています。 手順5でローカルPHP構成ファイルを作成します。
docker-compose
ファイルは次のようになります。
~/laravel-app/docker-compose.yml
version: '3'
services:
#PHP Service
app:
build:
context: .
dockerfile: Dockerfile
image: digitalocean.com/php
container_name: app
restart: unless-stopped
tty: true
environment:
SERVICE_NAME: app
SERVICE_TAGS: dev
working_dir: /var/www
volumes:
- ./:/var/www
- ./php/local.ini:/usr/local/etc/php/conf.d/local.ini
networks:
- app-network
#Nginx Service
webserver:
image: nginx:alpine
container_name: webserver
restart: unless-stopped
tty: true
ports:
- "80:80"
- "443:443"
volumes:
- ./:/var/www
- ./nginx/conf.d/:/etc/nginx/conf.d/
networks:
- app-network
#MySQL Service
db:
image: mysql:5.7.22
container_name: db
restart: unless-stopped
tty: true
ports:
- "3306:3306"
environment:
MYSQL_DATABASE: laravel
MYSQL_ROOT_PASSWORD: your_mysql_root_password
SERVICE_TAGS: dev
SERVICE_NAME: mysql
volumes:
- dbdata:/var/lib/mysql/
- ./mysql/my.cnf:/etc/mysql/my.cnf
networks:
- app-network
#Docker Networks
networks:
app-network:
driver: bridge
#Volumes
volumes:
dbdata:
driver: local
ファイルを保存し、変更が完了したらエディターを終了します。
docker-compose
ファイルを作成したら、アプリケーションのカスタムイメージを作成できます。
[[step-4 -—- creating-the-dockerfile]] ==ステップ4—Dockerfileを作成する
Dockerでは、Dockerfileを使用して個々のコンテナー内の環境を指定できます。 Dockerfileを使用すると、アプリケーションに必要なソフトウェアをインストールし、要件に基づいて設定を構成するために使用できるカスタムイメージを作成できます。 作成したカスタムイメージをDocker Hubまたは任意のプライベートレジストリにプッシュできます。
Dockerfile
は、~/laravel-app
ディレクトリに配置されます。 ファイルを作成します。
nano ~/laravel-app/Dockerfile
このDockerfile
はベースイメージを設定し、Laravelアプリケーションイメージを構築するために必要なコマンドと命令を指定します。 ファイルに次のコードを追加します。
~/laravel-app/php/Dockerfile
FROM php:7.2-fpm
# Copy composer.lock and composer.json
COPY composer.lock composer.json /var/www/
# Set working directory
WORKDIR /var/www
# Install dependencies
RUN apt-get update && apt-get install -y \
build-essential \
mysql-client \
libpng-dev \
libjpeg62-turbo-dev \
libfreetype6-dev \
locales \
zip \
jpegoptim optipng pngquant gifsicle \
vim \
unzip \
git \
curl
# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
# Install extensions
RUN docker-php-ext-install pdo_mysql mbstring zip exif pcntl
RUN docker-php-ext-configure gd --with-gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/
RUN docker-php-ext-install gd
# Install composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
# Add user for laravel application
RUN groupadd -g 1000 www
RUN useradd -u 1000 -ms /bin/bash -g www www
# Copy existing application directory contents
COPY . /var/www
# Copy existing application directory permissions
COPY --chown=www:www . /var/www
# Change current user to www
USER www
# Expose port 9000 and start php-fpm server
EXPOSE 9000
CMD ["php-fpm"]
まず、Dockerfileはphp:7.2-fpm
Docker imageの上にイメージを作成します。 これは、PHP FastCGI実装PHP-FPMがインストールされているDebianベースのイメージです。 このファイルは、Laravelの前提条件パッケージ(mcrypt
、pdo_mysql
、mbstring
、およびimagick
とcomposer
)もインストールします。
RUN
ディレクティブは、wwwという専用のユーザーとグループの作成など、コンテナー内の設定を更新、インストール、および構成するためのコマンドを指定します。 WORKDIR
命令は、/var/www
ディレクトリをアプリケーションの作業ディレクトリとして指定します。
権限が制限された専用のユーザーとグループを作成すると、デフォルトでrootとして実行されるDockerコンテナーを実行する際の固有の脆弱性が軽減されます。 このコンテナをrootとして実行する代わりに、wwwユーザーを作成しました。このユーザーは、COPY
命令のおかげで、/var/www
フォルダーへの読み取り/書き込みアクセス権を持っています。 --chown
フラグとともに使用して、アプリケーションフォルダーのアクセス許可をコピーします。
最後に、EXPOSE
コマンドは、php-fpm
サーバーのコンテナー9000
のポートを公開します。 CMD
は、コンテナの作成後に実行する必要があるコマンドを指定します。 ここで、CMD
はサーバーを起動する"php-fpm"
を指定します。
ファイルを保存し、変更が完了したらエディターを終了します。
これで、PHP構成の定義に進むことができます。
[[step-5 -—- configuring-php]] ==ステップ5—PHPの構成
docker-compose
ファイルでインフラストラクチャを定義したので、Nginxからの着信要求のPHPプロセッサとして機能するようにPHPサービスを構成できます。
PHPを構成するには、php
フォルダー内にlocal.ini
ファイルを作成します。 これは、手順2でコンテナ内の/usr/local/etc/php/conf.d/local.ini
にバインドマウントしたファイルです。 このファイルを作成すると、PHPが起動時に読み取るデフォルトのphp.ini
ファイルを上書きできます。
php
ディレクトリを作成します。
mkdir ~/laravel-app/php
次に、local.ini
ファイルを開きます。
nano ~/laravel-app/php/local.ini
PHPの設定方法を示すため、次のコードを追加して、アップロードするファイルのサイズ制限を設定します。
~/laravel-app/php/local.ini
upload_max_filesize=40M
post_max_size=40M
upload_max_filesize
およびpost_max_size
ディレクティブは、アップロードされたファイルの最大許容サイズを設定し、local.ini
ファイルからphp.ini
構成を設定する方法を示します。 オーバーライドするPHP固有の構成は、local.ini
ファイルに入れることができます。
ファイルを保存して、エディターを終了します。
PHPlocal.ini
ファイルを配置したら、Nginxの構成に進むことができます。
[[step-6 -—- configuring-nginx]] ==ステップ6—Nginxの構成
PHPサービスを構成したら、Nginxサービスを変更して、動的コンテンツを提供するFastCGIサーバーとしてPHP-FPMを使用できます。 FastCGIサーバーは、対話型プログラムをWebサーバーとインターフェイスさせるためのバイナリプロトコルに基づいています。 詳細については、Understanding and Implementing FastCGI Proxying in Nginxに関するこの記事を参照してください。
Nginxを構成するには、~/laravel-app/nginx/conf.d/
フォルダーにサービス構成を含むapp.conf
ファイルを作成します。
まず、nginx/conf.d/
ディレクトリを作成します。
mkdir -p ~/laravel-app/nginx/conf.d
次に、app.conf
構成ファイルを作成します。
nano ~/laravel-app/nginx/conf.d/app.conf
次のコードをファイルに追加して、Nginx構成を指定します。
~/laravel-app/nginx/conf.d/app.conf
server {
listen 80;
index index.php index.html;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
root /var/www/public;
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
gzip_static on;
}
}
server blockは、次のディレクティブを使用してNginxWebサーバーの構成を定義します。
-
listen
:このディレクティブは、サーバーが着信要求をリッスンするポートを定義します。 -
error_log
およびaccess_log
:これらのディレクティブは、ログを書き込むためのファイルを定義します。 -
root
:このディレクティブは、ルートフォルダーのパスを設定し、ローカルファイルシステム上の要求されたファイルへの完全なパスを形成します。
php
ロケーションブロックで、fastcgi_pass
ディレクティブは、app
サービスがポート9000
のTCPソケットでリッスンしていることを指定します。 これにより、PHP-FPMサーバーは、Unixソケットではなくネットワーク経由でリッスンします。 Unixソケットは、TCPソケットよりも速度がわずかに優れていますが、ネットワークプロトコルがないため、ネットワークスタックをスキップします。 ホストが1台のマシンにある場合、Unixソケットは理にかなっていますが、異なるホストで実行されているサービスがある場合、TCPソケットには分散サービスに接続できるという利点があります。 app
コンテナーはwebserver
コンテナーとは異なるホストで実行されているため、構成にはTCPソケットが最も適しています。
ファイルを保存し、変更が完了したらエディターを終了します。
手順2で作成したバインドマウントのおかげで、nginx/conf.d/
フォルダー内で行った変更は、webserver
コンテナー内に直接反映されます。
次に、MySQLの設定を見てみましょう。
[[step-7 -—- configuring-mysql]] ==ステップ7—MySQLの構成
PHPとNginxを構成すると、MySQLをアプリケーションのデータベースとして機能させることができます。
MySQLを構成するには、mysql
フォルダーにmy.cnf
ファイルを作成します。 これは、手順2でコンテナ内の/etc/mysql/my.cnf
にバインドマウントしたファイルです。 このバインドマウントを使用すると、必要に応じてmy.cnf
設定を上書きできます。
これがどのように機能するかを示すために、my.cnf
ファイルに設定を追加して、一般的なクエリログを有効にし、ログファイルを指定します。
まず、mysql
ディレクトリを作成します。
mkdir ~/laravel-app/mysql
次に、my.cnf
ファイルを作成します。
nano ~/laravel-app/mysql/my.cnf
ファイルに次のコードを追加して、クエリログを有効にし、ログファイルの場所を設定します。
~/laravel-app/mysql/my.cnf
[mysqld]
general_log = 1
general_log_file = /var/lib/mysql/general.log
このmy.cnf
ファイルはログを有効にし、general_log
設定を1
として定義して、一般的なログを許可します。 general_log_file
設定は、ログが保存される場所を指定します。
ファイルを保存して、エディターを終了します。
次のステップは、コンテナを起動することです。
[[step-8 -—- running-the-containers-and-modifying-environment-settings]] ==ステップ8—コンテナの実行と環境設定の変更
docker-compose
ファイルですべてのサービスを定義し、これらのサービスの構成ファイルを作成したので、コンテナーを開始できます。 ただし、最後のステップとして、Laravelにデフォルトで含まれている.env.example
ファイルのコピーを作成し、コピーに.env
という名前を付けます。これは、Laravelが環境を定義することを期待しているファイルです。
cp .env.example .env
コンテナを起動したら、このファイルで設定の特定の詳細を設定します。
docker-compose
ファイルで定義されたすべてのサービスを使用して、1つのコマンドを発行するだけで、すべてのコンテナーを開始し、ボリュームを作成し、ネットワークをセットアップして接続できます。
docker-compose up -d
docker-compose up
を初めて実行すると、必要なすべてのDockerイメージがダウンロードされます。これには時間がかかる場合があります。 イメージがダウンロードされてローカルマシンに保存されると、Composeはコンテナを作成します。 -d
フラグはプロセスをデーモン化し、コンテナーをバックグラウンドで実行します。
プロセスが完了したら、次のコマンドを使用して、実行中のすべてのコンテナーを一覧表示します。
docker ps
app
、webserver
、およびdb
コンテナの詳細を含む次の出力が表示されます。
OutputCONTAINER ID NAMES IMAGE STATUS PORTS
c31b7b3251e0 db mysql:5.7.22 Up 2 seconds 0.0.0.0:3306->3306/tcp
ed5a69704580 app digitalocean.com/php Up 2 seconds 9000/tcp
5ce4ee31d7c0 webserver nginx:alpine Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
この出力のCONTAINER ID
は各コンテナーの一意の識別子であり、NAMES
はそれぞれに関連付けられたサービス名をリストします。 これらの識別子の両方を使用して、コンテナにアクセスできます。 IMAGE
は各コンテナのイメージ名を定義し、STATUS
はコンテナの状態(実行中、再起動中、停止中)に関する情報を提供します。
app
コンテナの.env
ファイルを変更して、セットアップに関する特定の詳細を含めることができるようになりました。
docker-compose exec
を使用してファイルを開きます。これにより、コンテナーで特定のコマンドを実行できます。 この場合、ファイルを編集用に開いています。
docker-compose exec app nano .env
DB_CONNECTION
を指定するブロックを見つけて、セットアップの詳細を反映するように更新します。 次のフィールドを変更します。
-
DB_HOST
は、db
データベースコンテナになります。 -
DB_DATABASE
はlaravel
データベースになります。 -
DB_USERNAME
は、データベースに使用するユーザー名になります。 この場合、laraveluser
を使用します。 -
DB_PASSWORD
は、このユーザーアカウントに使用する安全なパスワードになります。
/var/www/.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laraveluser
DB_PASSWORD=your_laravel_db_password
変更を保存して、エディターを終了します。
次に、php artisan key:generate
コマンドを使用してLaravelアプリケーションのアプリケーションキーを設定します。 このコマンドは、キーを生成して.env
ファイルにコピーし、ユーザーセッションと暗号化されたデータの安全性を確保します。
docker-compose exec app php artisan key:generate
これで、アプリケーションの実行に必要な環境設定ができました。 これらの設定をファイルにキャッシュして、アプリケーションの読み込み速度を上げるには、次を実行します:
docker-compose exec app php artisan config:cache
構成設定は、コンテナーの/var/www/bootstrap/cache/config.php
にロードされます。
最後のステップとして、ブラウザでhttp://your_server_ip
にアクセスします。 Laravelアプリケーションの次のホームページが表示されます。
コンテナーが実行され、構成情報が配置されたら、db
コンテナー上のlaravel
データベースのユーザー情報の構成に進むことができます。
[[step-9 -—- creating-a-user-for-mysql]] ==ステップ9—MySQLのユーザーを作成する
デフォルトのMySQLインストールでは、root管理アカウントのみが作成されます。このアカウントには、データベースサーバーに対する無制限の権限があります。 一般に、データベースを操作するときは、root管理アカウントの使用を避けることをお勧めします。 代わりに、アプリケーションのLaravelデータベース専用のデータベースユーザーを作成しましょう。
新しいユーザーを作成するには、docker-compose exec
を使用してdb
コンテナーで対話型bashシェルを実行します。
docker-compose exec db bash
コンテナ内で、MySQLrootの管理者アカウントにログインします。
mysql -u root -p
インストール中にMySQLrootアカウントに設定したパスワードをdocker-compose
ファイルに入力するように求められます。
docker-compose
ファイルで定義したlaravel
というデータベースを確認することから始めます。 show databases
コマンドを実行して、既存のデータベースを確認します。
show databases;
出力にlaravel
データベースが表示されます。
Output+--------------------+
| Database |
+--------------------+
| information_schema |
| laravel |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
次に、このデータベースへのアクセスを許可するユーザーアカウントを作成します。 ユーザー名はlaraveluser
になりますが、必要に応じて別の名前に置き換えることができます。 ここでのユーザー名とパスワードが、前の手順で.env
ファイルに設定した詳細と一致していることを確認してください。
GRANT ALL ON laravel.* TO 'laraveluser'@'%' IDENTIFIED BY 'your_laravel_db_password';
特権をフラッシュして、MySQLサーバーに変更を通知します。
FLUSH PRIVILEGES;
MySQLを終了します。
EXIT;
最後に、コンテナを終了します。
exit
Laravelアプリケーションデータベースのユーザーアカウントを構成し、データを移行してTinkerコンソールを使用する準備ができました。
[[step-10 -—- migrating-data-and-working-with-the-tinker-console]] ==ステップ10—データの移行とTinkerコンソールの操作
アプリケーションを実行した状態で、データを移行し、tinker
コマンドを試してみることができます。これにより、LaravelがプリロードされたPsySHコンソールが起動します。 PsySHは、ランタイム開発者コンソールおよびPHP用の対話型デバッガーであり、TinkerはLaravel専用のREPLです。 tinker
コマンドを使用すると、インタラクティブシェルのコマンドラインからLaravelアプリケーションを操作できるようになります。
まず、Laravelartisan migrate
コマンドを実行してMySQLへの接続をテストします。このコマンドは、コンテナー内からデータベースにmigrations
テーブルを作成します。
docker-compose exec app php artisan migrate
このコマンドは、デフォルトのLaravelテーブルを移行します。 移行を確認する出力は次のようになります。
Output
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
移行が完了したら、クエリを実行して、tinker
コマンドを使用してデータベースに正しく接続されているかどうかを確認できます。
docker-compose exec app php artisan tinker
移行したデータを取得して、MySQL接続をテストします。
\DB::table('migrations')->get();
次のような出力が表示されます。
Output=> Illuminate\Support\Collection {#2856
all: [
{#2862
+"id": 1,
+"migration": "2014_10_12_000000_create_users_table",
+"batch": 1,
},
{#2865
+"id": 2,
+"migration": "2014_10_12_100000_create_password_resets_table",
+"batch": 1,
},
],
}
tinker
を使用して、データベースを操作したり、サービスやモデルを試したりすることができます。
Laravelアプリケーションを配置したら、さらに開発と実験を行う準備が整います。
結論
サーバーでLEMPスタックアプリケーションが実行されました。Laravelのウェルカムページにアクセスし、MySQLデータベースの移行を作成してテストしました。
このインストールのシンプルさの鍵はDocker Composeです。これにより、単一のコマンドで単一ファイルに定義されたDockerコンテナーのグループを作成できます。 Docker Composeを使用してCIを実行する方法について詳しく知りたい場合は、How To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04を参照してください。 Laravelアプリケーションのデプロイプロセスを合理化したい場合は、How to Automatically Deploy Laravel Applications with Deployer on Ubuntu 16.04が関連リソースになります。