Docker コンテナ内からマシンのローカルホストに接続するにはどうすればよいですか?
P粉787820396
P粉787820396 2023-08-23 11:55:48
0
2
619
<p>Docker コンテナ内で Nginx を実行しています。ホスト システム上で MySql を実行しています。コンテナ内から MySql に接続したいと考えています。 MySql はローカルホストデバイスにのみバインドします。 </p> <p>この Docker コンテナ内からローカルホスト上のこの MySql または他のプログラムに接続する方法はありますか? </p> <p>この質問は、「Docker コンテナ内から Docker ホストの IP アドレスを取得する方法」とは異なります。Docker ホストの IP アドレスは、ネットワーク内のパブリック IP またはプライベート IP である可能性があるためです。 Docker コンテナ内からはアクセスできない場合があります (AWS などでホストされている場合はパブリック IP を意味します)。 Docker ホストの IP アドレスを持っている場合でも、Docker ネットワークはオーバーレイ ネットワーク、ホスト ネットワーク、ブリッジ ネットワーク、MacVLAN ネットワークである可能性があるため、コンテナ内から Docker ホストに接続できるわけではありません。 、なしネットワークなど。これにより、この IP アドレスへのコンテナの到達可能性が制限されます。 </p>
P粉787820396
P粉787820396

全員に返信(2)
P粉517090748

すべてのプラットフォームで利用可能

Docker v 20.10 以降 (2020 年 12 月 14 日現在)

内部 IP アドレスを使用するか、特別な DNS 名 host.docker.internal に接続します。これは、ホストによって使用される内部 IP アドレスに解決されます。

これは開発目的であり、Docker Desktop 以外の運用環境での使用を目的としたものではありません。

Linux に関する警告

Linux 上の Docker でこの機能を有効にするには、--add-host=host.docker.internal:host-gateway docker に追加します。コマンドによりこの機能が有効になります。

Linux 上の Docker Compose でこの機能を有効にするには、コンテナ定義に次の行を追加します。 リーリー

一部のユーザーによると、特別な DNS 名は Docker のデフォルトの

bridge ネットワークでのみ機能し、カスタム ネットワークでは機能しないとのことです。

古い macOS および Windows バージョンの Docker の場合

Docker v 18.03 以降 (2018 年 3 月 21 日現在)

内部 IP アドレスを使用するか、特別な DNS 名

host.docker.internal に接続します。これは、ホストによって使用される内部 IP アドレスに解決されます。

Linux サポートは保留中です

https://github.com/docker/for-linux/issues /264

Docker の古い macOS バージョンの場合

Docker for Mac v 17.12 から v 18.02

上記と同じですが、

docker.for.mac.host.internal を使用します。

Docker for Mac v 17.06 から v 17.11

上記と同じですが、代わりに

docker.for.mac.localhost を使用します。

Docker for Mac 17.05 以前

Docker コンテナからホストにアクセスするには、ネットワーク インターフェイスに IP エイリアスをアタッチする必要があります。任意の IP をバインドできますが、それを他の目的で使用していないことを確認してください。

sudo ifconfig lo0 エイリアス 123.123.123.123/24

次に、サーバーが上記の IP または

0.0.0.0 でリッスンしていることを確認します。ローカルホスト 127.0.0.1 でリッスンしている場合、接続は受け入れられません。

その後、Docker コンテナーがこの IP を指すようにして、ホストにアクセスします。

テストするには、コンテナ内で

curl -X GET 123.123.123.123:3000 のようなコマンドを実行します。

エイリアスは再起動するたびにリセットされるため、必要に応じて起動スクリプトを作成します。

ソリューションとその他のドキュメントはこちら:

https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms

いいねを押す +0
P粉019353247

######編集:######

Docker-for-mac または

Docker-for-Windows

