1. ホーム
  2. deployment

再起動しても壊れないように、Dockerコンテナ間の連携を設定するにはどうしたらいいですか?

2023-07-22 05:29:53

質問内容

のようなDockerコンテナをいくつか動かしています。

  • Nginx
  • ウェブアプリ 1
  • ウェブアプリ2
  • PostgreSQL

NginxはWebアプリ1、2内のWebアプリケーションサーバに接続する必要があり、WebアプリはPostgreSQLと通信する必要があるため、このような連携をしています。

  • Nginx --- リンク ---> ウェブ アプリ 1
  • Nginx --- リンク ---> ウェブアプリ 2
  • ウェブアプリ 1 --- link ---> PostgreSQL
  • Web アプリ 2 --- リンク ---> PostgreSQL

これは、最初のうちはかなりうまくいきます。しかし、新しいバージョンの Web アプリ 1 と Web アプリ 2 を開発したときに、それらを置き換える必要があります。私が行うことは、Web アプリのコンテナーを削除し、新しいコンテナーをセットアップして、それらを起動することです。

Webアプリのコンテナについて、最初のIPアドレスは次のようなものです。

  • 172.17.0.2
  • 172.17.0.3

そして入れ替えた後は、新しいIPアドレスになります。

  • 172.17.0.5
  • 172.17.0.6

さて、Nginx コンテナで公開されているこれらの環境変数は、まだ古い IP アドレスを指しています。ここで問題が発生します。コンテナ間の連携を壊さずにコンテナを置き換えるにはどうしたらよいでしょうか?同じ問題は、PostgreSQL にも起こります。PostgreSQL のイメージのバージョンをアップグレードしたい場合、確かにそれを削除して新しいものを実行する必要がありますが、その場合、コンテナグラフ全体を再構築する必要があるため、実際のサーバー運用には向いていません。

どのように解決するのですか?

の効果は --link は静的なものなので、あなたのシナリオには使えません(現在、再リンクはできませんが リンクを削除する ).

dockerize.it では、これを解決するために、リンクやアンバサダーを使わない 2 種類のアプローチを使っています (アンバサダーを追加することもできますが)。

1) ダイナミックDNSを使用する

一般的な考え方は、データベース (またはその他のサービス) に単一の名前を指定し、コンテナを起動および停止するときに実際の IP で短命の DNS サーバーを更新することです。

私たちはまず SkyDock . これは2つのDockerコンテナ、DNSサーバー、そしてそれを自動的に更新し続けるモニターで動作します。その後、私たちはよりカスタムな Consul を使用するようになりました (これもドッカー化されたバージョンを使用しています。 docker-consul ).

これの発展形として、(まだ試していませんが)etcdなどをセットアップして、そのカスタムAPIを使ってIPとポートを学習させることが考えられます。ソフトウェアは動的な再構成もサポートする必要があります。

2) docker bridge ip を使用する

コンテナポートを公開する場合、単にポートを docker0 ブリッジにバインドすればよいのです。

コンテナを新しいバージョンに置き換えるとき、新しいコンテナは同じ IP で同じポートを公開するようにするだけです。

これはよりシンプルですが、より限定的でもあります。類似のソフトウェアを実行している場合、ポートの競合が発生する可能性があります (たとえば、2 つのコンテナは、3306 ポートを docker0 ブリッジの 3306 ポートをリッスンできない) など...そのため、現在のお気に入りはオプション 1 です。