====== 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/