6

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 のバグですか?

4

3 に答える 3

0

https://docs.docker.com/engine/reference/commandline/run/によると、コンテナの作成時に次の--ipオプションを使用して、コンテナに静的 IP を割り当てることができるはずです。

例:

docker run -itd --ip 172.30.100.104 --name postgres postgres/image

....ここで、172.30.100.104 は、カスタム ブリッジ/オーバーレイ ネットワーク上のフリー IP アドレスです。

これにより、postgres コンテナーがクラッシュ/再起動した場合でも、同じ IP アドレスが保持されるはずです。

これは Docker Engine v 1.10 以降でリリースされたようです。したがって、以前のバージョンを使用している場合は、最初にアップグレードする必要があります。

于 2016-08-25T11:53:54.077 に答える
0

2 回目の更新: すでにこれを発見している可能性がありますが、回避策として、データベースを共有するサービスをホスト インターフェイス (ej: with -p 5432:5432) にマップし、webapps をホスト IP (の IP) に接続する予定です。 docker0 インターフェイス: 私の Ubuntu と CentOS では、IP は 172.17.42.1 です)。postgres コンテナーを再起動すると、コンテナーの IP が変更されますが、172.17.42.1:5432 を使用してアクセスできます。欠点は、そのポートをすべてのコンテナーに公開し、 --link が提供するきめ細かいマッピングを失うことです。

--- 古い更新:

訂正: Docker は、「postgres」を webapp コンテナーの /etc/hosts ファイル内のコンテナーの IP にマップします。したがって、webapp コンテナーで「postgres」に ping を実行すると、IP にマップされます。

1 回目の更新: Docker が /etc/hosts、/etc/resolv.conf などを生成してマウントし、常に正しい情報を保持することを確認しましたが、リンクされたコンテナーを再起動すると、これは当てはまりません。したがって、Docker がホスト ファイルを更新すると (誤って) 想定していました。

-- 元の (間違った) 応答:

--hostname=postgres-db を追加します (何でも使用できます。コンテナー名との混同を避けるために、'postgres' とは異なるものを使用しています):

$ docker run --name postgres --hostname postgres-db postgres/image

Docker は「postgres-db」をコンテナーの IP にマップします (webapp コンテナーの /etc/hosts の内容を確認してください)。

これにより、webapp コンテナーから「ping postgres-db」を実行できるようになります。IP が変更されると、Docker が /etc/hosts を更新します。

Django アプリでは、IP の代わりに「postgres-db」を使用します (または PostgreSql でコンテナーの --hostname に使用するもの)。

さよなら!オラシオ

于 2014-07-16T02:00:08.657 に答える
-1

Docker 1.0 の時点で、リンクされたコンテナーのより強力な感覚が実装されました。コンテナー インスタンス名をホスト名のように使用できるようになりました。

ここにリンクがあります

あなたの問題をよりよく説明するリンクを見つけました。そして、その質問に答えた一方で、このアンバサダーパターンが問題を解決しないのではないかと思います... これは、アンバサダーがリンクしているサービスよりも信頼性が高いことを前提としています。

于 2014-07-14T12:04:42.130 に答える