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
別のオーバーレイネットワークを作成し、そのオーバーレイネットワークに含まれるように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