Dockerとコンテナ技術 その15:コンテナにポート番号を紐付けしアクセスする

コンテナに外部からアクセスする際には、ポート番号を指定して通信を行う必要があります。
今回の記事ではコンテナへ外部からアクセスするためのポートの紐付けについてまとめていきます。

ポート番号とコンテナの紐付け

コンテナとポート番号

まず最初にポート番号について簡単に説明します。
ポート番号とは、通信を行う際にそのコンピュータ上のどのアプリに接続するのかを示すために振り分けられている番号のことです。
通信を行う際は以下の例のようにコンピュータを示すIPアドレスの後に付随してポート番号を指定します。

例:192.168.1.100:8080 ・・・ [IPアドレス]:[ポート番号]という形式で通信先を指定する

コンテナ上のアプリにアクセスする際も、コンテナ上で起動しているどのアプリに接続するのかを指定するためにポート番号を振り分ける必要があります。
コンテナにポート番号を振り分けるには、dockerコマンドで-pオプションを使用して指定する方法や、設定ファイルであるdocker-compose.yamlで指定する方法などがあります。

ホストマシンとコンテナでのポート番号の紐付け

コンテナに対してポート番号を振り分けるとコンテナに対してリクエストを送る際はそのポート番号を指定することでコンテナへアクセスすることができるようになります。
ただ、これだけでは外部からアクセスすることはできません。
コンテナはホストマシン上で動いているため、外部からアクセスする場合はホストマシンのIPアドレスを指定する必要がありますが、コンテナはあくまで内部で独立した環境であるためそのままコンテナのポート番号を指定することはできません。
そこで、ホストマシンに送られてくるコンテナへのアクセスを行うために、ホストマシン上のポート番号をコンテナのポート番号に紐付ける必要があるのです。
イメージとしては以下の図のようになります。

今回のメインの内容としては赤い吹き出しの部分になります。

実際にやってみる

ポート番号を指定してコンテナを起動

では、コマンドを使って実際にコンテナのポート番号指定とホストのポート番号への紐付けを実施してみます。
ポート番号の設定は以下のコマンドで実施することができます。

docker container run -p [ホストポート番号]:[コンテナポート番号] [イメージ]

今回はDocker HubにアップされているHTTPサーバのイメージであるnginxを利用してコンテナを作成し、それに対してポート番号の紐付けを行なっていきます。
以下のコマンドをターミナル上で実行してください。

docker container run -p 3000:80 --rm nginx

実行後は以下のような表示になります。

これにより、ホストマシンのポート3000に対するアクセスはコンテナへ転送されることになります。

ブラウザからコンテナにアクセス

では、先ほど作成したコンテナにブラウザからアクセスしてみましょう。
任意のブラウザを開いて、以下のURLにアクセスしてください。

http://localhost:3000/

localhostは自分自身にアクセスする際に使います。
つまり、このURLは自分自身のポート3000のアプリにアクセスすることを意味しており、ポート3000はコンテナのポート80と紐付いているため、コンテナへのアクセスをすることになります。

URLにアクセスすると、以下のようなngnxでデフォルトで用意されているページが表示されます。

これで、ポート番号の紐付けが成功し、コンテナにアクセスできることが確認できました。

ポート番号の紐付けを確認する

起動しているコンテナのポート番号はdocker container lsコマンドから確認することができます。

PORTSという項目に0.0.0.0:3000->80/tcpとあります。
これはホストマシンの3000というポート番号がコンテナの80というポート番号に紐付いていることを表しています。

まとめ

今回はホストマシンとコンテナのポート番号を紐付け、コンテナへの外部からのアクセスを実施する方法についてまとめました。
ポート番号を指定する方法はコマンドだけでなく、docker-compose.yamlで指定する方法などもありますので是非調べてみてください。
ここまで読んでいただきありがとうございました。
それでは、また。