だから私は港湾労働者のコンテナの中で実行されているNginxを持っている、私はlocalhostで実行されているMySQLを持っている、私は自分のNginx内からMySqlに接続したい。 MySqlはlocalhostで実行されていて、外部の世界にポートを公開していないので、localhostにバインドされていて、マシンのIPアドレスにバインドされていません。
このdockerコンテナ内からMySqlまたはlocalhost上の他のプログラムに接続する方法はありますか?
編集: Docker-for-mac または Docker-for-mac 18.03+)を使用している場合は、Host Host.docker.internal
を使用してmysqlサービスに接続してください。
Docker 18.04以降、これはDocker for Linuxでは機能しません。 ただし、 qoomon's answer で説明されているようにコンテナを使用すると、うまく動作させることができます。
--network="Host"
コマンドでdocker run
を使用すると、dockerコンテナの127.0.0.1
がdocker Hostを指すようになります。
注:このモードはDocker for Linux、 ドキュメンテーション に従って)でのみ機能します。
Dockerはコンテナの実行時に 異なるネットワークモード を提供します。選択したモードに応じて、docker Host上で実行されているMySQLデータベースへの接続方法が異なります。
Dockerはデフォルトでdocker0
という名前のブリッジを作成します。 docker Hostとdocker containerの両方がそのブリッジに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 Hostは172.17.42.1
ネットワークインターフェースの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 Hostの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
あるいは、 ネットワーク設定をHost
に設定したもの)でdockerコンテナーを実行することもできます。そのようなコンテナーはdocker Hostとネットワーク・スタックを共有し、コンテナーの観点からはlocalhost
または127.0.0.1
)はdocker Hostを参照します。
Dockerコンテナで開かれているポートはすべてdockerホストで開かれることに注意してください。そしてこれは_(-p
や-P
docker run
option を必要としない。
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
そして Host モードの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 Hostとdocker containerは、まったく同じネットワークインターフェースを共有しているため、同じIPアドレスを持っています。
ブリッジモードのコンテナからdocker Host上で実行されている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への接続を開きます。
注: bind-address = 0.0.0.0
を使用すると、MySQLサーバーはすべてのネットワークインターフェースで接続を待機します。それはあなたのMySQLサーバがインターネットからアクセスできることを意味します。それに応じてファイアウォールルールを設定してください。
注2: あなたがbind-address = 172.17.42.1
を使うと、あなたのMySQLサーバーは127.0.0.1
への接続を待ち受けません。 MySQLに接続したいと思うdocker Hostで実行されているプロセスは172.17.42.1
IPアドレスを使用しなければならないでしょう。
ホストモードのコンテナからdocker Host上で実行されている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ソケットを使用して接続しようとします。
Docker v 18.03以降(2018年3月21日以降)
内部IPアドレスを使用するか、ホストが使用する内部IPアドレスに解決される特別なDNS名Host.docker.internal
に接続します。
Linuxのサポートは保留中です https://github.com/docker/for-linux/issues/264
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 containerからHost machineにアクセスするには、ネットワークインターフェースにIPエイリアスを添付する必要があります。どのIPを使用しても構いませんが、使用していないことを確認してください。
Sudo ifconfig lo0 alias 123.123.123.123/24
次に、サーバーが上記のIPまたは0.0.0.0
をリッスンしていることを確認してください。 localhostの127.0.0.1
をリッスンしている場合は、接続を受け入れません。
それからあなたのdockerコンテナをこのIPに向けるだけで、あなたはHostマシンにアクセスすることができます!
テストするためにはコンテナの中でcurl -X GET 123.123.123.123:3000
のようなものを実行することができます。
エイリアスは再起動のたびにリセットされるので、必要に応じて起動スクリプトを作成します。
ここにソリューションとより多くのドキュメンテーション: https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
私は、ローカルIPをコンテナ内のエイリアス名(DNS)にマッピングする上記の投稿に似たハックをしています。主な問題は、 LinuxとOSXのホストIPアドレス の両方で動作する単純なスクリプトで動的に取得することです。私はこのスクリプトを両方の環境で動作するようにしました("$LANG" != "en_*"
が設定されたLinuxディストリビューションでも)。
ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1
したがって、Docker Composeを使用した場合、完全な構成は次のようになります。
起動スクリプト(docker-run.sh) :
export DOCKERHOST=$(ifconfig | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | awk '{ print $2 }' | cut -f2 -d: | head -n1)
docker-compose -f docker-compose.yml up
docker-compose.yml :
myapp:
build: .
ports:
- "80:80"
extra_hosts:
- "dockerhost:$DOCKERHOST"
次に、コードのhttp://localhost
をhttp://dockerhost
に変更します。
どのようにDOCKERHOST
スクリプトをカスタマイズするかについてのより進んだガイドのためにそれがどのように働くかの説明と共に この記事 を見てください。
これは私にとってNGINX/PHP-FPMスタック上で動作しました。アプリがlocalhost
に接続できることを期待しているコードやネットワークには一切触れません
ホストからコンテナの内側にmysqld.sock
をマウントします。
Mysqlを実行しているホスト上でmysql.sockファイルの場所を見つけます。netstat -ln | awk '/mysql(.*)?\.sock/ { print $9 }'
そのファイルをdockerの予想される場所にマウントします。docker run -v /hostpath/to/mysqld.sock:/containerpath/to/mysqld.sock
Mysqld.sockの考えられる場所:
/tmp/mysqld.sock
/var/run/mysqld/mysqld.sock
/var/lib/mysql/mysql.sock
/Applications/MAMP/tmp/mysql/mysql.sock # if running via MAMP
Linux用のソリューション(カーネル> = 3.6)。
わかりました、あなたのlocalhostサーバーにはデフォルトのdockerインターフェース docker0 とipアドレス 172.17.0.1 があります。あなたのコンテナはデフォルトのネットワーク設定 --net = "bridge" で始まりました。
$ sysctl -w net.ipv4.conf.docker0.route_localnet=1
$ iptables -t nat -I PREROUTING -i docker0 -d 172.17.0.1 -p tcp --dport 3306 -j DNAT --to 127.0.0.1:3306
$ iptables -t filter -I INPUT -i docker0 -d 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
route_localnet - BOOLEAN:ルーティング中にループバックアドレスを火星の送信元または送信先と見なさないでください。これはローカルルーティング目的のために127/8の使用を可能にします( デフォルトFALSE )。
Windows 10用のソリューション
Docker Community Edition 17.06.0-ce-win18 2017-06-28(安定版)
内部IPに解決するために、ホストのDNS名docker.for.win.localhost
を使用できます。 (いくつかの情報源に警告はwindows
を述べましたが、それはwin
であるべきです)
概要
同様のことをする必要がありました。それは私のDockerコンテナからAzure Storage Emulator
とCosmosDB Emulator
を実行していた私のローカルホストへの接続です。
Azure Storage Emulator
はデフォルトで127.0.0.1をリッスンしますが、IPの範囲も変更できますが、デフォルト設定で機能する解決策を探していました。
これは私のDockerコンテナからSQL Server
とIIS
への接続にも働きます。どちらもデフォルトのポート設定で私のホスト上でローカルに動作します。
Windowsの場合は、ブリッジネットワークドライバを使用していると仮定して、MySQLをhyper-vネットワークインタフェースのIPアドレスに明示的にバインドする必要があります。
これは通常隠されているC:\ ProgramData\MySQLフォルダの下の設定ファイルを通して行われます。
0.0.0.0にバインドしても機能しません。必要なアドレスはdocker設定にも表示され、私の場合は10.0.75.1でした。
編集:私はGitHubでコンセプトを試作しました。チェックアウト: https://github.com/sivabudh/system-in-a-box
まず、私の答えは、Macを使う人とLinuxを使う人の2つのグループに向けられています。
Host ネットワークモードはMacでは機能しません。 IPエイリアスを使用する必要があります。 https://stackoverflow.com/a/43541681/2713729 を参照してください。
ホストネットワークモードとは何ですか?参照してください: https://docs.docker.com/engine/reference/run/#/network-settings
第二に、Linuxを使っている人たち(私の直接の経験はUbuntu 14.04 LTSを使っていて、すぐに16.04 LTSにアップグレードする予定です)、 yes なら、Dockerコンテナ内でサービスを走らせることができますDockerホスト上で実行されているlocalhost
サービス(例えばあなたのラップトップ)に接続してください。
どうやって?
重要なのは、Dockerコンテナを実行するときに、 Host モードで実行する必要があるということです。コマンドは次のようになります。
docker run --network="Host" -id <Docker image ID>
コンテナ内でifconfig
(ifconfig
を呼び出し可能にするにはapt-get install net-tools
を作成する必要があります)を実行すると、ネットワークインターフェイスはDocker Hostのものと同じになります(例:ラップトップ)。
私はMacユーザーですが、Parallelsの下でUbuntuを実行しているので、Macを使用することはデメリットではありません。 ;-)
そしてこれがNGINXコンテナをlocalhost
上で動作するMySQLに接続する方法です。
host.docker.internalがすべてのプラットフォームで動作するまで、手動でセットアップすることなくNATゲートウェイとして機能する私のコンテナを使用できます https://github.com/qoomon/docker-Host
Mac OSX用の最もシンプルなソリューション
MacのIPアドレスを使うだけです。 Macでは、これを実行してIPアドレスを取得し、コンテナ内から使用します。
$ ifconfig | grep 'inet 192'| awk '{ print $2}'
Mac上または別のdocker containerでローカルに実行されているサーバーが0.0.0.0をリッスンしている限り、docker containerはそのアドレスにアクセスできます。
0.0.0.0をリッスンしている別のdockerコンテナにアクセスしたいだけであれば、172.17.0.1を使用できます。
ここに私の解決策があります:それは私の場合に機能します
/etc/mysql/mysql.conf.dのコメント#bind-address = 127.0.0.1
によってローカルmysqlサーバーをパブリックアクセスに設定します
mysqlサーバーを再起動しますSudo /etc/init.d/mysql restart
次のコマンドを実行して、任意のホストmysql -uroot -proot GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES;
のユーザールートアクセスを開きます。
shスクリプトの作成:run_docker.sh
#!bin/bash HOSTIP = `ip -4 addr show scope global dev dev eth0 | grep inet | awk '{print\$ 2}' | cut -d/-f 1` docker run -it -d --name web-app\ --add-Host = local:$ {HOSTIP}\ -p 8080:8080\ -e DATABASE_Host = $ {HOSTIP}\ -e DATABASE_PORT = 3306\ -e DATABASE_NAME = demo\ -e DATABASE_USER = root\ -e DATABASE_PASSWORD = root\ sopheamak/springboot_docker_mysql
docker-composerで実行する
バージョン: '2.1'
サービス:
tomcatwar: extra_hosts: -"local:10.1.2.232" image:sopheamak/springboot_docker_mysql
ポート: -8080:8080 環境: -DATABASE_Host = local -DATABASE_USER = root -DATABASE_PASSWORD = root -DATABASE_NAME = demo -DATABASE_PORT = 3306
これは実際の質問に対する答えではありません。これは私が同様の問題を解決した方法です。ソリューションは、完全に以下から得られます。 コンテナが通信できるようにDockerコンテナネットワーキングを定義 。 Nic Raboyに感謝
あるコンテナと別のコンテナ間でREST呼び出しを行いたいと思う他の人のためにここに残してください。質問への回答:Docker環境でlocalhostの代わりに何を使用するか?
ネットワークがどのように見えるかを取得しますdocker network ls
新しいネットワークを作成docker network create -d my-net
最初のコンテナdocker run -d -p 5000:5000 --network="my-net" --name "first_container" <MyImage1:v0.1>
を開始します
最初のコンテナdocker inspect first_container
のネットワーク設定を確認してください。 「ネットワーク」:「my-net」が必要です
2番目のコンテナdocker run -d -p 6000:6000 --network="my-net" --name "second_container" <MyImage2:v0.1>
を開始します
2番目のコンテナdocker inspect second_container
のネットワーク設定を確認します。 「ネットワーク」:「my-net」が必要です
2番目のコンテナdocker exec -it second_container sh
またはdocker exec -it second_container bash
にsshします。
2番目のコンテナー内では、ping first_container
で最初のコンテナーにpingを実行できます。また、http://localhost:5000
などのコード呼び出しはhttp://first_container:5000
に置き換えることができます
いくつかの解決策が思い浮かびます:
これがすぐに動作しない理由は、コンテナがデフォルトで独自のネットワーク名前空間で実行されるためです。つまり、ローカルホスト(またはループバックインターフェイスを指す127.0.0.1)はコンテナごとに一意です。これに接続すると、コンテナー自体に接続され、ドッカーの外部または別のドッカーコンテナーの内部で実行されるサービスではありません。
オプション1:依存関係をコンテナに移動できる場合、最初にこれを行います。他の人が自分の環境でコンテナを実行しようとするため、アプリケーションスタックが移植可能になります。また、移行されていない他のサービスが引き続きアクセスできるホストでポートを公開できます。 Dockerホストのlocalhostインターフェイスにポートを公開して、公開されたポートの-p 127.0.0.1:3306:3306
のような構文で外部からアクセスできるようにすることもできます。
オプション2:コンテナー内からホストIPアドレスを検出する方法はさまざまですが、それぞれが機能するシナリオの数は限られています(例:Docker for Macが必要)。最も移植性の高いオプションは、環境変数または構成ファイルのようなものを使用して、ホストIPをコンテナーに注入することです。
docker run --rm -e "Host_IP=$(ip r s 0/0 | awk '{print $3}')" ...
これには、サービスがその外部インターフェイスでリッスンしている必要がありますが、これはセキュリティ上の問題になる可能性があります。コンテナ内部からホストIPアドレスを取得する他の方法については、 この投稿を参照 。
オプション3:ネットワーク分離なしで実行、つまり--net Host
で実行すると、アプリケーションはホストネットワーク名前空間で実行されます。これにより、コンテナの分離が少なくなり、DNSを使用して共有ドッカーネットワーク経由で他のコンテナにアクセスできなくなります(代わりに、公開されたポートを使用して他のコンテナ化されたアプリケーションにアクセスする必要があります)。ただし、ホスト上の127.0.0.1
でのみリッスンしているホスト上の他のサービスにアクセスする必要があるアプリケーションの場合、これが最も簡単なオプションです。
オプション4:さまざまなサービスにより、ファイルシステムベースのソケットを介したアクセスも許可されます。このソケットは、バインドマウントボリュームとしてコンテナにマウントできるため、ネットワークを経由せずにホストサービスにアクセスできます。 Dockerエンジンへのアクセスについては、/var/run/docker.sock
をコンテナにマウントする例がよく見られます(そのコンテナルートがホストにアクセスできるようにします)。 mysqlでは、-v /var/run/mysqld/mysqld.sock:/var/run/mysqld/mysql.sock
のようなものを試してから、localhost
に接続して、mysqlがソケットを使用するように変換します。
私はThomasleveilからの答えに同意しません。
Mysqlを172.17.42.1にバインドすると、他のプログラムがホスト上のデータベースを使用してアクセスできなくなります。これは、すべてのデータベースユーザーがdockerizedされている場合にのみ機能します。
Mysqlを0.0.0.0にバインドすると、データベースが外部に公開されます。これは非常に悪いことであるだけでなく、元の質問作成者がやりたいこととは反対です。彼は、「MySqlはlocalhostで実行されていて、外部の世界にポートを公開していないので、localhostにバインドされている」と明確に述べています。
Ivantからのコメントに回答する
「なぜmysqlをdocker0にもバインドしないのですか?」
これは不可能です。 mysql/mariadbのドキュメントには、複数のインターフェースにバインドすることは不可能であることが明示的に記載されています。 0、1、またはすべてのインターフェイスにしかバインドできません。
結論として、私はdockerコンテナからホスト上の(localhostのみ)データベースにアクセスする方法を見つけていません。それは間違いなく非常に一般的なパターンのように思えますが、私はそれを行う方法がわかりません。
CGroupsとNamespacesはContainer Ecosystemで大きな役割を果たしています。
名前空間は分離の層を提供します。各コンテナは別々のネームスペースで実行され、そのアクセスはそのネームスペースに制限されます。 Cgroupsは各コンテナーのリソース使用率を制御しますが、Namespaceはプロセスがそれぞれのリソースを見てアクセスできるものを制御します。
これがあなたが従うことができる解決策アプローチの基本的な理解です、
ネットワークネームスペースを使用する
コンテナーがイメージから生成されると、ネットワークインターフェースが定義され作成されます。これにより、コンテナーに固有のIPアドレスとインターフェースが与えられます。
$ docker run -it Alpine ifconfig
名前空間をホストに変更することによって、cotainersネットワークはそのインターフェースから分離されたままではなく、プロセスはホストマシンのネットワークインターフェースにアクセスできるようになります。
$ docker run -it --net=Host Alpine ifconfig
プロセスがポートをリッスンする場合、それらはホストインターフェースでリッスンされ、コンテナにマッピングされます。
PID名前空間の使用 Pid名前空間を変更することで、コンテナは通常の範囲を超えて他のプロセスと対話することができます。
このコンテナはそれ自身の名前空間で動作します。
$ docker run -it Alpine ps aux
名前空間をHostに変更することで、コンテナはシステム上で実行されている他のすべてのプロセスも見ることができます。
$ docker run -it --pid=Host Alpine ps aux
名前空間を共有する
脆弱性や盗聴者への容易なアクセスをもたらす可能性があるコンテナセキュリティモデルから抜け出しているため、これは実稼働環境ではこれを行うのは悪い習慣です。これは、ツールをデバッグし、コンテナセキュリティの抜け穴を理解するためだけのものです。
最初のコンテナはnginxサーバーです。これにより、新しいネットワークとプロセスのネームスペースが作成されます。このコンテナは、新しく作成されたネットワークインタフェースのポート80に自分自身をバインドします。
$ docker run -d --name http nginx:Alpine
別のコンテナがこの名前空間を再利用できるようになりました
$ docker run --net=container:http mohan08p/curl curl -s localhost
また、このコンテナは共有コンテナ内のプロセスとのインタフェースを見ることができます。
$ docker run --pid=container:http Alpine ps aux
これにより、アプリケーションを変更したり再起動したりせずに、より多くの特権をコンテナに付与できます。同様に、ホスト上のmysqlに接続し、アプリケーションを実行してデバッグすることができます。しかし、それはこの方法で行くことをお勧めしません。それが役に立てば幸い。
あなたはアルパインイメージを使用してホストIPを取得することができます
docker run --rm Alpine ip route | awk 'NR==1 {print $3}'
コマンドを実行するために常にAlpineを使用しているので、これはより一貫性があります。
Marianoの答えと同様に、環境変数を設定するために同じコマンドを使うことができます
DOCKER_Host=$(docker run --rm Alpine ip route | awk 'NR==1 {print $3}') docker-compose up
とても簡単で素早く、あなたのホストIPをifconfig(linux)かipconfig(windows)でチェックしてから
docker-compose.yml
version: '3' # specify docker-compose version
services:
nginx:
build: ./ # specify the directory of the Dockerfile
ports:
- "8080:80" # specify port mapping
extra_hosts:
- "dockerhost:<yourIP>"
これにより、あなたのコンテナはあなたのホストにアクセスできるようになります。 DBにアクセスするときは、以前に指定した名前(この場合は "dockerhost")と、DBが稼働しているホストのポートを忘れずに使用してください。
Windows 10 Home上でDocker Toolboxを使用しても、答えはどれも私にとってはうまくいきませんでしたが、 10.0.2.2 でした。これは、ホストをこのアドレスのVMに公開するVirtualBoxを使用するためです。