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でのポートの公開と公開について学びました。

また、公開されたポートはコンテナ化されたアプリケーションに関するメタデータであるのに対し、ポートの公開はホストからアプリケーションにアクセスする方法であることも説明しました。