Docker コンテナ内で Nginx を実行しています。ホスト システム上で MySql を実行しています。コンテナ内から MySql に接続したいと考えています。 MySql はローカルホストデバイスにのみバインドします。
この Docker コンテナ内からローカルホスト上のこの MySql または他のプログラムに接続する方法はありますか?
この質問は、「Docker コンテナ内から Docker ホストの IP アドレスを取得する方法」とは異なります。Docker ホストの IP アドレスは、ネットワーク内のパブリック IP またはプライベート IP である可能性があるためです。 Docker コンテナ内からはアクセスできない場合があります (AWS などでホストされている場合はパブリック IP を意味します)。 Docker ホストの IP アドレスを持っている場合でも、Docker ネットワークはオーバーレイ ネットワーク、ホスト ネットワーク、ブリッジ ネットワーク、MacVLAN ネットワークである可能性があるため、コンテナ内から Docker ホストに接続できるわけではありません。 、なしネットワークなど。これにより、この IP アドレスへのコンテナの到達可能性が制限されます。
すべてのプラットフォームで利用可能
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
Linux サポートは保留中ですに接続します。これは、ホストによって使用される内部 IP アドレスに解決されます。
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
その後、Docker コンテナーがこの IP を指すようにして、ホストにアクセスします。 テストするには、コンテナ内ででリッスンしていることを確認します。ローカルホスト
127.0.0.1でリッスンしている場合、接続は受け入れられません。
curl -X GET 123.123.123.123:3000
エイリアスは再起動するたびにリセットされるため、必要に応じて起動スクリプトを作成します。 ソリューションとその他のドキュメントはこちら:のようなコマンドを実行します。
https://docs.docker.com/desktop/networking/#use-cases-and-workarounds-for-all-platforms
######編集:######
Docker-for-macまたは
Docker-for-Windows18.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 runオプションで Docker コンテナーを開始するか、次のコード スニペットが docker-compose.yml ファイルに追加されます。 リーリー
それ以外の場合は、以下をお読みくださいTLDR
コマンドで
--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
と入力します。次のような出力が表示されます。リーリー
ネットワーク インターフェイス上の Docker ホストの IP アドレスはつまり、
docker0172.17.42.1
ここで、新しいコンテナを起動してシェルを取得します。です。
docker run --rm -it ubuntu:trusty bash
ここでのコンテナの IP アドレスはコンテナに
ip addr show eth0と入力して、そのコンテナを確認します。 master ネットワークインターフェースの設定方法:
リーリー172.17.1.192
がデフォルト ルートとして設定され、コンテナーからアクセスできます。です。次に、ルーティング テーブルを表示します:
リーリーしたがって、Docker ホストの IP アドレス
172.17.42.1リーリー
または、Docker コンテナを実行して、docker run --network="host"
ネットワーク設定を
に設定することもできます。このようなコンテナはネットワーク スタックを Docker ホストと共有し、コンテナの観点から見ると、host
localhost
(または127.0.0.1) は Docker ホストを指します。
p>
Docker コンテナーで開かれたポートはすべて、Docker ホストでも開かれることに注意してください。これには、-p
または-P
docker runoptionは必要ありません。
ご覧のとおり、Docker ホストと Docker コンテナはまったく同じネットワーク インターフェイスを共有しているため、同じ IP アドレスを持っています。Docker ホストの IP 構成: リーリー および
host
モードの Docker コンテナ:リーリーコンテナからMySQLに接続する
###ブリッジモード###ブリッジ モード
のコンテナから Docker ホスト上で実行されている MySQL にアクセスするには、MySQL サービスが172.17.42.1IP アドレスで接続をリッスンしていることを確認する必要があります。
またはこれを行うには、MySQL 構成ファイル (my.cnf) に
bind-address = 172.17.42.1bind-address = 0.0.0.0
DOCKER_HOST_IP) があることを確認してください。
ゲートウェイの IP アドレスを使用して環境変数を設定する必要がある場合は、コンテナーで次のコードを実行できます。 リーリー
次に、アプリケーションで環境変数を使用して MySQL への接続を開きます。
bind-address = 0.0.0.0注:
を使用すると、MySQL サーバーはすべてのネットワーク インターフェイス上の接続をリッスンします。これは、MySQL サーバーがインターネットからアクセスできることを意味します。それに応じてファイアウォール ルールを設定してください。
bind-address = 172.17.42.1注 2:
を使用すると、MySQL サーバーは127.0.0.1Connect で確立されたサーバーをリッスンしません。 >。 MySQL に接続する Docker ホスト上で実行されているプロセスは、
bind-address = 127.0.0.1172.17.42.1
IP アドレスを使用する必要があります。ホストモード
Docker ホスト上で実行されている MySQL にホスト モードのコンテナからアクセスするには、MySQL 設定で
のままにし、
127.0.0.1## に接続します。コンテナから:リーリー
の代わりに注:
mysql -h localhost
mysql -h 127.0.0.1を使用してください。そうしないと、MySQL クライアントは Unix ソケット Make を使用しようとします。接続。