Chapter 17

3部: ポート

ほげさん
ほげさん
2022.03.21に更新

コンテナにホストマシンからアクセスするために、ポートの公開について学びます。

これでやっとブラウザから App コンテナと Mail コンテナの Web サーバにアクセスできるようになります。

全体構成とハイライト

image

やることの確認

やること できるようになること
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コマンドで再現できる
Mail イメージを選定 ✅ SMTP サーバが起動できる
✅ Web サーバが起動できる
Mail コンテナを起動 ✅ Web サーバが起動できる
✅ SMTP サーバが起動できる
Mail 👉 コンテナのポートを公開 ブラウザからアクセスできる
Mail コンテナをネットワークに接続
コンテナにエイリアスを設定
App コンテナからホスト名で接続できる
Mail 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 ポートにマッピングします。

Host Machine
$ 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 を開くことができます。

image

Mail Form 画面も開きます。

image

正しく表示されない場合は、--detach オプションを外して出力をよく確認したり、コンテナに配置されている設定ファイルを bash を使って確認したりしてください。

せっかくブラウザから操作できるようになりましたが、Mail FormSend ボタンはまだメールを送信できませんし、

image

Mail History 画面はまだ開けません。

image

Mail コンテナと DB コンテナにはまだ接続できないからです。

ホストマシン - コンテナ の通信はできるようにはなりましたが、コンテナ - コンテナ の通信は ポートの公開では解決できません
これは 【 3部: ネットワーク 】で対応します。

Mail コンテナの Web サーバのポートを公開する

Mail コンテナにも Web サーバがあるので、同じようにポートを公開しておきましょう。

Mail コンテナでは Web サーバ ( 8025 ポート ) と SMTP サーバ ( 1025 ポート ) を起動していますが、公開するのは 8025 ポートだけです。
SMTP サーバ ( 1025 ポート ) を公開しないのは、ホストマシンからメールを送信するつもりはないからです。

こちらもポートの衝突を避けるために適当にずらし、18025 にマッピングします。

Host Machine
$ docker container run     \
    --name mail            \
    --rm                   \
    --detach               \
    --platform linux/amd64 \
    --publish 18025:8025   \
    mailhog/mailhog:v1.0.1

これで MailHog も http://localhost:18025 でアクセスできるようになりました。

もっとも、メールは一通もありませんが。

image

まとめ

このページの手順書と成果物は次のディレクトリで公開されています。

https://github.com/suzuki-hoge/docker-practice/tree/master/samples/3-6-ポート

混乱してしまったときに参考にしてください。

ポイント

  • ホストマシンからアクセス したい場合は、コンテナのポートを公開する
  • コンテナ側のポートは、起動しているサービスに合わせる
  • ホストマシン側のポートは、衝突しないように自分で決める

できるようになったことの確認

やること できるようになること
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コマンドで再現できる
Mail イメージを選定 ✅ SMTP サーバが起動できる
✅ Web サーバが起動できる
Mail コンテナを起動 ✅ Web サーバが起動できる
✅ SMTP サーバが起動できる
Mail 👉 コンテナのポートを公開 ✅ ブラウザからアクセスできる
Mail コンテナをネットワークに接続
コンテナにエイリアスを設定
App コンテナからホスト名で接続できる
Mail Docker Compose 化 これらを1コマンドで再現できる
ほか ボリュームを作成 ✅ マウントする準備ができる
ほか ネットワークを作成 コンテナを接続する準備ができる

image

次のページに進む前に

起動オプションをどんどん増やしていくため、このページで起動したコンテナは終了します。

Host Machine
$ docker container rm --force \
    app mail
脚注
  1. たとえば僕のマシンではすでに Zenn のプレビューが 8000 を使っています。 ↩︎