2017-05-10 8 views
0

私は、Nginxを通じてUWSGI Flask Apiと通信するAngular Appを開発しました。現在、私は3つのコンテナを持っています。(Angular [web_admin]、Api [api_admin]、Nginx [nginx]Docker-Compose - 「内部」APIとの通信。

開発マシンで実行しているとき、通信は正常に動作しています。角度のあるリクエストは、URL:http://localhost:5000とapiのレスポンスがうまくいっていて、すべてうまくいきます。

しかし、プロダクションサーバーにデプロイすると、ポート5000がファイアウォールで開かれていないため、アプリケーションが動作していないことがわかりました。

私の質問は親切で簡単ですが、外側から呼び出すのではなく、内部ネットワーク経由でAPIコンテナを呼び出すには、どうやって角コンテナを作成しますか?

version: '2' 

services: 
    data: 
    build: data 

    neo4j: 
    image: neo4j:3.0 
    networks: 
     - back 
    volumes_from: 
     - data 
    ports: 
     - "7474:7474" 
     - "7473:7473" 
     - "7687:7687" 
    volumes: 
     - /var/diariooficial/neo4j/data:/data 

    web_admin: 
    build: frontend/web 
    networks: 
     - front 
     - back 
    ports: 
     - "8001:8001" 
    depends_on: 
     - api_admin  
    links: 
     - "api_admin:api_admin" 
    volumes: 
     - /var/diariooficial/upload/diario_oficial/:/var/diariooficial/upload/diario_oficial/ 

    api_admin: 
    build: backend/api 
    volumes_from: 
     - data  
    networks: 
     - back 
    ports: 
     - "5000:5000" 
    depends_on: 
     - neo4j 
     - neo4jtest 
    volumes: 
     - /var/diariooficial/upload/diario_oficial/:/var/diariooficial/upload/diario_oficial/ 

    nginx: 
    build: nginx 
    volumes_from: 
     - data  
    networks: 
     - back 
     - front 
    ports: 
     - "80:80" 
     - "443:443" 
    volumes: 
     - /var/diariooficial/log/nginx:/var/log/nginx 
    depends_on: 
     - api_admin  
     - web_admin 

networks: 
    front: 
    back: 

答えて

1

リンクは、サービスに対してネットワーク上にDNS名を作成します。 localhost:5000の代わりにapi_admin:5000web_adminサービスの話がある必要があります。 api_admin DNS名はapi_adminサービスの1つのIPアドレスに解決されます。

は具体的には、説明のためのhttps://docs.docker.com/compose/networking/を参照してください:

各コンテナは、現在のホスト名のWebやDBを検索し、適切なコンテナのIPアドレスを取り戻すことができます。たとえば、WebのアプリケーションコードはURL postgres:// db:5432に接続し、Postgresデータベースの使用を開始できます。

+0

お返事ありがとうございました。私はNginxでDNS名を使用していますが正常に動作しますが、角度がDNS名を変換しない理由はわかりません。 $ http.get(__env.apiUrl + '/ websites') オプションhttp:// api_admin:5000/auth/login net :: ERR_NAME_NOT_RESOLVED –

+1

これはブラウザのJavaScriptコードからアクセスしていますか?その場合、要求はDockerネットワークの外部から取得されます。実行時に '__env.apiUrl'を設定する方法を提供する必要があります。あなたの質問はhttp://stackoverflow.com/a/42938882/684908に似ているようですね。この場合のあなたのURLは、DockerホストのIPアドレスになります(例えば、Docker Machineを搭載した私のラップトップでは、私のDockerホストは192.168.99.100です)。 –

関連する問題