web-dev-qa-db-ja.com

Docker1.13「スウォームモード」クラスター用のnginxリバースプロキシ

2つのノードで実行されている既存のdockerswarmクラスターがあり、リバースプロキシ用にnginxを追加したいと思います。私は解決方法がわからないいくつかの問題に直面しているので、この質問をしています。

私の最初の質問は、Swarm内でnginxを実行し、適切な名前を使用してアプリコンテナーにアクセスできるようにすることです。まず、これがdocker network lsの出力です。

6897486e798b        bridge              bridge              local
3c5b72414821        docker_gwbridge     bridge              local
6f762b23ff12        Host                Host                local
uwy3qfuu4oos        ingress             overlay             swarm
0e867cd5a3bf        none                null                local

別のオーバーレイネットワークを作成し、そのオーバーレイネットワークに含まれるようにNginxを設定する必要がありますか?私は次の方法でnginxサービスを作成しています:

docker service create rproxy -p 80:80 --mount type=volume,source=rproxy,target=/etc/nginx --mode=global nginx:Alpine

このコマンドを使用すると、すべてのノードでnginxが作成され、ブラウザーを使用してデフォルトのnginx「helloworld」画面にアクセスできます。

Nginx構成用のボリュームをマウントしたので、/var/lib/docker/volumes/rproxy/_dataからnginx構成にアクセスできます。そこで、/etc/nginx/conf.dに入り、defaultを削除して、単純な仮想ホストを作成しました。

server {
    listen 80;
    location / {
        proxy_pass http://myapp:80;
    }
}

Nginxを再起動したとき、Host "myapp" does not existというnginxエラーが原因で、サーバーが起動しませんでした。 myappサービスからポートを公開すると、次のようなものを使用してプロキシできるようになります。

proxy_pass http://0.0.0.0:SOME_PORT;

ポートを公開していませんが、それぞれのサービス名を使用してコンテナにアクセスしたいと思います。これは可能ですか?はいの場合、どうすればよいですか?

私の2番目の質問は、構成ファイルの保存に関するものです。単一のボリュームを作成する方法はありますか群れの中でそしてすべてのノードからそのボリュームにアクセスしますか? nginxが構成をメモリにロードするときにボリュームがswarmmanagerサーバーに保存されていてもかまいません。これは、パフォーマンスに影響を与えません。

編集:1.13が最新のものだと思って、インストール時にDockerのバージョンを確認しませんでした。 Dockerバージョン17.06.1-ce、ビルド874a737

3
Gasim

別のオーバーレイネットワークを作成し、そのオーバーレイネットワークに含まれるようにNginxを設定する必要がありますか?.

コンテナ間で通信するには、nginxコンテナとターゲットアプリケーションが同じDockerネットワーク上にある必要があります。 nginxコンテナを複数のアプリケーション固有のネットワークに追加することも、1つのプロキシネットワークを作成してすべてのアプリケーションをそのネットワークに接続することもできます。 docker runコマンドから、単一のネットワークに接続できます。複数のネットワークの場合、難しい方法として、docker createを実行する前にdocker network connectを実行してからdocker startを実行できます。簡単な方法は、これらの手順を自動化するdocker-compose.ymlファイルを使用して、コンテナーを複数のネットワークに接続することです。

群れに単一のボリュームを作成し、すべてのノードからそのボリュームにアクセスする方法はありますか? nginxが構成をメモリにロードするときにボリュームがswarmmanagerサーバーに保存されていてもかまいません。これは、パフォーマンスに影響を与えません。

リモートnfsサーバーに接続するボリュームを作成できます。リモートnfs共有を使用するdockerコマンドの例を次に示します。

# create a reusable volume
$ docker volume create --driver local \
    --opt type=nfs \
    --opt o=addr=192.168.1.1,rw \
    --opt device=:/path/to/dir \
    foo

# or from the docker run command
$ docker run -it --rm \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/Host/path \
  foo

# or to create a service
$ docker service create \
  --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,volume-opt=o=addr=192.168.1.1,volume-opt=device=:/Host/path \
  foo
1
BMitch