Docker プライマリ ネットワーク ポート マッピング構成

Docker プライマリ ネットワーク ポート マッピング構成

ポートマッピング

Docker コンテナを起動する前にポート マッピングを行わないと、コンテナ外部のネットワーク経由でコンテナ内のネットワーク アプリケーションやサービスにアクセスできません。一部のネットワーク アプリケーションやサービスはコンテナ内で実行されることが多いため、コンテナ外のネットワークを介してコンテナ内のネットワーク アプリケーションやサービスにアクセスする場合は、コンテナにポートをマップする必要があります。docker docker runコマンドで-Pまたは-pオプションを使用してポートをマップできます。

ランダムポートマッピング

docker runコマンドの-Pオプションを使用してポート マッピングを実行すると、Docker はコンテナーによって開かれたネットワーク ポートにポートをランダムにマッピングします。

nginx例にとると、まずnginxイメージをプルします。

[root@izoq008ryseuupz ~]# docker イメージをプル nginx
デフォルトタグの使用: 最新
最新: library/nginx からプル
852e50cd189d: すでに存在します 
571d7e852307: プル完了 
addb10abd9cb: プル完了 
d20aa7ccdb77: プル完了 
8b03f1e11359: プル完了 
ダイジェスト: sha256:6b1daa9462046581ac15be20277a7c75476283f969cb3a61c8725ec38d3b01c3
ステータス: nginx:latest の新しいイメージをダウンロードしました
docker.io/ライブラリ/nginx:最新
[root@izoq008ryseuupz ~]# docker イメージ
リポジトリ タグ イメージ ID 作成 サイズ
nginx 最新 bc9a0695f571 2日前 133MB

次に、 nginxイメージを使用してコンテナnginx.1を作成し、 -Pオプションを使用してランダム ポート マッピングを実行します。

[root@izoq008ryseuupz ~]# docker run -itd -P --name nginx.1 nginx
91e3c7ed957f8196fd631eb7bce21acaa96bc253551303ecba2bf193201284ba

docker ps -lコマンドを実行すると、ローカル ホストのポート32775がコンテナーのポート80にマッピングされていることがわかります。このとき、コンテナ内のnginxアプリケーションが提供するインターフェースにアクセスするには、ローカル ホストのポート32775にアクセスします。

[root@izoq008ryseuupz ~]# docker ps -l
コンテナID イメージ コマンド 作成ステータス ポート名
91e3c7ed957f nginx "/docker-entrypoint.…" 17 分前 5 秒前に起動 0.0.0.0:32775->80/tcp nginx.1

ここに画像の説明を挿入

docker logs nginx.1コマンドを実行すると、コンテナ内のnginxアプリケーションが提供するインターフェースにブラウザでアクセスした記録を確認できます。

