再起動しても壊れないように、Dockerコンテナ間の連携を設定するにはどうしたらいいですか?
質問内容
のような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 です。
関連
-
[解決済み] 古いDockerコンテナを削除する方法
-
[解決済み] Dockerコンテナに環境変数を渡すにはどうしたらいいですか?
-
[解決済み] Dockerでコンテナを一覧表示する方法
-
[解決済み】Dockerコンテナでボリュームをリストアップする方法は?
-
[解決済み】npmを使用してpackage.jsonの依存関係を現在のディレクトリにインストールするにはどうすればよいですか?
-
[解決済み] gulpで再帰的にディレクトリをコピーするにはどうすればよいですか?
-
[解決済み] Azureのデプロイメントに時間がかかるのはなぜですか?
-
[解決済み] 開発コードと本番コードのメンテナンスはどのように行っていますか?[クローズド]
-
[解決済み] IIS 7 サイトを別のサーバーに移行するにはどうすればよいですか?
-
[解決済み] Heroku上のステージングインスタンス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン