🐘

[conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する

に公開

はじめに

Laravelで個人開発中の備忘録です。

conoha VPSにDocker + Laravel構成のローカル開発環境とVPSのdev環境とそのデプロイ機構までを作成していきますので是非ご参考ください🙌

  1. [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
  2. [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
  3. [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する (←今ここ)
  4. [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする
  5. [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

それでは以下の流れで進めいきましょう!

  1. VPS用にDocker関連のファイルの調整
  2. conoha VPSの設定
  3. conoha VPSでコンテナ起動

Docker関連のファイルの調整(💻)

ディレクトリ構成の変更

前回まで現在

.
├── compose.yaml
├── docker
│   ├── app
│   │   ├── 000-default.conf
│   │   ├── Dockerfile
│   │   └── php.ini
│   ├── db
│   │   ├── Dockerfile
│   │   └── my.cnf
│   └── phpmyadmin
│       └── Dockerfile
├── README.md
└── src
    └── (laravel)

以下のように変更します。

bash
.
 ├── 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.envphpmyadmin.env.gitignoreを作成

ディレクトリ構成の方針

環境ごとにファイルを分けたり、コンテナの環境変数をディレクトリに切り出したりすることで少しファイル数が増えます。そのため、compose.yaml系のファイルもプロジェクトルートからdocker/ディレクトリで管理しDocker関連としてまとめることにします。

docker/compose.dev.yaml

compose.local.yamlから複製したと想定し、以下修正をします。

compose.dev.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で指定していた内容を移動し修正ます。

env
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で指定していた内容を移動し修正ます。

env
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(両方)

今回は80443を通す設定にして更新します。

sudo ufw allow 'WWW Full'
sudo ufw reload

WWW FullALLOWなら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という80443を通すセキュリティグループがあるので中身を確認します。(conoha VPSのポータル画面のセキュリティグループ)

VPSに追加します。(conoha VPSのポータル画面のサーバー>ネームタグ>ネットワーク情報>セキュリティグループ)

動作確認

http://VPSのIPアドレスでアクセスしてApacheのデフォルトページが表示されればOKです。

https://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-ubuntu-20-04-ja

Dockerをインストール(🌏)

Dockerをインストールは基本的に公式サイト通り行います。

インストール

https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/debian/

まずは上記のドキュメントのリポジトリを利用したインストールの手順に従いインストールします。

一応以下のアコーディオン内に手順を記載していますが、基本的にはドキュメントのコマンドをご参照ください。

実行するコマンド

リポジトリのセットアップ

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グループに追加

https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/linux-postinstall/

上記のドキュメントにも記載されているように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
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
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
bash
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です。

https://tech.tiger-rack.co.jp/programming/linux/ubuntu_apache2command/

https://qiita.com/amenoyoya/items/cb8bea4315447baf7a81

LaravelアプリをVPSに設置(🌏)

GitHubとssh接続の設定

https://qiita.com/shizuma/items/2b2f873a0034839e47ce

上記の記事を参考に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でデプロイします。

  1. [conoha VPSにDocker + Laravel構築①] ベースのcompose.yamlを作成する
  2. [conoha VPSにDocker + Laravel構築②] VPSへSSH接続する
  3. [conoha VPSにDocker + Laravel構築③] VPSでコンテナを起動する (←今ここ)
  4. [conoha VPSにDocker + Laravel構築④] GitHubActionsでデプロイする (←次を見る)
  5. [conoha VPSにDocker + Laravel構築⑤] SSL対応 ※後日予定

Discussion