コンテナにホストマシンからアクセスするために、ポートの公開について学びます。
これでやっとブラウザから App コンテナと Mail コンテナの Web サーバにアクセスできるようになります。
全体構成とハイライト
やることの確認
\ | やること | できるようになること |
---|---|---|
App | イメージをビルド | ✅ PHP が準備できる ✅ メール送信が準備できる |
App | コンテナを起動しビルド結果を確認 Web サーバを起動 |
✅ Dockerfile の妥当性が確認できる ✅ Web サーバが起動できる |
App | ソースコードをバインドマウント | ✅ ホストマシンの .php 編集が即反映される |
App | 👉 コンテナのポートを公開 | ブラウザからアクセスできる |
App | コンテナをネットワークに接続 データベースサーバの接続設定 メールサーバの接続設定 |
DB コンテナに接続できる Mail コンテナに接続できる |
App | Docker Compose 化 | これらを1コマンドで再現できる |
DB | イメージをビルド | ✅ 文字コードとログの設定ができる |
DB | 環境変数を指定してコンテナを起動 | ✅ Dockerfile の妥当性が確認できる ✅ MySQL サーバが起動できる ✅ ユーザとデータベースを作成できる |
DB | データ置場にボリュームをマウント | ✅ テーブルがコンテナ削除で消えなくなる |
DB | 初期化クエリをバインドマウント | ✅ コンテナ起動時にテーブルが作成される |
DB | コンテナをネットワークに接続 コンテナにエイリアスを設定 |
App コンテナからホスト名で接続できる |
DB | Docker Compose 化 | これらを1コマンドで再現できる |
イメージを選定 | ✅ SMTP サーバが起動できる ✅ Web サーバが起動できる |
|
コンテナを起動 | ✅ Web サーバが起動できる ✅ SMTP サーバが起動できる |
|
👉 コンテナのポートを公開 | ブラウザからアクセスできる | |
コンテナをネットワークに接続 コンテナにエイリアスを設定 |
App コンテナからホスト名で接続できる | |
Docker Compose 化 | これらを1コマンドで再現できる | |
ほか | ボリュームを作成 | ✅ マウントする準備ができる |
ほか | ネットワークを作成 | コンテナを接続する準備ができる |
このページで初登場する構築のコマンドとオプション
コンテナを起動する - container run
オプション | 意味 | 用途 |
---|---|---|
-p, --publish |
コンテナのポートを ホストマシンに公開する |
ホストマシンからコンテナ内の サーバにアクセスする |
ポートの公開とは
コンテナはホストマシンから隔離されており、コンテナ内で Web サーバや DB サーバを起動してもそのままではホストマシンからアクセスすることはできません。
Web サーバなどいわゆるパブリックネットワークに置くようなコンテナでは、その問題を解決するために ホストマシンに対して ポートの公開を行うことになります。
構築
App コンテナの Web サーバのポートを公開する
App コンテナでは PHP のビルトインウェブサーバーが 8000
ポートで起動しています。
この 8000
ポートをコンテナ起動時に公開することで、ホストマシンからビルトインウェブサーバーにアクセスできるようになります。
公開ポートは --publish host-machine:container
の形式でマッピングします。
このとき host-machine
側のポートは起動する人が自由に決めます が、1024 未満のポートは特権ポートと呼ばれるあらかじめ用途が決められているポートなるので避けておくのが無難です。
コンテナの 8000
ポートをホストマシンの 8000
ポートに割り当てることも可能ですが、8000
ポートは使われていることが多い[1]ので今回は 18000
ポートにマッピングします。
$ docker container run \
--name app \
--rm \
--detach \
--interactive \
--tty \
--mount type=bind,src=$(pwd)/src,dst=/src \
--publish 18000:8000 \
docker-practice:app \
php -S 0.0.0.0:8000 -t /src
ポートが公開できたことを確認する
ここまでの設定と操作が全てうまくいっていれば、やっとブラウザから http://localhost:18000 を開くことができます。
Mail Form
画面も開きます。
正しく表示されない場合は、--detach
オプションを外して出力をよく確認したり、コンテナに配置されている設定ファイルを bash
を使って確認したりしてください。
せっかくブラウザから操作できるようになりましたが、Mail Form
の Send
ボタンはまだメールを送信できませんし、
Mail History
画面はまだ開けません。
Mail コンテナと DB コンテナにはまだ接続できないからです。
ホストマシン - コンテナ の通信はできるようにはなりましたが、コンテナ - コンテナ の通信は ポートの公開では解決できません。
これは 【 3部: ネットワーク 】で対応します。
Mail コンテナの Web サーバのポートを公開する
Mail コンテナにも Web サーバがあるので、同じようにポートを公開しておきましょう。
Mail コンテナでは Web サーバ ( 8025
ポート ) と SMTP サーバ ( 1025
ポート ) を起動していますが、公開するのは 8025
ポートだけです。
SMTP サーバ ( 1025
ポート ) を公開しないのは、ホストマシンからメールを送信するつもりはないからです。
こちらもポートの衝突を避けるために適当にずらし、18025
にマッピングします。
$ docker container run \
--name mail \
--rm \
--detach \
--platform linux/amd64 \
--publish 18025:8025 \
mailhog/mailhog:v1.0.1
これで MailHog も http://localhost:18025 でアクセスできるようになりました。
もっとも、メールは一通もありませんが。
まとめ
このページの手順書と成果物は次のディレクトリで公開されています。
混乱してしまったときに参考にしてください。
ポイント
- ホストマシンからアクセス したい場合は、コンテナのポートを公開する
- コンテナ側のポートは、起動しているサービスに合わせる
- ホストマシン側のポートは、衝突しないように自分で決める
できるようになったことの確認
\ | やること | できるようになること |
---|---|---|
App | イメージをビルド | ✅ PHP が準備できる ✅ メール送信が準備できる |
App | コンテナを起動しビルド結果を確認 Web サーバを起動 |
✅ Dockerfile の妥当性が確認できる ✅ Web サーバが起動できる |
App | ソースコードをバインドマウント | ✅ ホストマシンの .php 編集が即反映される |
App | 👉 コンテナのポートを公開 | ✅ ブラウザからアクセスできる |
App | コンテナをネットワークに接続 データベースサーバの接続設定 メールサーバの接続設定 |
DB コンテナに接続できる Mail コンテナに接続できる |
App | Docker Compose 化 | これらを1コマンドで再現できる |
DB | イメージをビルド | ✅ 文字コードとログの設定ができる |
DB | 環境変数を指定してコンテナを起動 | ✅ Dockerfile の妥当性が確認できる ✅ MySQL サーバが起動できる ✅ ユーザとデータベースを作成できる |
DB | データ置場にボリュームをマウント | ✅ テーブルがコンテナ削除で消えなくなる |
DB | 初期化クエリをバインドマウント | ✅ コンテナ起動時にテーブルが作成される |
DB | コンテナをネットワークに接続 コンテナにエイリアスを設定 |
App コンテナからホスト名で接続できる |
DB | Docker Compose 化 | これらを1コマンドで再現できる |
イメージを選定 | ✅ SMTP サーバが起動できる ✅ Web サーバが起動できる |
|
コンテナを起動 | ✅ Web サーバが起動できる ✅ SMTP サーバが起動できる |
|
👉 コンテナのポートを公開 | ✅ ブラウザからアクセスできる | |
コンテナをネットワークに接続 コンテナにエイリアスを設定 |
App コンテナからホスト名で接続できる | |
Docker Compose 化 | これらを1コマンドで再現できる | |
ほか | ボリュームを作成 | ✅ マウントする準備ができる |
ほか | ネットワークを作成 | コンテナを接続する準備ができる |
次のページに進む前に
起動オプションをどんどん増やしていくため、このページで起動したコンテナは終了します。
$ docker container rm --force \
app mail
-
たとえば僕のマシンではすでに Zenn のプレビューが
8000
を使っています。 ↩︎