一部のホストマシンでmysqlデータベースを実行していて、そのホストもdockerコンテナーを実行している場合:ホストで実行しているdockerコンテナー内からmysqlデータベースにアクセスするにはどうすればよいですか。
たとえば、ホストポートをコンテナーに公開する方法はありますか(docker run -pの動作の逆)?
一部のホストマシンでmysqlデータベースを実行していて、そのホストもdockerコンテナーを実行している場合:ホストで実行しているdockerコンテナー内からmysqlデータベースにアクセスするにはどうすればよいですか。
たとえば、ホストポートをコンテナーに公開する方法はありますか(docker run -pの動作の逆)?
回答:
これを一貫性のある、よく理解された移植可能な方法で行う方法については、いくつかの長年にわたる議論があります。完全な解決策はありませんが、以下のディスカッションにリンクします。
いずれにせよ、多くの場合、-add-hostオプションを使用してdocker runを実行し、ホストのIPアドレスをコンテナーの/ etc / hostファイルに追加します。そこから、必要なポートでホストに接続するのは簡単です。
コンテナーホストファイルへのエントリの追加
1つ以上の--add-hostフラグを使用して、コンテナの/ etc / hostsファイルに他のホストを追加できます。この例では、dockerという名前のホストの静的アドレスを追加します。
$ docker run --add-host=docker:10.180.0.1 --rm -it debian $$ ping docker PING docker (10.180.0.1): 48 data bytes 56 bytes from 10.180.0.1: icmp_seq=0 ttl=254 time=7.600 ms 56 bytes from 10.180.0.1: icmp_seq=1 ttl=254 time=30.705 ms ^C--- docker ping statistics --- 2 packets transmitted, 2 packets received, 0% packet loss round-trip min/avg/max/stddev = 7.600/19.152/30.705/11.553 ms
注:Dockerホストに接続する必要がある場合があります。これは、ホストのIPアドレスを取得することを意味します。次のシェルコマンドを使用して、このプロセスを簡略化できます。
$ alias hostip="ip route show 0.0.0.0/0 | grep -Eo 'via \S+' | awk '{ print $2 }'" $ docker run --add-host=docker:$(hostip) --rm -it debian
ドキュメンテーション:
https://docs.docker.com/engine/reference/commandline/run/
コンテナーからホストにアクセスすることに関するディスカッション:
18.03のドキュメントから:
コンテナからホスト上のサービスに接続したい
ホストのIPアドレスが変化している(ネットワークアクセスがない場合は変化しない)。18.03以降は
host.docker.internal
、ホストが使用する内部IPアドレスに解決される特別なDNS名に接続することをお勧めします。ゲートウェイはとしても到達可能
gateway.docker.internal
です。
例:ホスト上のMySQLインスタンスにアクセスするためにコンテナ内のMySQL接続文字列に使用するものは次のとおりです。
mysql://host.docker.internal:3306/my_awesome_database
Docker 17.06以降、特別なMac専用のDNS名が、ホストのIPアドレスに解決されるdockerコンテナーで使用できます。それは:
docker.for.mac.localhost
ドキュメントはこちら:https : //docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support
docker.for.mac.localhost
作業中18.03.1-ce-mac65
Docker 18.03以降のhost.docker.internalを使用します。
Docker version 18.03.0-ce, build 0520e24
18.03.1-ce-mac65
他の答えは私にはうまくいきませんでした。私のコンテナはhost.docker.internalを使用してホストIPを解決できませんでした。2つの方法があります
ホストネットワークの共有--net = host:
docker run -it --net=host myimage
dockerのIPアドレスを使用します。これは通常172.17.0.1です。ifconfigコマンドを呼び出して、Dockerインターフェイスのinet addrを取得することで確認できます。
user@ubuntu:~$ ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:a4:a2:b2:f1
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
inet6 addr: fe80::42:a4ff:fea2:b2f1/64 Scope:Link
このIPアドレスを取得したら、それをdocker runの引数として渡してからアプリケーションに渡すか、私が行うように、ボリュームを介してjdbc.propertiesの場所をホストマシンのディレクトリにマッピングし、外部でファイルを管理できるようにします。 。
docker run -it -v /host_dir/docker_jdbc_config:${jetty_base}/var/config myimage
注:データベースで外部接続が許可されていない可能性があります。postgresqlの場合、こことここで説明されているように、2つのファイルを編集する必要があります。
すべてのアドレスでリッスンするようにpostgresql.confを編集します。デフォルトでは、localhostを指します。
listen_addresses = '*'
pg_hba.confを編集して、すべてのアドレスからの接続を許可します。最後の行に追加:
host all all 0.0.0.0/0 md5
重要:データベースアクセスを更新する最後のステップは、実際に何をしているのか確信が持てない限り、本番環境での使用はお勧めしません。