18.03 を使用している場合は、ホスト host.docker.internal (## の代わりに) を使用します。 # 接続文字列の 127.0.0.1)。 Docker-for-Linux 20.10.0 を使用している場合は、ホスト host.docker.internal

ifを使用することもできます --add-host host.docker.internal:host-gateway オプションで Docker コンテナーを開始するか、次のコード スニペットが docker-compose.yml ファイルに追加されます。 リーリー それ以外の場合は、以下をお読みください TLDR

docker run

コマンドで

--network="host"
を使用すると、docker コンテナーの

127.0.0.1

が docker host を指します。

注: ドキュメントによると、このモードは Linux バージョンの Docker でのみ利用可能です。 Dockerコンテナネットワークモードに関する注意事項

Docker は、コンテナーの実行時に さまざまなネットワーク モードを提供します。選択したモードに応じて、Docker ホスト上で実行されている MySQL データベースへの接続方法が異なります。 p>


docker run --network="bridge" (デフォルト)

Docker はデフォルトで

docker0 という名前のブリッジを作成します。 Docker ホストと Docker コンテナの両方がブリッジ上に IP アドレスを持っています。

Docker ホストで、

sudo ip addr show docker0

と入力します。次のような出力が表示されます。

リーリー つまり、docker0

ネットワーク インターフェイス上の Docker ホストの IP アドレスは

172.17.42.1 です。

ここで、新しいコンテナを起動してシェルを取得します。

docker run --rm -it ubuntu:trusty bash コンテナに ip addr show eth0 と入力して、そのコンテナを確認します。 master ネットワークインターフェースの設定方法: リーリー

ここでのコンテナの IP アドレスは

172.17.1.192 です。次に、ルーティング テーブルを表示します: リーリー したがって、Docker ホストの IP アドレス 172.17.42.1

がデフォルト ルートとして設定され、コンテナーからアクセスできます。

リーリー docker run --network="host"

または、Docker コンテナを実行して、

ネットワーク設定を host

に設定することもできます。このようなコンテナはネットワーク スタックを Docker ホストと共有し、コンテナの観点から見ると、

localhost

(または

127.0.0.1) は Docker ホストを指します。 p> Docker コンテナーで開かれたポートはすべて、Docker ホストでも開かれることに注意してください。これには、-p または -P docker run

option は必要ありません。 Docker ホストの IP 構成: リーリー および host モードの Docker コンテナ: リーリー

ご覧のとおり、Docker ホストと Docker コンテナはまったく同じネットワーク インターフェイスを共有しているため、同じ IP アドレスを持っています。


コンテナからMySQLに接続する

###ブリッジモード###

ブリッジ モード

のコンテナから Docker ホスト上で実行されている MySQL にアクセスするには、MySQL サービスが

172.17.42.1 IP アドレスで接続をリッスンしていることを確認する必要があります。 これを行うには、MySQL 構成ファイル (my.cnf) に bind-address = 172.17.42.1

または

bind-address = 0.0.0.0) があることを確認してください。 ゲートウェイの IP アドレスを使用して環境変数を設定する必要がある場合は、コンテナーで次のコードを実行できます。 リーリー 次に、アプリケーションで

DOCKER_HOST_IP

環境変数を使用して MySQL への接続を開きます。

注:

bind-address = 0.0.0.0

を使用すると、MySQL サーバーはすべてのネットワーク インターフェイス上の接続をリッスンします。これは、MySQL サーバーがインターネットからアクセスできることを意味します。それに応じてファイアウォール ルールを設定してください。 注 2:

bind-address = 172.17.42.1

を使用すると、MySQL サーバーは 127.0.0.1 Connect で確立されたサーバーをリッスンしません。 >。 MySQL に接続する Docker ホスト上で実行されているプロセスは、172.17.42.1 IP アドレスを使用する必要があります。 ホストモード Docker ホスト上で実行されている MySQL にホスト モードのコンテナからアクセスするには、MySQL 設定で

bind-address = 127.0.0.1

のままにし、

127.0.0.1## に接続します。コンテナから:

リーリー 注: mysql -h localhost

の代わりに

mysql -h 127.0.0.1 を使用してください。そうしないと、MySQL クライアントは Unix ソケット Make を使用しようとします。接続。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート