微服务启动的时候,会自动向服务注册中心报告自己的ip和端口。但是服务是在docker容器内运行的,注册的ip就成了172开头的docker内部ip, 这个地址是无法被其它机器访问的。
这种情况是不是必须手动将服务注册的地址改成宿主机的地址和端口呢,有其它好方案没
----- update -----
docker 1.12版本以后engine有了swarm模式,经测试使用swarm的overlay网络可解决跨主机通讯问题,这种方案是否合适呢
高洛峰2017-04-27 09:05:14
docker swarm によって提供されるオーバーレイ ネットワークは、ホスト間のコンテナ内ネットワーク通信を提供でき、ローカル コンテナは起動時にネットワークを指定して内部ネットワークを形成でき、etcd、consul を使用して nginx を swarm ホスト上にホスト モードでデプロイできます。サービスを登録し、nginx のリバース プロキシ構成を更新して、動的なサービス検出を実現します。
ただし、現在、オーバーレイはすべてのクロスホスト通信方法の中で最もパフォーマンスの低下が大きく、60% に達しています。誰かがオンラインでテストを行っているので、チェックしてみることができます。したがって、現時点では、本番環境では依然として kubernetes または mesos を考慮する必要があります
PHP中文网2017-04-27 09:05:14
いくつかのアイデアがあります:
1. サービスの開始時に、ホストデバイスが IP を報告します。
2. サービスの開始時に、ホストの IP 情報をコンテナーの環境変数に挿入します。
3. 登録センターが登録リクエストを受信すると、ネットワーク層IPから取得します
曾经蜡笔没有小新2017-04-27 09:05:14
コンテナは動的であるため、通常、IP アドレスはランダムに割り当てられます。コンテナ スケジューリング システムを使用して一部のコンテナを自動的に開始した後、サービス登録を通じてこれらのコンテナのアクセス アドレスをサービス登録センターに記録できます。このようにして、外部サービスがこれらのコンテナにアクセスしたい場合、サービス検出を通じてこれらのコンテナにアクセスできます
世界只因有你2017-04-27 09:05:14
非常にシンプルな、さまざまなクロスホスト Docker ネットワーク通信ソリューション。
kubernetes はフランネルを使用しています。
巴扎黑2017-04-27 09:05:14
他の方法も検討できます
1. kubernetes などのサービス オーケストレーション ツールを使用します (Docker への大幅な変更)
2. consul などの登録センターを使用します (登録センターのコードへの大幅な変更)
マイクロサービスが Spring Cloud を使用する場合は、この問題を完全に解決できる 2 番目のオプションの方が推奨されます