😸
コンテナで試すポートフォワード
ホストからコンテナ内部にアクセスしようとした際に ポートフォワード
という言葉を知ったのでまとめます。
環境は公式の nginx イメージを用いて構築します。
ポートフォワードとは
ポートフォワードとはポートの紐付けです。
コンテナのような仮想環境を利用する際には、ホスト側からアクセスするためにポートを紐づける必要があります。
今回は勉強がてら Docker で色々試してみます。
コンテナを立ち上げる
nginx イメージを pull してきてコンテナを立ち上げます。
-p
オプションで 外部からアクセスされるポート番号:コンテナ側のポート番号
を指定しています。
今回の設定では外部から8080
でアクセスするとコンテナ内の80
ポートに繋がります。
$ docker pull nginx
$ docker run --name test_nginx -d -p 8080:80 nginx
docker ps
コマンドでポートが紐付けられていることを確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28eed2781fab nginx "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 0.0.0.0:8080->80/tcp test_nginx
アクセスしてみる
curl
コマンドを叩くとレスポンスが返ってきます。
$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ブラウザでアクセスしても確認できます。
何が起きたか?
ホストマシンからポート 8080 でアクセスすると、nginx のポート 80 にフォワードされたため、localhost:8080
に対してレスポンスが返ってきました。
ポート番号を変更してみる
ホスト側のポート番号を8081
に変更してみます。
$ docker run --name test2_nginx -d -p 8081:80 nginx
curl
コマンドを叩いてみましょう。
$ curl localhost:8081
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
ちゃんとレスポンスが返ってきます。
ホスト側のポート番号を設定しないとどうなるか?
ホスト側のポート番号を設定しない場合、よしなに空いているポート番号を割り振って、そのポート番号と紐付けを行ってくれます。
$ docker run --name test3_nginx -d -p 80 nginx
docker ps
で確認してみると、51998
というポート番号が割り振られていました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5421c7bcb48f nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:51998->80/tcp test3_nginx
Discussion