[conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する
はじめに
Laravelで個人開発中の備忘録です。
conoha VPSにDocker + Laravel構成
のローカル開発環境とVPSのdev
環境とそのデプロイ機構までを作成していきますので是非ご参考ください🙌
- [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
- [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
- [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する (←今ここ)
- [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする
- [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定
今回はVPSでコンテナを起動する内容のため、構成図的には以下の③を範囲になります。
(構成図の画像は拡大してご確認いただけます)
環境
実行環境
🐳 コンテナ
- php 8.2
- laravel 12
💻 ローカル
- MacOS 15.4
- Docker version 24.0.2
- Docker Compose version v2.19.1
それでは以下の流れで進めいきましょう!
- VPS用にDocker関連のファイルの調整
- conoha VPSの設定
- conoha VPSでコンテナ起動
Docker関連のファイルの調整(💻)
ディレクトリ構成の変更
前回まで現在
.
├── compose.yaml
├── docker
│ ├── app
│ │ ├── 000-default.conf
│ │ ├── Dockerfile
│ │ └── php.ini
│ ├── db
│ │ ├── Dockerfile
│ │ └── my.cnf
│ └── phpmyadmin
│ └── Dockerfile
├── README.md
└── src
└── (laravel)
以下のように変更します。
.
├── docker
│ ├── app
│ │ ├── 000-default.conf
│ │ ├── Dockerfile
│ │ └── php.ini
+│ ├── compose.local.yaml
+│ ├── compose.dev.yaml
│ ├── db
│ │ ├── Dockerfile
│ │ └── my.cnf
+│ ├── env
+│ │ └── dev
+│ │ ├── db.env
+│ │ ├── .gitignore
+│ │ └── phpmyadmin.env
│ └── phpmyadmin
│ └── Dockerfile
├── README.md
└── src
└── (laravel)
変更点
-
compose.yaml
を ↓-
docker/
ディレクトリへ移動 -
compose.local.yaml
にリネーム -
compose.dev.yaml
も複製
-
-
env/dev
ディレクトリを作成-
db.env
とphpmyadmin.env
と.gitignore
を作成
-
ディレクトリ構成の方針
環境ごとにファイルを分けたり、コンテナの環境変数をディレクトリに切り出したりすることで少しファイル数が増えます。そのため、compose.yaml
系のファイルもプロジェクトルートからdocker/
ディレクトリで管理しDocker関連としてまとめることにします。
docker/compose.dev.yaml
compose.local.yaml
から複製したと想定し、以下修正をします。
services:
# ----------------------------------
# MySQL
# ----------------------------------
db:
- container_name: local_db
+ container_name: dev_db
- build: ./docker/db
+ build: ./db
restart: always
- environment:
- - MYSQL_ROOT_PASSWORD=password
- - MYSQL_DATABASE=local_db
- - MYSQL_USER=admin
- - MYSQL_PASSWORD=password123
- - TZ=Asia/Tokyo
+ env_file:
+ - ./env/dev/db.env
volumes:
- - local_data:/var/lib/mysql
+ - dev_data:/var/lib/mysql
# ----------------------------------
# phpMyAdmin
# ----------------------------------
phpmyadmin:
- container_name: local_phpmyadmin
+ container_name: dev_phpmyadmin
- build: ./docker/phpmyadmin
+ build: ./phpmyadmin
restart: always
- environment:
- - PMA_ARBITRARY=1
- - PMA_HOSTS=local_db
+ env_file:
+ - ./env/dev/phpmyadmin.env
ports:
- - 8080:80
+ - 7070:80
depends_on:
- db
# ----------------------------------
# Apache + PHP
# ----------------------------------
app:
container_name: dev_app
- build: ./docker/app
+ build: ./app
environment:
- - APP_ENV=local
+ - APP_ENV=dev
volumes:
- - ./src:/var/www/html
+ - ../src:/var/www/html
ports:
- - 8000:80
+ - 7000:80
depends_on:
- db
# ボリュームの定義
volumes:
- local_data:
+ dev_data:
docker/env/dev/db.env
compose.dev.yaml
で指定していた内容を移動し修正ます。
MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=local_db
+ MYSQL_DATABASE=dev_db
MYSQL_USER=admin
MYSQL_PASSWORD=password123
TZ=Asia/Tokyo
docker/env/dev/phpmyadmin.env
compose.dev.yaml
で指定していた内容を移動し修正ます。
PMA_ARBITRARY=1
- PMA_HOSTS=local_db
+ PMA_HOSTS=dev_db
docker/env/dev/.gitignore
DB接続情報などは機密情報なのでgit管理から外します。
*
!.gitignore
src/.env.devを作成(💻)
.env.local
を複製して.env.dev
を作成し以下のように修正します。
キー | 値 |
---|---|
APP_ENV |
dev |
APP_KEY |
後で作成するので値は削除しておく(APP_KEY= ) |
APP_URL |
http://VPSのIPアドレス |
BD_* |
docker/env/dev/db.env の内容 |
暗号化
暗号化された.env.dev.encrypted
ファイルを作成します。
php artisan env:encrypt --env=dev
Webサーバの設定(🌏)
インストール
sudo apt -y install apache2
systemctl status apache2
active (running)
と表示されていればOKです。
サーバ起動時に自動でApacheも立ち上がるように設定します。
sudo systemctl enable apache2
ファイヤーウォールの設定
プロファイル一覧を出力し、Webサーバ関連を確認します。
sudo ufw app list
(出力結果↓)
...
WWW
WWW Full
WWW Secure
プロファイル名 | 内容 |
---|---|
WWW | ポート 80(HTTP) |
WWW Full | ポート 443(HTTPS) |
WWW Secure | ポート 80 + 443(両方) |
今回は80
と443
を通す設定にして更新します。
sudo ufw allow 'WWW Full'
sudo ufw reload
WWW Full
がALLOW
ならOKです。
sudo ufw status
Status: active
To Action From
-- ------ ----
12345 ALLOW Anywhere
WWW Full ALLOW Anywhere
12345 (v6) ALLOW Anywhere (v6)
WWW Full (v6) ALLOW Anywhere (v6)
セキュリティグループの設定
デフォルトでIPv4v6-Web
という80
と443
を通すセキュリティグループがあるので中身を確認します。(conoha VPSのポータル画面のセキュリティグループ
)
VPSに追加します。(conoha VPSのポータル画面のサーバー
>ネームタグ
>ネットワーク情報
>セキュリティグループ
)
動作確認
http://VPSのIPアドレス
でアクセスしてApacheのデフォルトページが表示されればOKです。
Dockerをインストール(🌏)
Dockerをインストールは基本的に公式サイト通り行います。
インストール
まずは上記のドキュメントのリポジトリを利用したインストール
の手順に従いインストールします。
一応以下のアコーディオン内に手順を記載していますが、基本的にはドキュメントのコマンドをご参照ください。
実行するコマンド
リポジトリのセットアップ
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
Docker の公式 GPG 鍵を追加
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
リポジトリをセットアップ
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Dockerエンジンのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Docker Engine が正しくインストールされているのを確認するため、hello-worldイメージを実行
sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
dockerグループに追加
上記のドキュメントにも記載されているようにDockerは通信に、所有者がrootのLinuxソケットを活用するため、必然的に実行にはsudo
コマンドが必要です。
インストール時にroot
グループと同等の権限を持つdocker
グループが作られていますので、dockerコマンドを使用するユーザー(今回は前回の記事で作成したadmin
ユーザー)をdocker
グループに追加することでsudo
なしで実行できるようにします。
一応以下のアコーディオン内に手順を記載していますが、基本的にはドキュメントのコマンドをご参照ください。
実行するコマンド
docker
グループがあるか確認
cat /etc/group | grep docker
admin
ユーザーを追加
sudo usermod -aG docker admin
検証でhello-worldイメージを実行。
sudo
がなくてもdocker
コマンドが実行できることに注目。
docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
Apacheのリバースプロキシ設定(🌏)
.conf
をアプリ用とphpMyAdmin用に分ける
Apacheのバーチャルホストの設定を分けて、サブドメインをそれぞれLaravelのコンテナとphpMyAdmin
コンテナへ転送するようにします。
ドメイン | 転送先 | 用途 |
---|---|---|
dev-app.sample.com | http://127.0.0.1:7000/ |
Laravelコンテナ |
dev-phpmyadmin.example.com | http://127.0.0.1:7070/ |
phpMyAdminコンテナ |
まずは現状の設定ファイルの状態を確認します。
/etc/apache2/sites-enabled/000-default.conf
です。
sudo apache2ctl -t -D DUMP_VHOSTS
VirtualHost configuration:
*:80 localhost (/etc/apache2/sites-enabled/000-default.conf:1)
また、以下で確認できるように/etc/apache2/sites-enabled/000-default.conf
は../sites-available/000-default.conf
のシンボリックリンクです。
ls -al /etc/apache2/sites-enabled/
total 8
drwxr-xr-x 2 root root 4096 May 26 16:41 .
drwxr-xr-x 8 root root 4096 May 27 16:48 ..
lrwxrwxrwx 1 root root 35 May 26 16:41 000-default.conf -> ../sites-available/000-default.conf
そのため、追加する2つの設定ファイルは/sites-available/
ディレクトリに作成していきます。
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/dev-app.conf
sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/dev-phpmyadmin.conf
.conf
を編集
まずはリバースプロキシに必要なモジュールを有効化します。
# プロキシ関連モジュールを有効化(初回のみ)
sudo a2enmod proxy
sudo a2enmod proxy_http
# Apache 再起動
sudo systemctl restart apache2
続いてLaravelコンテナへの転送用のdev-app.conf
を編集します。
sudo vi /etc/apache2/sites-available/dev-app.conf
- #ServerName sample.com
+ ServerName dev-app.sample.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
+ # リバースプロキシ設定
+ ProxyPreserveHost On
+ ProxyPass / http://127.0.0.1:7000/
+ ProxyPassReverse / http://127.0.0.1:7000/
続いてphpMyAdminコンテナへの転送用のdev-phpmyadmin.conf
を編集します。
sudo vi /etc/apache2/sites-available/dev-phpmyadmin.conf
- #ServerName sample.com
+ ServerName dev-phpmyadmin.sample.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
+ # リバースプロキシ設定
+ ProxyPreserveHost On
+ ProxyPass / http://127.0.0.1:7070/
+ ProxyPassReverse / http://127.0.0.1:7070/
# 新しい設定のシンボリックリンクを反映
sudo a2ensite dev-app.conf
sudo a2ensite dev-phpmyadmin.conf
# 既存の設定のシンボリックリンクを削除
sudo a2dissite 000-default.conf
# 設定ファイルの構文チェック
sudo apache2ctl configtest
# Apache 再起動
sudo systemctl restart apache2
Basic認証の設定
Basic認証の設定を追加します。
今回は以下の値で認証します。
- user(ID) =>
test-user
- PW =>
test-pass
.htpasswdファイルの作成
.htpasswd
ファイルを作成します。
# コマンドがあるか確認
which htpasswd
/usr/bin/htpasswd
# なければインストール
sudo apt install apache2-utils
# .htpasswdファイルの作成 (-c は新規作成なので初回のみでOK)
sudo htpasswd -c /etc/apache2/.htpasswd test-user
[sudo] password for admin: (まずはログイン中のユーザーのPWを入力)
New password: (test-passを入力)
Re-type new password: (test-passを再入力)
Adding password for user test-user
dev-app.conf
にBasic認証の設定を追加します。
sudo vi /etc/apache2/sites-available/dev-app.conf
ServerName dev-app.sample.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
+ # Basic認証
+ <Location />
+ AuthType Basic
+ AuthName "ID/PWを入れてください。"
+ AuthUserFile /etc/apache2/.htpasswd
+ Require valid-user
+ </Location>
# リバースプロキシ設定
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:7000/
ProxyPassReverse / http://127.0.0.1:7000/
dev-phpmyadmin.conf
にも同様の対応をします。
Apacheを再起動すればOKです。
sudo systemctl restart apache2
dev-app.sample.com
にアクセスするとBasic認証のダイアログが表示されると思います。
※Basic認証を解除したい場合は、上記コード削除すればOKです。
LaravelアプリをVPSに設置(🌏)
GitHubとssh接続の設定
上記の記事を参考にGitHubへssh接続できるようにします。
clone
cloneする場所は比較的どこでも良いのですが、今回はプロジェクトのコードはvar/www/
以下で管理します。
そのためvar/www/
以下をadmin
で操作できるように権限を変更します。
変更前 root:root
ls -al /var/www/
total 12
drwxr-xr-x 3 root root 4096 May 27 12:49 .
drwxr-xr-x 12 root root 4096 May 26 16:41 ..
drwxr-xr-x 2 root root 4096 May 26 16:41 html
権限を変更します。
sudo chown -R admin:admin /var/www
変更後 admin:admin
ls -al /var/www/
total 12
drwxr-xr-x 4 admin admin 4096 May 27 13:14 .
drwxr-xr-x 12 root root 4096 May 26 16:41 .. (親ディレクトリなので無視でOK)
drwxr-xr-x 2 admin admin 4096 May 26 16:41 html
Laravelアプリのリポジトリをdev_app
というディレクトリ名でcloneします。
cd /var/www/
git clone git@*************.git dev_app
dev環境用の設定ファイルを作成
.env.dev
ファイルを作成し、中身 (dev環境用の環境変数) はローカルからコピペする。
cd /var/www/dev_app/src
touch .env.dev
db.env
phpmyadmin.env
.gitignore
ファイルを作成し、中身 (DB接続情報) はローカルからコピペする。
cd /var/www/dev_app/docker/env/dev
touch db.env phpmyadmin.env .gitignore
コンテナ起動
compose.dev.yaml
を指定してイメージのビルド&コンテナを起動します。
cd /var/www/dev_app/docker/
docker compose -f compose.dev.yaml up --build
Laravelのセットアップ
dev_app
コンテナに入ります。
(前のセクションでコンテナを起動したので、ローカルPCからssh conohavps
で新しくログインしてから以下を行います)
cd /var/www/dev_app/docker/
docker compose -f compose.dev.yaml exec app bash
パッケージをインストールする。
composer install
npm install
プロジェクトキーを発行する。
php artisan key:generate
マイグレーションをする。
php artisan migrate
動作確認
http://dev-app.sample.com
にアクセスしてLaravelのホーム画面が表示されればOKです!
http://dev-phpmyadmin.sample.com
にアクセスしてphpMyAdminが表示されればOKです!
コンテナをバックグラウンド実行にしておく
cd /var/www/dev_app/docker/
Ctrl + C # でコンテナを停止
docker compose -f compose.dev.yaml up -d
まとめ
今回はVPSでコンテナを起動しました!
次はGitHubActionsでデプロイします。
- [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
- [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
- [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する (←今ここ)
- [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする (←次を見る)
- [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定
Discussion