ホームページ  >  に質問  >  本文

Docker コンテナ内からマシンのローカルホストに接続するにはどうすればよいですか?

<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粉787820396P粉787820396423日前545

全員に返信(2)返信します

  • P粉517090748

    P粉5170907482023-08-24 11:07:24

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

    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

    P粉0193532472023-08-24 09:26:22

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

    Docker-for-mac または

    Docker-for-Windows

    18.03 を使用している場合は、ホスト host.docker.internal (## の代わりに) を使用します。 # 接続文字列の 127.0.0.1)。 Docker-for-Linux 20.10.0 を使用している場合は、ホスト < /code>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 データベースへの接続方法が異なります。


    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
  • キャンセル返事