質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Q&A

解決済

1回答

1892閲覧

リバースプロキシ・バーチャルホストで複数Webサービスを運用する際に,あるサービスを稼働させたり停止させたりしたい

akamakku

総合スコア191

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

nginx

nginixは軽量で高性能なwebサーバーの1つです。BSD-likeライセンスのもとリリースされており、あわせてHTTPサーバ、リバースプロキシ、メールプロキシの機能も備えています。MacOSX、Windows、Linux、上で動作します。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

0グッド

1クリップ

投稿2019/06/10 10:48

編集2019/06/11 04:12

前提・実現したいこと

  • 1つのVPN上でnginxのリバースプロキシでVirtualHostを切って,複数のWebアプリを稼働させたい
  • 常に動かしておくもの(app1)と,使うときだけ動かすもの(app2)がある
  • それぞれのアプリは別のリポジトリで管理される
  • 3つのコンテナ(nginx, app1, app2)をdocker-composeでシュッと起動させたい

考えたこと

  • おそらく3つのコンテナを一気に起動するのは,docker-composeのfオプションで複数のymlファイルを渡せばできそう?
  • (当たり前だが)app2を起動させる場合とさせない場合,両方の設定ファイルを用意すれば実現はできそう

聞きたいこと

  • app2を起動させる場合とさせない場合は単純に2つの場合のnginxの設定ファイルとdocker-compose.ymlファイルを用意するしかないんでしょうか?(あまりスマートではない気がする)

(追記)

suamaさんの回答で

docker-compose up nginx app1 docker-compose up app2 docker-compose down app2

のような形でコンテナを個別に指定して起動できることはわかったのですが,
app2のコンテナが起動していない際にnginxに(接続先が存在しない旨の)不要なエラーが出力されてしまうのが気になって,その設定も変えられたら良いなと思っているんですがこれは流石に不可能ですかね

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんばんは。
はずしているかもしれませんが、思いつくあたりを書いてみます。(前提などが違ってましたらご容赦ください)

1つのdocker-compose.ymlに、サービス(nginx, app1, app2) を記載しておき、

  • docker-compose up nginx app1 で起動したいサービスを明示して起動
  • app2が必要になった時に、docker-compose up app2 でapp2のみあとから起動
  • app2が要らなくなったら docker-compose down app2 でapp2のみ停止

ということではダメでしょうか。
メリットとしては、1つのymlに記載だと名前解決がしやすくなるというあたりかと思います。
(nginxからそれぞれを app1:3000, app2:3000 とかで参照できる)

ただし、docker-compose up としてサービス名を明示しない場合は、3つ全部起動になります。

投稿2019/06/10 13:42

編集2019/06/10 13:44
suama

総合スコア1997

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

akamakku

2019/06/10 13:51

回答ありがとうございます サービスを明示して個別に起動できるのを初めて知りました! ただ, app1とapp2は全く別のアプリなので別のリポジトリで開発したくて,その場合は2つを別で`docker build`しておいてdocker-compose.ymlでimageを指定する形になるんでしょうか?(この手間は仕方ない?) また, サービスを個別で指定して起動できるということで一歩前進した感じはあるんですが,app2が起動していない際にnginxに不要なエラーが出力されてしまうのが気になって,その設定も変えられたら良いなと思っているんですがこれは流石に不可能ですかね..
akamakku

2019/06/10 14:07 編集

不可能と言うか,単純にnginxの設定ファイルを差し替えるしかないんですかね そして設定ファイルを差し替えるということは(volumesでコンテナ内に置く設定ファイルをかえるので,)docker-compose.ymlファイルから変える必要があるという認識で良いですかね
suama

2019/06/10 15:04

> その場合は2つを別で`docker build`しておいてdocker-compose.ymlでimageを指定する形 はい、わたしが今扱っているのは、そんな形です。ビルドしておくというか、イメージとして登録しておいて、docker-compose内では image: app1_image みたいな感じで呼び出しています。 > app2が起動していない際にnginxに不要なエラーが出力されてしまう なるほど。そのあたりは、質問のほうに追記いただけるといいいかなと思います。
akamakku

2019/06/10 16:48

ありがとうございます そうします
suama

2019/06/10 22:21

エラーの内容はどのようなものでしょうか?そちらがあるほうがいいかなと思います。
mosapride

2019/06/11 01:23

suamaさんの意見に賛成(down)なのでここに書かせていただきます。 Dockerと考えずに物理サーバーで考えてた場合でも、app2サーバーをシャットダウンするかポートを塞ぐなどの処置をするパターン(down app2)か、nginxサーバーの設定を変更するかの2択になると思います。 `down app2`の場合はnginxにエラーが発生するかもしれませんが、それは正常なエラーなので気にしなくて良いのではないかと思いますが、nginxサーバーにシェルを作ってconfを変更+nginx -s reloadをする手もありますね。 個人的にはエラーが出てもdocker downで止めてるのが好きですね。ホストOSから確認ができる(docker ps)ので。 nginxの設定を変えた場合はpsで見たときに全て起動状態になっているため、nginxの設定を見るのは面倒ですし、confがコロコロ変わるのは違和感があるので。
mosapride

2019/06/11 01:25

(連投失礼です。) あと、downの場合はdockerコンテナは止まってるのでリソースの節約にもなりますね。
akamakku

2019/06/11 04:20

tenpaさんコメントありがとうございます app2のコンテナを止めたいのはそうなんですが,同時にnginxの設定も変更するのが理想だと思います.その場合は一回`docker-compose down`して,http://docs.docker.jp/compose/extends.html にあるような拡張で変更を加えるのがいいんですかね
suama

2019/06/11 04:48

tenpaさん、コメントありがとうございます! akamakkuさん、app2が停止している際は、「app2用のVirtualHostの設定自体を無くしたい」感じなんでしょうか?(app2.example.comでのListen自体させない) やりかたはどちらにしても、 app2用のバーチャルホストの追加設定は *.conf みたいに切り出しておいて、 app2を上げるときに includeを有効にする、 app2を落とす時にはincludeされないようにする(*.confをリネームしてnginxのリロード) といったことができればいいいのかな?という気はします。 あまり深追いできないので、わたしからはこれくらいで。
akamakku

2019/06/11 05:47

そうですね 基本的にdomainを指定せずにIP直打ちなアクセスは弾きたいので,そのような運用を考えています. ありがとうございました.
mosapride

2019/06/11 05:55

nginxの定義の変更するならば docker-compose.ymlはあまり変更したくないので、私ならばnginx(proxy)内にbashスクリプトを配置しておきます。 ```bash(/change.shとする) #!/bin/sh ## confファイルを変更する文 nginx -s reload # nginxの再起動しないとconfの定義がロードされなかったはず。 ``` docker exec -it nginxのコンテナ sh -c 'exec /change.sh' みたいな感じで実行します。 シェルの引数で有効無効を切り替えてもよいかもしれません。 玄人ぶって書いてますがw、サーバーは常時起動していることが前提(普通?)なので本質問はイレギュラーなため、個人の好みで決めちゃって良いかと(おい!)
akamakku

2019/06/11 06:01

なるほど, やはりイレギュラーなことをやろうとしていたんですね とりあえずやってみて,自分の好みを見つけていこうと思います ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問