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/