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

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

Docker コンテナ内で Nginx を実行しています。ホスト システムで MySql を実行しています。コンテナ内から MySql に接続したいと考えています。MySql は localhost デバイスにのみバインドされています。

この Docker コンテナ内からこの MySql または localhost 上の他のプログラムに接続する方法はありますか?

この質問は、「docker コンテナ内から docker ホストの IP アドレスを取得する方法」とは異なります。docker ホストの IP アドレスは、ネットワーク内のパブリック IP またはプライベート IP である可能性があり、docker コンテナ内から到達できる場合とできない場合があります (AWS などでホストされている場合はパブリック IP を意味します)。docker ホストの IP アドレスがわかっていても、その IP アドレスを指定してコンテナ内から docker ホストに接続できるわけではありません。Docker ネットワークは、オーバーレイ、ホスト、ブリッジ、macvlan、none などである可能性があり、その IP アドレスの到達可能性が制限されます。

ベストアンサー1

編集:

使用している場合Mac用DockerまたはWindows 用 Docker18.03 以降では、接続文字列host.docker.internalではなくホストを使用して MySQL サービスに接続します。127.0.0.1

Docker-for-Linux 20.10.0 以降を使用している場合は、オプションを使用して Docker コンテナーを起動するか、docker-compose.yml ファイルに次のスニペットを追加するhost.docker.internal 、ホストを使用することもできます。--add-host host.docker.internal:host-gateway

extra_hosts:
    - "host.docker.internal:host-gateway"

それ以外の場合は以下をお読みください


要約

--network="host"コマンドで使用するdocker runと、127.0.0.1docker コンテナは docker ホストを指すようになります。

注: このモードはDocker for Linuxでのみ動作します。文書によると


Dockerコンテナのネットワークモードに関する注意

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

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

Docker はデフォルトで名前の付いたブリッジを作成しますdocker0。そのブリッジには、Docker ホストと Docker コンテナの両方に IP アドレスがあります。

Docker ホストで次のように入力すると、sudo ip addr show docker0出力は次のようになります。

[vagrant@docker:~] $ sudo ip addr show docker0
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
    inet 172.17.42.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::5484:7aff:fefe:9799/64 scope link
       valid_lft forever preferred_lft forever

172.17.42.1ここで、私の Docker ホストはネットワーク インターフェイス上のIP アドレスを持ちますdocker0

次に、新しいコンテナを起動してシェルを起動します。docker run --rm -it ubuntu:trusty bashコンテナ内で次のように入力して、ip addr show eth0メイン ネットワーク インターフェイスがどのように設定されているかを確認します。

root@e77f6a1b3740:/# ip addr show eth0
863: eth0: <BROADCAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 66:32:13:f0:f1:e3 brd ff:ff:ff:ff:ff:ff
    inet 172.17.1.192/16 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::6432:13ff:fef0:f1e3/64 scope link
       valid_lft forever preferred_lft forever

ここで、コンテナには IP アドレスがあります172.17.1.192。次に、ルーティング テーブルを確認します。

root@e77f6a1b3740:/# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      *               255.255.0.0     U     0      0        0 eth0

したがって、Docker ホストの IP アドレス172.17.42.1がデフォルト ルートとして設定され、コンテナーからアクセスできるようになります。

root@e77f6a1b3740:/# ping 172.17.42.1
PING 172.17.42.1 (172.17.42.1) 56(84) bytes of data.
64 bytes from 172.17.42.1: icmp_seq=1 ttl=64 time=0.070 ms
64 bytes from 172.17.42.1: icmp_seq=2 ttl=64 time=0.201 ms
64 bytes from 172.17.42.1: icmp_seq=3 ttl=64 time=0.116 ms

docker run --network="ホスト"

あるいは、dockerコンテナを次のように実行することもできます。ネットワーク設定がhostこのようなコンテナは、ネットワーク スタックを Docker ホストと共有し、コンテナの観点からは、localhost(または127.0.0.1) は Docker ホストを参照します。

Dockerコンテナで開かれたポートはDockerホストでも開かれることに注意してください。これは-pまたは-P docker runオプション

私の Docker ホストの IP 構成:

[vagrant@docker:~] $ ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

ホストモードの Docker コンテナからの場合:

[vagrant@docker:~] $ docker run --rm -it --network=host ubuntu:trusty ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 08:00:27:98:dc:aa brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe98:dcaa/64 scope link
       valid_lft forever preferred_lft forever

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


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

ブリッジモード

ブリッジ モードのコンテナーから docker ホスト上で実行されている MySQL にアクセスするには、MySQL サービスが172.17.42.1IP アドレスで接続をリッスンしていることを確認する必要があります。

これを行うには、 MySQL 構成ファイル (my.cnf) にbind-address = 172.17.42.1または のいずれかが含まれていることを確認します。bind-address = 0.0.0.0

ゲートウェイの IP アドレスを使用して環境変数を設定する必要がある場合は、コンテナー内で次のコードを実行できます。

export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')

次に、アプリケーションでDOCKER_HOST_IP環境変数を使用して MySQL への接続を開きます。

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

注 2:を使用する場合、bind-address = 172.17.42.1MySQL サーバーはへの接続をリッスンしません127.0.0.1。Docker ホスト上で実行され、MySQL に接続するプロセスは、IP172.17.42.1アドレスを使用する必要があります。

ホストモード

ホスト モードのコンテナーから docker ホスト上で実行されている MySQL にアクセスするにはbind-address = 127.0.0.1MySQL 構成を維持し、127.0.0.1コンテナーから接続します。

[vagrant@docker:~] $ docker run --rm -it --network=host mysql mysql -h 127.0.0.1 -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 36
Server version: 5.5.41-0ubuntu0.14.04.1 (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

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

おすすめ記事