[root@izoq008ryseuupz ~]# docker は nginx.1 をログに記録します
...
111.8.49.168 - - [2020/11/27:09:03:53 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"
2020/11/27 09:03:53 [エラー] 21#21: *1 open() "/usr/share/nginx/html/favicon.ico" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 111.8.49.168、サーバー: localhost、リクエスト: "GET /favicon.ico HTTP/1.1"、ホスト: "ip:32775"、リファラー: "http://ip:32775/"
111.8.49.168 - - [2020/11/27:09:03:53 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://ip:32775/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"

ポートマッピングの指定

ポート マッピングを指定するには、 docker runコマンドで-pオプションを使用します。ローカル ホストのポート8083コンテナーのポート80にマップします。

[root@izoq008ryseuupz ~]# docker run -itd -p 8083:80 --name nginx.2 nginx
0e62792a194559bf33c2b39f70b64133cb89a48846278ccee651fda68aa6dad1
[root@izoq008ryseuupz ~]# docker ps -l
コンテナID イメージ コマンド 作成ステータス ポート名
0e62792a1945 nginx "/docker-entrypoint.…" 6 秒前 5 秒前に起動 0.0.0.0:8083->80/tcp nginx.2

このとき、コンテナ内のnginxアプリケーションが提供するインターフェースにアクセスするには、ローカル ホストのポート8083にアクセスします。

ここに画像の説明を挿入

docker logs nginx.2コマンドを使用すると、コンテナ内のnginxアプリケーションが提供するインターフェースにブラウザでアクセスした記録も確認できます。

[root@izoq008ryseuupz ~]# docker は nginx.2 をログに記録します
...
111.8.49.168 - - [2020/11/27:09:28:32 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"
2020/11/27 09:28:32 [エラー] 28#28: *1 open() "/usr/share/nginx/html/favicon.ico" が失敗しました (2: そのようなファイルまたはディレクトリはありません)、クライアント: 111.8.49.168、サーバー: localhost、リクエスト: "GET /favicon.ico HTTP/1.1"、ホスト: "ip:8083"、リファラー: "http://ip:8083/"
111.8.49.168 - - [2020/11/27:09:28:32 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://ip:8083/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36" "-"

docker psコマンドを使用すると、以前に作成した 2 つのコンテナのポート マッピングが両方ともローカル ホストの0.0.0.0にあることがわかります。

[root@izoq008ryseuupz ~]# docker ps
コンテナID イメージ コマンド 作成ステータス ポート名
0e62792a1945 nginx "/docker-entrypoint.…" 7 分前 7 分前にアップ 0.0.0.0:8083->80/tcp nginx.2
91e3c7ed957f nginx "/docker-entrypoint.…" 53 分前 36 分前に起動 0.0.0.0:32775->80/tcp nginx.1

インターネット上の0.0.0.0の説明

まず、 0.0.0.0にはpingできません。サーバーでは、 0.0.0.0は実際の IP アドレスではなく、ローカル マシン内のすべての IPv4 アドレスを表します。ポート0.0.0.0をリッスンすることは、ローカル マシン内のすべての IP のポートをリッスンすることを意味します。

C:\Users\Kaven>ping 0.0.0.0

32 バイトのデータで 0.0.0.0 に ping を実行しています:
PING: 送信に失敗しました。よくある不具合。
PING: 送信に失敗しました。よくある障害。
PING: 送信に失敗しました。よくある障害。
PING: 送信に失敗しました。よくある障害。

0.0.0.0 の Ping 統計:
  パケット: 送信 = 4、受信 = 0、損失 = 4 (100% 損失)、

指定されたアドレスの指定されたポートマッピング

ip:hostPort:containerPortの形式を使用して、指定されたポートを指定されたアドレス127.0.0.1:8083など) にマッピングできます。

[root@izoq008ryseuupz ~]# docker stop nginx.2
nginx.2
[root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.1:8083:80 --name nginx.3 nginx
a20b18b97fa4bf7576f6a0d769394a390cfb64ad5fc895453b548bf3f75105ca
[root@izoq008ryseuupz ~]# docker ps -l
コンテナID イメージ コマンド 作成ステータス ポート名
a20b18b97fa4 nginx "/docker-entrypoint.…" 4 秒前 4 秒前に起動 127.0.0.1:8083->80/tcp nginx.3

docker inspect nginx.3コマンドを使用してポート マッピング情報を表示することもできます。

      「ポート」: {
        "80/tcp": [
          {
            "ホストIP": "127.0.0.1",
            "ホストポート": "8083"
          }
        ]
      }

次のコマンドは、デフォルトで0.0.0.0使用するためコンテナーを起動できません。そのため、エラー メッセージ「 address already in useが表示されます。

docker run -itd -p 8083:80 --name nginx.4 nginx
[root@izoq008ryseuupz ~]# docker run -itd -p 8083:80 --name nginx.4 nginx
a5211ec678440044945e4d6f16fe59f3ac10367192262768096e7b748ebd027c
docker: デーモンからのエラー応答: ドライバーはエンドポイント nginx.4 での外部接続のプログラミングに失敗しました (809bed1de2bb89f5d54b5b200503701279a153e60dac08b93e13af8c40a02e36): ユーザーランド プロキシの開始エラー: listen tcp 0.0.0.0:8083: bind: アドレスは既に使用されています。

次のコマンドでコンテナを起動できます。

docker run -itd -p 127.0.0.2:8083:80 --name nginx.5 nginx
[root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.2:8083:80 --name nginx.5 nginx
f60dcb586968471e7a8127ccef4cb4e89c4198df748da404f78afaff4afa42de

docker ps -aコマンドを使用すると、すべてのコンテナに関する情報を確認できます。

[root@izoq008ryseuupz ~]# docker ps -a
コンテナID イメージ コマンド 作成ステータス ポート名
f60dcb586968 nginx "/docker-entrypoint.…" 19 秒前 18 秒前に起動 127.0.0.2:8083->80/tcp nginx.5
a5211ec67844 nginx "/docker-entrypoint.…" 2 分前 nginx.4 を作成しました
a20b18b97fa4 nginx "/docker-entrypoint.…" 7 分前 7 分前に起動 127.0.0.1:8083->80/tcp nginx.3
0e62792a1945 nginx "/docker-entrypoint.…" 29 分前 終了 (0) 7 分前 nginx.2
91e3c7ed957f nginx "/docker-entrypoint.…" 約 1 時間前 58 分前に起動 0.0.0.0:32775->80/tcp nginx.1

指定されたアドレスのランダムポートマッピング

ip::containerPortの形式を使用して、ランダム ポートを指定されたアドレス127.0.0.1のランダム ポートなど) にマップできます。

[root@izoq008ryseuupz ~]# docker run -itd -p 127.0.0.1::80 --name nginx.6 nginx
396b7d9e64c047187c0391485ba1d275587d86409573e882bc68a9357dfcb6f2
[root@izoq008ryseuupz ~]# docker ps -l
コンテナID イメージ コマンド 作成ステータス ポート名
396b7d9e64c0 nginx "/docker-entrypoint.…" 9 秒前 9 秒前に起動 127.0.0.1:32768->80/tcp nginx.6

Docker が127.0.0.1のポート32768をコンテナのポート80にマッピングし、このポート32768 Docker によってランダムに割り当てられていることがわかります。

複数のポートマッピング

複数のポートをマップするには、複数の-pオプションを使用します。

[root@izoq008ryseuupz ~]# docker run -itd -p 9091:9091 -p 9092:8080 -p 9093:8083 --name nginx.8 nginx
5ac6438dcc2a2d1b7f668eb10d8285085c396a44f896aae0b3dc09935e4e95eb
[root@izoq008ryseuupz ~]# docker ps -l
コンテナID イメージ コマンド 作成ステータス ポート名
5ac6438dcc2a nginx "/docker-entrypoint.…" 6 秒前 4 秒前に起動 80/tcp、0.0.0.0:9091->9091/tcp、0.0.0.0:9092->8080/tcp、0.0.0.0:9093->8083/tcp nginx.8

ポートマッピング構成の表示

docker portコマンドを使用すると、コンテナのポート マッピング構成を表示できます。

[root@izoq008ryseuupz ~]# docker ポート nginx.6 80
127.0.0.1:32768
[root@izoq008ryseuupz ~]# docker ポート nginx.5 80
127.0.0.2:8083
[root@izoq008ryseuupz ~]# docker ポート nginx.3
80/tcp -> 127.0.0.1:8083
[root@izoq008ryseuupz ~]# docker ポート nginx.8
8080/tcp -> 0.0.0.0:9092
8083/tcp -> 0.0.0.0:9093
9091/tcp -> 0.0.0.0:9091

これで、Docker コンテナのポート マッピングの紹介は終わりです。

Docker のプライマリ ネットワーク ポート マッピングの構成に関するこの記事はこれで終わりです。Docker ポート マッピングに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Docker ポート マッピングと外部アクセス不可の問題
  • Docker ポート マッピングを使用してネットワーク アクセスを実現する方法
  • Dockerは複数のポートマッピングコマンドを有効にします
  • Dockerボリュームのファイルマッピング方法
  • Docker ファイルの保存パス、ポート マッピング操作モードの変更
  • 実行中のDockerコンテナのポートマッピングを変更する方法
  • Dockerはポートマッピングを設定しますが、ソリューションにアクセスできません

<<:  Chrome をクラッシュさせる CSS コードの行

>>:  JSはBaidu Newsナビゲーションバーの効果を実現

推薦する

CSSアニメーションを使用して背景のシームレスな無限ループを実装する例

1. 需要絵が左から右へ無限ループで動く2. コードモバイルデバイスに適用されているため、rem 単...

VMware vCenter の不正な任意ファイルアップロードの脆弱性 (CVE-2021-21972) について

背景CVE-2021-21972 VMware vCenter における認証されていないコマンド実行...

Dockerコンテナのエクスポートとインポートの例

目次DockerコンテナのエクスポートDockerコンテナのインポ​​ートこの記事では主に、コンテナ...

ミニプログラムカスタムタブバーコンポーネントのカプセル化

この記事の例では、ミニプログラムのカスタムタブバーコンポーネントをカプセル化するための具体的なコード...

一定期間の日ごと、時間ごとの統計データを取得するMySQLの詳しい説明

毎日の統計情報を取得するプロジェクトを実行する際、プロジェクト ログを分析する必要があります。要件の...

JS 非同期コードユニットテストの魔法 Promise

目次序文プロミスチェーンMDN エラー連鎖デフォルト処理略語非同期待機序文この記事を書いた理由は、ユ...

HTML に埋め込まれた Flash HTML ウェブページ コードに Flash ファイルを埋め込むソリューション (パート 1)

中国の習慣では、旧暦の1月15日より前に新年を祝います。ここで、庭にいる友人たちに新年の幸せを祈りた...

vue cli で env を使用するガイド

目次序文紹介-公式設定例序文vueCli を使用してプロジェクトを開発したことのある方は、少しがっか...

検索ボックスと検索ボタンの境界線が重なり合わない問題を解決

今日、Baiduのページで練習していたところ、検索ボックスとボタンの余白とパディングの値が0に設定さ...

vue の v-for ディレクティブはリストのレンダリングを完了します

目次1. リストの走査2. Vueにおけるキーの役割3. リストフィルタリングこの記事では、Vue ...

Flex レイアウトで適応型ページを作成する (構文と例)

Flex レイアウトの紹介英語の Flex はフレキシブル ボックス、つまり伸縮性のあるボックスを...

js キャンバスはスライダー検証を実現します

この記事の例では、スライダー検証を実装するためのjsキャンバスの具体的なコードを参考までに共有してい...

Linux システムをバックアップする docker コマンドの詳細な説明

tar バックアップ システム sudo tar cvpzf backup.tgz --exclud...

MySQL MVCCメカニズム原理の詳細な説明

目次MVCCとはMySQL ロックとトランザクション分離レベルMySQL 元に戻すログMVCCの実装...

docker-compose が遅すぎる場合の解決策の詳細な説明

解決策はただ一つ、ソースを変更することです。 github からのソースは基本的にタイムアウトするの...