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かどうかを判定します

推薦する

Vue3+Vite+TS は、要素プラスビジネスコンポーネントの二次カプセル化を実装します sfasga

目次1. 構造文字列2. タプルを返す3. Dict辞書にアクセスする4. 図書館を利用する5. リ...

Vueモバイル端末が指のスライド効果を実現

この記事の例では、Vueモバイル端末で指のスライド効果を実現するための具体的なコードを紹介します。具...

MYSQLは継続サインイン機能を実装しており、サインイン後1日経過すると最初から開始します(SQL文)

1. テストテーブルを作成する テーブル `testsign` を作成します ( `userid`...

Centos 6.9 に MySQL をインストールするための詳細なチュートリアル

1. MySQLがインストールされているかどうかを確認します。次のコードで確認できます。 [root...

MySQL 8.0はJSONを扱えるようになりました

目次1. 概要2. JSON基本ツール3. JSONパス式4. JSONを検索して変更する序文:長い...

HTML と CSS を書くための 6 つの最も効果的な方法

この記事では、効率を向上させ、時間を節約することを願って、最も効果的な 6 つの方法を紹介します。 ...

同じページを動的にロードするための Vue ルーティングリスニングの例

目次シナリオ分析発達要約するシナリオ分析システムでは、1 つのモジュールに 3 つのサブモジュールが...

CSS で div 凹角スタイルを実装するサンプル コード

通常の開発では、凸型の丸い角、つまり border-radius 属性を使用するのが一般的です。凹角...

Redis を Docker コンテナとして素早くデプロイする方法

目次はじめるデータストレージサーバーを構成するRedis セキュリティの管理Redisインストールの...

CentOS プラットフォーム上で LAMP 環境を素早く構築する方法

この記事では、例を使用して、CentOS プラットフォーム上で LAMP 環境を迅速に構築する方法に...

CentOS のファイルと権限の基本操作チュートリアル

序文始める前に、ファイル属性とファイル属性を変更する方法について簡単に理解しておく必要があります。 ...

Dockerはjenkins+mavenコード構築および展開プラットフォームを構築します

目次Docker の基本概念Docker インストール プロセス (Centos6.9)カーネルのア...

MySql はデータを正常に挿入しますが、[Err] 1055 エラーが報告されます。解決策

1. 質問:最近、挿入操作を行っています。MySQLのバージョンは5.7です。挿入は成功しますが、エ...

HTML CSS を使用して div またはテーブルを指定した位置に固定する方法

CSSコードコンテンツをクリップボードにコピー.bottomTable{背景色: rgb (249,...

ページにデータを表示するReactメソッド

目次親コンポーネントリストボックスリストコンポーネントボタンコンポーネント PageButton昨年...