%20%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
コンテナ スタック ( で指定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_hba
Docker サブネットから適切な DB への接続のみを許可するように厳密に構成しpostgres
、スーパーユーザー アカウントにはローカル UNIX 認証のみ、その他のすべてのアカウントには強力なパスワードを使用するように設定しておく必要があります。したがって、十分に安全だと思います。少なくとも、これで動作します。これを動作させる他の方法は見つかりませんでした。