2

私はウェブアプリケーションを持っています。

  1. パブリック Web アプリ (app1)
  2. API Web アプリ (app2)

このアプリの docker 構成を作成します。コンテナー内の各アプリケーション。このアプリケーションに Web からアクセスするには、nginx で構成されたコンテナで、nginx がすべてのリクエストをプロキシします。
だから私は実行できます - http://app1.dev/http://app2.dev/

しかし、app1 からhttp://app2.dev/にアクセスする必要があります(app1 コンテナーからホスト app2.dev にアクセスします)。

ping (app1 コンテナーから):

PING app2.dev (127.0.53.53) 56(84) bytes of data.
64 bytes from 127.0.53.53: icmp_seq=1 ttl=64 time=0.027 ms
64 bytes from 127.0.53.53: icmp_seq=2 ttl=64 time=0.038 ms
64 bytes from 127.0.53.53: icmp_seq=3 ttl=64 time=0.038 ms

app1 コンテナーからhttp://app2.dev/ホストにアクセスするには、他に何を構成する必要がありますか?

Nginx プロキシ設定

upstream app1_upstream {
    server app1;
}
upstream app1_upstream {
    server app2;
}
server {
    listen 80;

    server_name app1.dev
                app2.dev;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_cache_bypass $http_upgrade;

        if ($host = "app1.dev") {
            proxy_pass http://app1;
        }

        if ($host = "app2.dev") {
            proxy_pass http://app2;
        }
    }

    error_log  /var/log/nginx/proxy_error.log;
    access_log /var/log/nginx/proxy_access.log;
}

Docker 構成

version: '2'
services:
    proxy:
        build: ./proxy/
        ports:
            - "80:80"
            - "443:443"
        links:
            - app1
            - app2
            - app1:app1
            - app2:app2
        hostname: proxy

    app1:
        build: ./app1/
        volumes:
            - ../app1/:/var/www/app1
        hostname: app1

    app2:
        build: ./app2/
        volumes:
            - ../app2/:/var/www/app2
        hostname: app2

docker-compose ps

app1      /sbin/my_init  Up      80/tcp                                   
app2     /sbin/my_init  Up      80/tcp                                   
proxy_1   /sbin/my_init  Up      0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp
4

2 に答える 2

1

実行している docker のバージョンは不明ですが、1.10 を実行している (または実行できる) 場合は、「リンク」を使用する代わりに docker ネットワークを使用する必要があります。

3 つのコンテナーすべてを同じ docker ネットワークで実行すると、コンテナー名を介して相互にアクセスできます。

これにより、プロキシを経由せずに app1 から app2 への呼び出しを行うことができます (インターフェイスを app2 に変更する場合、app1 とプロキシを更新する必要があるかのように、これをアンチパターンと呼びますが、私はプロキシを介して app1 が app2 を呼び出すようにして、1 つのインターフェイスを維持します)。

Docker ネットワークの詳細については、 https ://docs.docker.com/engine/userguide/networking/dockernetworks/ を参照してください。

TLDR:

# create bridge network (for single host)
docker networks create my-network

次に、構成も変更します。

version: '2'
services:
    proxy:
        build: ./proxy/
        ports:
            - "80:80"
            - "443:443"
        networks:
            - my-network
        hostname: proxy

    app1:
        build: ./app1/
        volumes:
            - ../app1/:/var/www/app1
        networks:
            - my-network
        hostname: app1

    app2:
        build: ./app2/
        volumes:
            - ../app2/:/var/www/app2
        networks:
            - my-network
        hostname: app2

networks:
   my-network:
    external: true
于 2016-03-17T17:09:20.950 に答える
0
ports:
    - "80:80"
    - "443:443"

ポートをホスト マシンに公開します。あなたがするとき

docker ps -a

これらのポートが一覧表示されます

ただし、コンテナー間でポートを公開するには、dockerfile で EXPOSE コマンドを使用する必要があります。

https://docs.docker.com/engine/reference/builder/#expose

What i should configure else, to have access to http://app2.dev/ host from app1 container?

dockerfile でポートを公開する必要があります。

また、あなたがするなら...

docker exec -it containerName bash

探索できるようになります。

コンテナー内のホスト ファイルを表示します。

cat /etc/hosts

コンテナを正しくリンクすると、hosts ファイルに他のコンテナのエントリが表示されます。

hosts ファイルのドメイン名を使用して ping を実行できます。

于 2016-03-17T16:39:52.473 に答える