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

推薦する

Vueキャッシュ機能の使い方

目次vue2のキャッシュ機能Vue キャッシュ関数の変換最適化要約するvue2のキャッシュ機能vue...

MySQLは1億のテストデータを素早く挿入します

目次1. テーブルを作成する1.1 テストテーブルt_userを作成する1.2 一時テーブルの作成2...

フォームにファイルをアップロードした後にアクションを保存するよう促す理由と解決策

jsonデータはhtml形式で返される必要がありますつまり、 response.setContent...

Vueのコンポーネントのprops属性について詳しく説明します

目次質問1: 小道具は具体的にどのように使用されますか?原理は何ですか?下を見る質問 2: 年齢に ...

Node.js で MySQL データベースにバッチデータを挿入する方法

プロジェクト(nodejs)では、一度に複数のデータをデータベースに挿入する必要があります。データベ...

HTMLの基本概念の詳細な説明

HTMLとは何ですか? HTML は Web ページを記述するために使用される言語です。 •HTML...

MongoDBのパフォーマンスを向上させる方法

MongoDB は高性能なデータベースですが、使用していくうちにパフォーマンスの問題が発生することが...

MySQLでorder byを使用せずにランキングを実装する3つの方法のまとめ

ビジネスを想定: 2位の従業員の給与情報を見るデータベースを作成する emps が存在する場合はデー...

IE8 と Chrome でテーブルの幅を修正する方法

IE8 や Chrome で上記の設定を使用すると、画面の最大幅に合わせて表示が統一され、各列の幅は...

Linuxのアラーム機能の例の説明

Linuxアラーム機能の紹介上記のコード: #include <stdio.h> #in...

ピクセルを包括的なブランド体験に変えるヒント

編集者:この記事では、インタラクティブデザインがブランドコミュニケーションチェーン全体で果たすべき役...

Linux の操作とメンテナンスの基本システムディスク管理チュートリアル

1. ディスクパーティション: 2. fdiskパーティションディスクが2 TB未満の場合はfdis...

Matlab による JavaScript プログラミング、重心アルゴリズムによる位置決め学習

目次Matlab セントロイドアルゴリズムMatlab はクローズドな商用ソフトウェアであり、米国政...