編集:あなたが使用している場合はドッカー-ため-MACやドッカー-ため、Windowsの 18.03+を、ちょうどホスト使用してMySQLサービスへの接続host.docker.internal
(の代わりに127.0.0.1
、あなたの接続文字列で)。
Docker 18.09.3以降、これはDocker-for-Linuxでは機能しません。修正は月に8日、2019年に提出されましたし、うまくいけば、コードベースにマージされます。それまでは、qoomonの回答に記載されているように、コンテナーを使用することで回避できます。
2020-01:ある程度の進歩がありました。すべてがうまくいけば、これはDocker 20.04に到達するはずです。
TLDR
コマンドで使用--network="host"
し、DockerコンテナでDockerホストをポイントします。docker run
127.0.0.1
注:このモードは、ドキュメントに従って LinuxのDockerでのみ機能します。
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
だからここに私のドッカーホストは上の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
-P
docker run
。
私のドッカーホストの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アドレスで接続をリッスンしていることを確認する必要があります。
そのためには、必ずどちらか持たせるbind-address = 172.17.42.1
か、bind-address = 0.0.0.0
MySQLの設定ファイル(my.cnfファイル)で。
ゲートウェイのIPアドレスで環境変数を設定する必要がある場合は、コンテナで次のコードを実行できます。
export DOCKER_HOST_IP=$(route -n | awk '/UG[ \t]/{print $2}')
次に、アプリケーションで、DOCKER_HOST_IP
環境変数を使用してMySQLへの接続を開きます。
注:bind-address = 0.0.0.0
MySQLサーバーを使用する場合、すべてのネットワークインターフェースで接続をリッスンします。これは、MySQLサーバーにインターネットからアクセスできることを意味します。それに応じてファイアウォールルールを設定してください。
注2:bind-address = 172.17.42.1
MySQLサーバーを使用している場合、への接続をリッスンしません127.0.0.1
。MySQLに接続するDockerホストで実行されるプロセスは、172.17.42.1
IPアドレスを使用する必要があります。
ホストモード
ホストモードのコンテナーからdockerホストで実行されているMySQLにアクセスするにbind-address = 127.0.0.1
は、MySQL構成を維持でき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ソケットを使用して接続しようとします。