web-dev-qa-db-ja.com

ホストするDocker nginxプロキシ

短い説明:

Dockerで実行されているNginx、呼び出しをホストに転送するようにnginxを構成する方法。

長い説明:

いくつかのバックエンドと通信する1つのWebアプリケーションがあります(rest1、rest2、rest3と言います)。私たちはrest1を担当しています。

私が自分のPCで手動でrest1を開始し、2345ポートで実行していると考えてみましょう。 nginx(dockerで実行中)がすべての呼び出しtorest1を自分の実行中のインスタンスにリダイレクトするようにしたい(注:インスタンスはホスト上で実行されており、コンテナーではなく、Docker内ではありません)。そして、rest2rest3を他のDockerノードに送信したり、他のサーバー(気にする人)に送信したりできます。

私が探しているのは:

  1. docker-compose.yml構成(必要な場合)。
  2. nginx設定。

前もって感謝します。

12
Jahid Shohel

Nginxを次のように構成し(DockerホストのIPを必ず置き換えてください)、default.confとして保存します。

server {
    listen       80;
    server_name  _;
    location / {
        proxy_pass http://<IP of Docker Host>;
        index  index.html index.htm;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

次にコンテナを起動します。

docker run -d --name nginx -p 80:80 -v /path/to/nginx/config/default.conf:/etc/nginx/conf.d/default.conf nginx
4
Farhad Farahi

ソリューション1

network_mode: Hostを使用します。これにより、nginxインスタンスがホストのネットワークインターフェースにバインドされます。これにより、複数のnginxコンテナを実行するときに競合が発生する可能性があります。公開されたすべてのポートがホストのインターフェースにバインドされます。

ソリューション2

外の世界に公開したいすべてのサービスに対して、より多くのnginxインスタンスを実行しています。 nginx構成をシンプルに保ち、すべてのnginxをホストにバインドしないようにするには、コンテナー構造を使用します。

dockerhost-network_mode: Hostのダミーコンテナー

proxy-ホストサービスへのプロキシとして使用されるnginxコンテナ、

dockerhostproxyにリンクすると、proxy contianerに/etc/hostsエントリが追加されます。nginx構成のホスト名として「dockerhost」を使用できます。

docker-compose.yaml

version: '3'
services:
  dockerhost:
    image: Alpine
    entrypoint: /bin/sh -c "tail -f /dev/null"
    network_mode: Host
  proxy:
    image: nginx:Alpine
    links: 
     - dockerhost:dockerhost
    ports:
     - "18080:80"
    volumes:
     - /share/Container/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro

default.conf

 location / {
        proxy_pass http://dockerhost:8080;

このメソッドを使用すると、サーバーで実行されているすべてのサービスに対して証明書を自動で生成できます。興味があれば、解決策の要点を投稿できます。

3
ijavid

Docker Composeファイルバージョン3を使用している場合は、docker-compose.ymlファイルの特別な設定はまったく必要ありません。次のように、特別なDNS名Host.docker.internalを使用してホストサービスにアクセスしますnginx.confの例:

events {
    worker_connections  1024;
}

http {
    upstream Host_service {
       server Host.docker.internal:2345;
    }

    server {
        listen 80;

        access_log  /var/log/nginx/http_access.log  combined;
        error_log   /var/log/nginx/http_error.log;

        location / {
            proxy_pass http://Host_service;

            proxy_set_header    Host                $http_Host;
            proxy_set_header    X-Real-IP           $realip_remote_addr;
            proxy_set_header    X-Forwarded-Proto   $scheme;
            proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;

            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }
    }
 }

1
danielrg