編集:
Docker-for-macまたはDocker-for-Windows 18.03 以降を使用している場合は、(接続文字列の の代わりに) ホストを使用して mysql サービスに接続するだけですhost.docker.internal
。127.0.0.1
Docker-for-Linux 20.10.0+ を使用している場合、オプションを使用して Docker コンテナーを開始したhost.docker.internal
場合--add-host host.docker.internal:host-gateway
は、ホストも使用できます。
それ以外の場合は、以下をお読みください
TLDR
コマンドで使用する--network="host"
と、docker コンテナーで docker ホストがポイントされます。docker run
127.0.0.1
注: このモードは、ドキュメンテーションに従って、 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
したがって、ここでは、Docker ホストがネットワーク インターフェイスにIP アドレス172.17.42.1
を持っています。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="host"
または、ネットワーク設定を に設定しhost
て docker コンテナーを実行することもできます。このようなコンテナーはネットワーク スタックを docker ホストと共有し、コンテナーの観点からlocalhost
(または127.0.0.1
) docker ホストを参照します。
Docker コンテナーで開かれたポートはすべて、Docker ホスト上で開かれることに注意してください。そして、これは-p
or-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.1
IP アドレスで接続をリッスンしていることを確認する必要があります。
これを行うには、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 への接続を開きます。
注: MySQL サーバーを使用bind-address = 0.0.0.0
すると、すべてのネットワーク インターフェイスで接続がリッスンされます。これは、インターネットから MySQL サーバーにアクセスできることを意味します。それに応じてファイアウォール ルールを設定してください。
注 2: MySQL サーバーを使用している場合bind-address = 172.17.42.1
、 への接続をリッスンしません127.0.0.1
。MySQL に接続する docker ホストで実行されているプロセスは、172.17.42.1
IP アドレスを使用する必要があります。
ホストモード
ホスト モードのコンテナーから docker ホストで実行されている MySQL にアクセスするには、MySQL 構成を保持し、コンテナーからbind-address = 127.0.0.1
接続するだけです。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 ソケットを使用して接続しようとします。