2016-11-24 8 views
0

私のドッカーコンテナから、127.0.0.1でホスト上で実行されているMySQLサーバにアクセスしたいとします。ホストからコンテナコンテナ上で実行されているWebサーバーにアクセスしたい私はこれを試してみました:docker:コンテナとホストポートの相互アクセス

docker run -it --expose 8000 --expose 8001 --net='host' -P f29963c3b74f 

しかし、ポートのどれもが露出として表示:

$ docker ps 
CONTAINER ID  IMAGE    COMMAND     CREATED    STATUS    PORTS    NAMES 
093695f9bc58  f29963c3b74f  "/bin/sh -c '/root/br" 4 minutes ago  Up 4 minutes       elated_volhard 
$ 
$ docker port 093695f9bc58 

私はポートが公開され、--net='host'を持っていない、と私は上のWebサーバにアクセスできる場合コンテナ。

どのようにホストとコンテナが相互にポートにアクセスできますか?

答えて

0

、ユーザーが定義し--expose

(サービスがリッスン)コンテナ内部のポート番号は、クライアントが接続 コンテナ(の外に露出したポート番号と一致する必要はありません )。たとえば、コンテナ のHTTPサービスはポート80でリッスンしています(したがって、画像開発者 はDockerファイルでEXPOSE 80と指定しています)。実行時には、ポート がホスト上の42800にバインドされている可能性があります。ホストポート と公開されているポートの間のマッピングを見つけるには、ドッカーポートを使用します。 --net=host

=「ホスト」--networkは、D-バスなどのローカル・システム・サービスへのコンテナの完全なアクセスを与え、したがって安全でないと考えられます。

ここでは、すべてのポートがホスト用に開かれているため、「ポート」には何もありません。

あなたがドッキングウィンドウインターフェイス
とドッキングウィンドウコンテナからホストポートにアクセスすることができhostネットワークを使用したくない場合 - How to access host port from docker container
- From inside of a Docker container, how do I connect to the localhost of the machine?

ホストからコンテナにアクセスする場合は、ホストインターフェイスにポートを公開するにはが必要です。

-Pオプションは、すべてのポートをホストインターフェイスに公開します。 Docker のホスト上の任意のポートに公開された各ポートをバインドします。 ポートの範囲は、 /proc/sys/net/ipv4/ip_local_port_rangeで定義されたエフェメラルポートの範囲内です。 -pフラグを使用して、 ポートの単一のポートまたは範囲を明示的にマッピングします。

つまり、ちょうど--expose 8000を定義すると、ポートは8000ではなくランダムなポートに公開されます。ホストにポート8000​​を表示させたい場合は、公開されたポート-p 8000:8000をマップする必要があります。

+0

私は物事をテストしているので、ドッカーはホスト上のランダムなポートを使用しても問題ありません。 programmerqの投稿から、 '' ' - net = host'''を使うときはポートを公開/マップできないようです。 – user2233706

+0

@ user2233706 '--net = host'を使うときは、ポートを公開することはできません(それは意味がありません。 portsを公開しないと、ホストはどのように公開されたポートを知っていますか? '8000-> XXXX'?ホストのポートは 'docker0'インタフェース(それぞれ' IP')でアクセスする必要があります。 – VladoDemcak

0

Dockerのネットワークモデルは、コンテナの新しいネットワーク名前空間を作成することです。これは、コンテナが独自の127.0.0.1を取得することを意味します。コンテナが、ホスト上の127.0.0.1だけをリッスンしているmysqlサービスに到達するようにしたい場合、それにアクセスすることはできません。

--net=hostあなたのコンテナをホストと同じネットワーク名前空間に入れますが、これはドッカーが持っている他のネットワーク機能のすべてを効果的にオフにしているのでお勧めできません。ポートの公開/公開などを取得する

ベストソリューションはおそらく、ドッカーのコンテナからルーティング可能なインタフェースでmysqlサーバをリッスンさせることです。

パブリックインターフェイスにリッスンさせたくない場合は、ブリッジインターフェイスを作成し、ランダムなIP(競合がないことを確認してください)、何も接続せずにmysqlはそのIPと127.0.0.1でのみリッスンします。たとえば、次のようになります。

sudo brctl addbr myownbridge 
sudo ifconfig myownbridge 10.255.255.255 
sudo docker run --rm -it alpine ping -c 1 10.255.255.255 

このIPアドレスは、ホストとそのホスト上で動作するコンテナの両方からルーティング可能です。

もう1つの方法は、mysqlサーバをコンテナ化することです。あなたは他のコンテナと同じネットワーク上に置くことができ、そうすることができます。ポート3306をホストの127.0.0.1インターフェイスに公開することもできます。

+1

[this](http://serverfault.com/questions/139323/mysql-bind-to-more-than-one-ip-address)によれば、MySQLは複数のIPアドレスでリッスンすることはできません。あなたのスクリプトは動作していますが、 '' 'my.cnf'''に' 'bind-address = 10.255.255.255'''を設定しても、MySQLサーバに接続できません。 – user2233706

+0

私はコンテナ内でMySQLを実行するつもりです。 – user2233706

+0

あなたはまた、そのIPでリッスンするようにmysqlを設定する必要があります。 – programmerq

関連する問題