Docker を使用してアプリケーションをデプロイしようとしていますが、名前付きコンテナーを再起動すると別の IP がコンテナーに割り当てられるという問題に遭遇しました。たぶん、私がやっていることを説明すると、問題がよりよく説明されます:
- Postgres は、という名前の別のコンテナー内で実行されます。
"postgres"
$ PG_ID=$(docker run --name postgres postgres/image)
- 私の webapp コンテナは postgres コンテナにリンクしています
$ APP_ID=$(docker run --link postgres:postgres webapp/image)
postgres コンテナ イメージを webapp コンテナにリンクすると、postgres コンテナの IP を持つ hosts ファイル エントリが webapp コンテナに挿入されます。これにより、webapp 内で postgres db を指すことができますpostgres:5432
(私は Django を使用しています)。何らかの理由で postgres がクラッシュした場合を除いて、これはすべてうまく機能します。
postgres プロセスを手動で停止して postgres プロセスのクラッシュをシミュレートする前に、postgres コンテナーの IP を確認します。
$ docker inspect --format "{{.NetworkSettings.IPAddress}}" $PG_ID
172.17.0.73
クラッシュをシミュレートするために、postgres コンテナーを停止します。
$ docker stop $PG_ID
今私が使用してpostgresを再起動する場合
$ docker start $PG_ID
コンテナーの ip が変更されます。
$ docker inspect --format "{{.NetworkSettings.IPAddress}}" $PG_ID
172.17.0.74
したがって、webapp コンテナー内の postgres コンテナーを指す IP は正しくありません。コンテナーに名前を付けることで、docker は特定の構成で名前を割り当てるので、コンテナー間 (ネットワークとボリュームの両方) を確実にリンクできます。IPが変更された場合、これは目的を無効にしているようです.
postgres を再起動するたびに webapp プロセスを再起動する必要がある場合、単一のコンテナーを使用して両方のプロセスを実行するよりも良いとは思えません。次に、スーパーバイザーまたは同様のものを使用して、両方を実行し続け、localhost
プロセス間のリンクに使用できます。
私はまだ Docker に慣れていないので、何か間違ったことをしているのですか、それとも Docker のバグですか?