Dockerコンテナーからホストデータベースにアクセスする


131

一部のホストマシンでmysqlデータベースを実行していて、そのホストもdockerコンテナーを実行している場合:ホストで実行しているdockerコンテナー内からmysqlデータベースにアクセスするにはどうすればよいですか。

たとえば、ホストポートをコンテナーに公開する方法はありますか(docker run -pの動作の逆)?


1
MySQLサーバーがポートでリッスンしている場合、コンテナーは他のインターネット接続のようにそのポートのホストに接続できませんか?
jwodder 2015年

回答:


87

これを一貫性のある、よく理解された移植可能な方法で行う方法については、いくつかの長年にわたる議論があります。完全な解決策はありませんが、以下のディスカッションにリンクします。

いずれにせよ、多くの場合、-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/

コンテナーからホストにアクセスすることに関するディスカッション:

https://github.com/docker/docker/issues/1143

https://github.com/docker/docker/issues/10023


NGINXリバースプロキシの背後でも機能しますか?
kta

89

18.03のドキュメントから:

コンテナからホスト上のサービスに接続したい

ホストのIPアドレスが変化している(ネットワークアクセスがない場合は変化しない)。18.03以降はhost.docker.internal、ホストが使用する内部IPアドレスに解決される特別なDNS名に接続することをお勧めします。

ゲートウェイはとしても到達可能gateway.docker.internalです。

例:ホスト上のMySQLインスタンスにアクセスするためにコンテナ内のMySQL接続文字列に使用するものは次のとおりです。

mysql://host.docker.internal:3306/my_awesome_database

31
ヒントと同じように、これは今のところMacとWinでのみ機能します
flp

あなたは私の日を救った:)
amjad '10 / 10/18

4
賛成票。答えだけでなく、例を挙げて使用する方法も必要になるためです。
granadaCoder

私はこれを達成するためにほぼ2時間を費やしました。
Ashish Bainade

@flpが書いたようなLinuxのサポートはまだありません。これがgithubの問題です。
GAltelino

34

Docker 17.06以降、特別なMac専用のDNS名が、ホストのIPアドレスに解決されるdockerコンテナーで使用できます。それは:

docker.for.mac.localhost

ドキュメントはこちら:https : //docs.docker.com/docker-for-mac/networking/#httphttps-proxy-support


3
docker.for.mac.host.internalDocker 17.12.0 ce以降。docs.docker.com/docker-for-mac/release-notes/...
斬月

docker.for.mac.localhost 作業中18.03.1-ce-mac65
cdignam 2018

24

Docker 18.03以降のhost.docker.internalを使用します。


2
どうやって ?使い方の例を教えていただけますか?
danfromisrael

Docker化されたmysqlを実行してみませんか?
イゴールデオリヴェイラサ

私の場合は機能しませんDocker version 18.03.0-ce, build 0520e24
scythargon

@IgorDeOliveiraSá次のシナリオを想像してみてください。開発環境で127.0.0.1:3306をリッスンするデータベースがあり、本番環境で127.0.0.1:3306をリッスンしているデータベースがあります。 mysqlをローカルでdockeriseし、本番用に別の解決策を見つけるか、dockerからポートに接続するだけで、両方のケースで機能します
Drachenfels

1
docker.for.mac.localhostが私のために働く18.03.1-ce-mac65
cdignam '12 / 07/18

21

他の答えは私にはうまくいきませんでした。私のコンテナはhost.docker.internalを使用してホストIPを解決できませんでした。2つの方法があります

  1. ホストネットワークの共有--net = host:

    docker run -it --net=host  myimage
    
  2. 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つのファイルを編集する必要があります

  1. すべてのアドレスでリッスンするようにpostgresql.confを編集します。デフォルトでは、localhostを指します。

    listen_addresses = '*'
    
  2. pg_hba.confを編集して、すべてのアドレスからの接続を許可します。最後の行に追加:

    host     all             all             0.0.0.0/0               md5
    

重要:データベースアクセスを更新する最後のステップは、実際に何をしているのか確信が持てない限り、本番環境での使用はお勧めしません。


--net = hostはCI環境で私に役立ちました。
Samy
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.