Dockerコンテナを使用してホストネットワークにアクセスする方法

Dockerコンテナを使用してホストネットワークにアクセスする方法

最近、nginx をリバース プロキシとして使用し、docker で nginx を実行するシステムが展開されました。

$ docker run -d --name nginx $PWD:/etc/nginx -p 80:80 -p 443:443 nginx:1.15

プロキシする必要がある API サービスは、ホスト マシンのポート 1234 で実行されます。nginx.conf の関連する構成は次のとおりです。

サーバー{
 ...

 場所 /api {
  プロキシパス http://localhost:1234
 }
 ...
}

その結果、アクセスしてみると常に 502 Bad Gateway エラーが報告され、エラー ログにはアップストリームに接続できないことが示されていました。

考えてみると、nginx.conf の localhost に問題があるようです。 nginx は docker コンテナ内で実行されているため、この localhost はホストの localhost ではなく、コンテナの localhost です。

この時点で、この記事が解決しようとしている問題が発生します。コンテナからホスト ネットワークにアクセスするにはどうすればよいでしょうか?インターネットを検索する方法はいくつかあります。

ホストIPを使用する

Docker をインストールすると、ホストに仮想ゲートウェイ docker0 がインストールされます。localhost の代わりに、docker0 上のホストの IP アドレスを使用できます。

まず、次のコマンドを使用してホストの IP アドレスを照会します。

$ ipアドレス表示docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue 状態 UP グループ デフォルト
  リンク/イーサ 02:42:d5:4c:f2:1e brd ff:ff:ff:ff:ff:ff
  inet 172.17.0.1/16 スコープ グローバル docker0
    valid_lft 永久 preferred_lft 永久
  inet6 fe80::42:d5ff:fe4c:f21e/64 スコープ リンク
    valid_lft 永久 preferred_lft 永久

ホストマシンの IP は 172.17.0.1 であることがわかるので、proxy_pass http://localhost:1234 を proxy_pass http://172.17.0.1:1234 に変更すると、502 Bad Gateway エラーを解決できます。

ただし、ホストマシンの IP アドレスはシステムによって異なります。たとえば、Linux では通常 172.17.0.1 ですが、macOS では 192.168.65.1 です。この IP アドレスも変更できます。したがって、IP を使用して nginx.conf を構成することは、環境間で使用できません。

ホストネットワークの使用

Docker コンテナの実行中、構成に使用できるネットワークの種類は、ホスト、ブリッジ、なしの 3 つです。デフォルトは bridge で、これはブリッジ モードでホストに接続されたブリッジ ネットワークを意味します。host はホスト ネットワークで、これはホストとネットワークを共有することを意味します。none はネットワークがないことを意味し、コンテナーはインターネットに接続できません。

コンテナがホスト ネットワークを使用する場合、コンテナとホストはネットワークを共有するため、コンテナ内でホスト ネットワークにアクセスできるようになり、コンテナのローカルホストがホストのローカルホストになります。

コンテナのホスト ネットワークを構成するには、docker で --network host を使用します。

$ docker run -d --name nginx --network ホスト nginx

上記のコマンドでは、コンテナがホストとネットワークを共有し、コンテナ内の公開ポートがホスト上の公開ポートと同じであるため、以前のように -p 80:80 -p 443:443 を使用してポートをマッピングする必要はありません。

ホストネットワークを使用する場合、nginx.conf を変更する必要がなく、localhost も引き続き使用できるため、以前の方法よりも汎用性が高くなります。ただし、ホスト ネットワークはブリッジ ネットワークほど分離されていないため、ホスト ネットワークを使用する場合のセキュリティはブリッジほど高くありません。

要約する

この記事では、ホスト IP を使用する方法と、ホスト ネットワークを使用してコンテナーからホスト ネットワークにアクセスする方法の 2 つの方法を提案します。どちらの方法にも長所と短所があります。ホスト IP を使用すると分離性は向上しますが、汎用性は低くなります。一方、ホスト ネットワークを使用すると汎用性は向上しますが、ホスト ネットワークが公開されるリスクがあります。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Dockerはコンテナとホスト間でのシェルコマンドのシームレスな呼び出しを可能にします
  • Dockerコンテナにホストディレクトリへの書き込み権限がない場合の解決策
  • Dockerコンテナがホストポートにアクセスできない場合の解決策
  • ホスト上のDockerコンテナ内でシェルまたはプログラムを実行する
  • Dockerコンテナ内でホストDocker操作を呼び出して実行する
  • dockerコンテナがIP経由でホストマシンにアクセスできない問題を解決する方法の詳細な説明
  • Dockerコンテナとホストマシン間の8時間の差の問題を解決する

<<:  MySQL ルートパスワードを変更する複数の方法 (推奨)

>>:  JavaScriptはブラウザがIEかどうかを判定します

推薦する

Nginx Rewriteモジュールを使用するいくつかのシナリオ

アプリケーションシナリオ1: ドメイン名ベースのリダイレクト会社の古いドメイン名は www.accp...

Nginx 逆生成 Mogilefs 分散ストレージ例の詳細な説明

1. 分散ストレージシステムの概要情報技術の継続的な発展により、利便性がもたらされる一方で、データ量...

Dockerコンテナを使用する簡単な例

目次1. イメージをプルする2. イメージを実行する3. コンテナ内でアプリケーションをテストする4...

Linux入力サブシステムフレームワーク原理の分析

入力サブシステムフレームワークLinux 入力サブシステムは、上から下に向かって、入力サブシステム ...

XHTML の珍しいが便利なタグ

Xhtml には、あまり使用されないが非常に便利なタグが多数あります。半分の労力で 2 倍の結果を達...

Vue3 の父子値転送に関する簡単な説明

目次父から息子へ: 1. 親コンポーネントのサブコンポーネントタグに、サブコンポーネントに渡されるデ...

JavaScript のデシェイクとスロットリングの例

目次安定スロットル: 手ぶれ防止: 一定時間内に最後のタスクのみを実行します。スロットル: 一定期間...

MySQL のあまり知られていないソート方法

序文ORDER BY 字段名升序/降序、このソートステートメントは皆さんご存知だと思いますが、特殊な...

MySQL 5.7.21 解凍版のインストールと設定方法のグラフィックチュートリアル (win10)

MySQL 5.7.21 解凍版のインストールと設定方法は参考までに。具体的な内容は以下のとおりで...

JavaScript で大きなファイルの並列ダウンロードを実装する方法

目次1. HTTP範囲リクエスト1.1 範囲構文2. 大きなファイルをダウンロードする方法2.1 補...

JavaScript配列の組み込みメソッドの詳細な説明

目次1. Array.at() 2. Array.copyWithin() 3. 配列.entrie...

MySQLはこのような更新文を決して書きません

目次序文原因現象なぜ?分析要約する序文今日は、非常に典型的な MySQL の「落とし穴」についてお話...

React コンポーネント通信ルーティングパラメータ転送 (react-router-dom)

目次最近Reactを勉強していて、今は仕事でVueを使っています。学習の過程で、両者を比較して理解を...

Docker+keepalived+nginx を使用してマスタースレーブホットスタンバイを実装する方法の例

序文単一障害点を解決するには、マスター/スレーブ ホット スタンバイ ソリューションを構成する必要が...