====== Docker on Linux 上での開発環境の構築 ======
===== ホストに接続するか?コンテナに接続するか? =====
vscode からのリモートホストへは SSH 経由となるが、デバッグ対象のアプリケーションコンテナに接続するか、リモートホスト自体に接続するかで、構成などが大きく異なってくる。
* 所属の異なる不特定多数のユーザーにサービスする場合は直接コンテナに接続させ、他のユーザーとの境界を明確にする(これが必要になる事業は恐らく行わない)
* 個人または特定企業専用のホストであれば、ホストに接続した方が運用が楽
* アプリケーション用コンテナだけでなく、DB 用コンテナ等のメンテナンスも必要なため
* VSCode がリモートホストに SSH 接続する際、ホストのサービスポートをローカルに転送する設定を .ssh/config に書いておく.
* LocalForward 81 localhost:81 # ローカル 81 番ポートへの接続はローカル側の転送でリモートの 81 番ポートへ転送
===== Xdebug はまりポイント =====
* **docker.host.internal ではなく host.docker.internal**
* **host.docker.internal は Docker Desktop for windows/mac 用の設定なので、linux 上の docker では名前解決できない !**
* **linux 上の Docker では 172.17.0.1 が常にホストのアドレスとなる.**
* はまったときは xdebug のログ出力設定を行い、デバッグセッションの接続状況を調査すると良い. xdebug.log および xdebug.log_level の設定を行い、コンテナ再起動.
* パスマッピングの間違いがあっても、ブレイクポイントでストップしない. 今回は間違いやすいパスマッピングを不要にする設定方法を試行.
===== 環境構築を楽にする工夫 =====
* マウントするホストのソースディレクトリ構成と、コンテナ内部のディレクトリ構成を同じにする. これにより VSCode の launch.json 上でパスマッピングの記述が不要になる.
===== 異なる docker-compose.yml のサービスを共有する =====
* プロジェクト毎にデータベースコンテナを起動するのは大変なので、バックエンドサービスのネットワークを共有したい。
* バックエンドサービス (mariadb) の docker-compose で作成されるネットワークをフロントエンドサービスで共有する
==== docker-compose.yml (mariadb) ====
version: "3.3"
services:
mariadb:
build: ./
volumes:
- ../data/mariadb:/var/lib/mysql
networks:
- backend
environment:
MYSQL_ROOT_PASSWORD: "password"
networks:
backend:
==== docker-compose.yml (php74) ====
version: '3'
services:
php74:
networks:
default:
external:
name: mariadb105_backend
===== ディレクトリ構成 =====
* 各種ソースリポジトリは /var/repos 以下に配置し、これをそのままコンテナ内の同じパスにボリュームマウントする!
* それぞれのプロジェクトはすべて Git 管理する.
* いったん作成したコンテナイメージは、リビルドしても同じものが作れないことがあるため、必ず Docker レジストリに登録しておくこと!
/var/repos/
$ME/
containers/ # コンテナの作成・テスト用リポジトリ
debian9-php74/
debian10-php74/
mariadb10.5/
devenv/ # 開発環境用の起動設定はここで行う
docker-compose.yml
project_?.conf # nginx のサイト設定ファイル等プロジェクト毎に固有の設定
project_a.conf
project_b.conf
project_c.conf
project_d.conf
$USER1/
$PROJECT_A/
$PROJECT_B/
$USER2/
$PROJECT_C/
$PROJECT_D/
data/ # DB等、永続化が必要な
mariadb/