実行されていない場合でも、Docker ネットワーク (インターフェース) が存在することを確認するにはどうすればよいですか?

実行されていない場合でも、Docker ネットワーク (インターフェース) が存在することを確認するにはどうすればよいですか?

コンテナ スタック ( で指定docker-compose.yml) があります。スタックには PostgreSQL データベースが必要ですが、スタックの一部にするのではなく、ローカルで実行されているネイティブ インスタンスを使用しています (バックアップを容易にしたり、リソースを節約したりするため)。PostgreSQL インスタンスは、 にバインドしてリッスンするように設定されています。172.17.0.1これは、Docker コンテナ内からホストに到達できる IP です。

ただし、システムの起動時に PostgreSQL はそのアドレスにバインドされず、その後コンテナの初期化に失敗します。その後 PostgreSQL を再起動すると、バインドされていることがわかり ( 経由ss)、コンテナは正常に初期化されます。これは、起動のたびに 100% 再現可能です。

インターフェースがまだ存在していないため、バインドするものがないのだと思います。Docker がまだ初期化されていない間もバインドできるように、ネットワーク (またはインターフェース) を「永続化」する方法はありますか?

(PostgreSQL の systemd サービス ファイルで指定することも試みましたがAfter=docker.service、うまくいきませんでした。原因は、docker はすでに初期化されているものの、コンテナー スタックが初期化されておらず、ネットワークもまだ作成されていないためだと思います。私の知る限り、systemd で「docker コンテナーが起動するまで待機する」ように指定することは不可能です。)

答え1

私も同じ問題に取り組んできました。解決策を見つけましたが、気に入らないかもしれません。Postgresqllisten_addressesで を設定すると'*'、代わりに アドレスにバインドされ0.0.0.0、すべてのインターフェースからトラフィックを受信します。これはいくつかのサーバーで正しく機能することを確認しました。

はい、DB サーバーをパブリック アドレスにバインドするのは罪です。ただし、UFW で外部トラフィックをブロックし、pg_hbaDocker サブネットから適切な DB への接続のみを許可するように厳密に構成しpostgres、スーパーユーザー アカウントにはローカル UNIX 認証のみ、その他のすべてのアカウントには強力なパスワードを使用するように設定しておく必要があります。したがって、十分に安全だと思います。少なくとも、これで動作します。これを動作させる他の方法は見つかりませんでした。

関連情報