Dockerでの「公開」と「公開」の違い
1. 概要
Dockerでは、コンテナー化されたアプリケーションがリッスンしているポートを知ることが重要です。 また、コンテナの外部からアプリケーションにアクセスする方法も必要です。
これらの懸念に対処するために、Dockerではポートを公開および公開できます。
この記事では、ポートの公開と公開の両方について学習します。 例として、単純なNginxWebサーバーコンテナーを使用します。
2. ポートの公開
公開されたポートは、コンテナ化されたアプリケーションに関するメタデータの一部です。 ほとんどの場合、これはアプリケーションがリッスンしているポートを示します。 Docker自体は公開されたポートでは何もしません。 ただし、コンテナを起動すると、ポートを公開するときにこのメタデータを使用できます。
2.1. Nginxで公開する
NginxWebサーバーを使用してこれを試してみましょう。
Nginxの公式Dockerfileを見ると、次のコマンドでポート80が公開されていることがわかります。
EXPOSE 80
ポート80は、 http プロトコルのデフォルトのポートであるため、ここで公開されています。 ローカルマシンでNginxコンテナを実行し、ポート80を介してアクセスできるかどうかを確認してみましょう。
$ docker run -d nginx
上記のコマンドは、Nginxの最新のイメージを使用して、コンテナーを実行します。 次のコマンドを使用して、Nginxコンテナが実行されていることを再確認できます。
$ docker container ls
このコマンドは、Nginxを含むすべての実行中のコンテナーに関する情報を出力します。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cbc2f10f787f nginx "/docker-entrypoint..." 15 seconds ago Up 15 seconds 80/tcp dazzling_mclean
ここでは、ポートセクションの下に80が表示されています。 ポート80が公開されているため、 localhost:80 (または localhost )にアクセスするとNginxのデフォルトページが表示されると思われるかもしれませんが、そうではありません。
$ curl http://localhost:8080
... no web page appears
ポートは公開されていますが、Dockerはポートをホストに公開していません。
2.2. ポートを公開する方法
Dockerでポートを公開する主な方法は2つあります。 Dockerfile で、EXPOSEコマンドを使用してこれを行うことができます。
EXPOSE 8765
または、コンテナの実行時に –expose オプションを使用してポートを公開することもできます:
$ docker run --expose 8765 nginx
3. ポートの公開
Dockerホストを介してコンテナポートにアクセスできるようにするには、それを公開する必要があります。
3.1. Nginxで公開
マップされたポートでNginxを実行してみましょう:
$ docker run -d -p 8080:80 nginx
上記のコマンドは、ホストのポート8080をコンテナのポート80にマップします。 オプションの一般的な構文は次のとおりです。
-p <hostport>:<container port>
localhost:8080 に移動すると、Nginxのデフォルトのウェルカムページが表示されます。
$ curl http://localhost:8080
StatusCode : 200
StatusDescription : OK
Content : <!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
... more HTML
実行中のすべてのコンテナを一覧表示しましょう。
$ docker container ls
これで、コンテナにポートマッピングがあることがわかります。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38cfed3c61ea nginx "/docker-entrypoint..." 31 seconds ago Up 30 seconds 0.0.0.0:8080->80/tcp dazzling_kowalevski
ポートセクションの下に、0.0.0.0:8080->80/tcpマッピングがあります。
Dockerは、デフォルトで追加されました 0.0.0.0 ホストのルーティング不可能なメタアドレス
3.2. コンテナアクセスの制限
ホストIPアドレスに基づいて、コンテナーへのアクセスを制限できます。すべてのインターフェース( 0.0.0.0 が行う)からのコンテナーへのアクセスを許可するのではなく、マッピング内のホストIPアドレス。
コンテナへのアクセスを127.0.0.1ループバックアドレスからのトラフィックに制限しましょう。
$ docker run -d -p 127.0.0.1:8081:80 nginx
この場合、コンテナにはホスト自体からのみアクセスできます。 これは、アドレスバインディングを含む公開用の拡張構文を使用します。
-p <binding address>:<hostport>:<container port>
4. 公開されたすべてのポートを公開する
Dockerには、公開されているすべてのポートを公開する機能があるため、公開されたポートのメタデータは、コンテナーの起動に役立ちます。
$ docker run -d --publish-all nginx
ここで、Dockerは、コンテナー内の公開されているすべてのポートをバインドして、ホスト上のランダムなポートを解放します。
このコマンドが起動するコンテナを見てみましょう。
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0a23e78732ce nginx "/docker-entrypoint..." 6 minutes ago Up 6 minutes 0.0.0.0:32768->80/tcp pedantic_curran
予想どおり、Dockerはホストからランダムなポート(この場合は32768)を選択し、公開されたポートにマップしました。
5. 結論
この記事では、Dockerでのポートの公開と公開について学びました。
また、公開されたポートはコンテナ化されたアプリケーションに関するメタデータであるのに対し、ポートの公開はホストからアプリケーションにアクセスする方法であることも説明しました。