اتصال بـ PostgreSQL شغال داخل Docker
اتصال إلى PostgreSQL الذي يعمل داخل Docker بسيط لو فهمت ما يحدث بالضبط تحت الغطاء. معظم المشاكل تأتي من خلط مفاهيم الشبكة في الحاويات مع افتراضات الجهاز المحلي. دعونا نوضح الأمور خطوة بخطوة.
الفكرة الأساسية
عندما يعمل PostgreSQL داخل حاوية Docker وتقوم بتعريض منفذه، يعمل Docker مثل الجسر. جهازك المحلي يتكلم مع Docker، وDocker يقوم بتوجيه المرور إلى داخل الحاوية. هذا يعني أنك لا تتصل بالحاوية عن طريق عنوان IP الخاص بها. أنت تتصل بجهازك الخاص، عادةً عن طريق 127.0.0.1، على المنفذ الذي قام Docker بتعريضه.
الأمر الصحيح ل psql المحلي
psql -h 127.0.0.1 -p 5432 -U my-pg-user my-pg-db
هذا هو الإعداد الأكثر شيوعًا وصحيحًا للاستخدام التطويعي المحلي. ما يعنيه كل جزء ببساطة:
-h 127.0.0.1أنت تتصل بجهازك المحلي. Docker يستمع هنا ويقوم بتوجيه الاتصال إلى Postgres داخل الحاوية.-p 5432المنفذ الذي قام Docker بتعريضه. إذا قمت بتعيين5432:5432، فهذا صحيح. إذا استخدمت منفذًا آخر، استخدم ذلك المنفذ بدلاً من ذلك.-U my-pg-userدور قاعدة البيانات الذي قمت بإنشائه عند 초기ته Postgres.my-pg-dbاسم قاعدة البيانات التي تريد الاتصال بها. بعد تشغيل هذا الأمر، سيتطلبpsqlكلمة المرور بشكل تفاعلي.
استخدام سلسلة الاتصال بدلاً من ذلك
Postgres يدعم أيضًا سلسلة اتصال واحدة. هذا مفيد للسكريبتات والأدوات.
psql "postgresql://example_user:[email protected]:5432/my-pg-db"
هذا الشكل شائع في ORMs، متغيرات البيئة، وخطوط أنابيب CI. يコード نفس المعلومات مثل العلامات، ولكن في سلسلة واحدة.
عندما يتطلب الاتصال SSL
بعض صور Docker أو الإعدادات الشبيهة بالإنتاج تفرض اتصالات SSL. في هذه الحالة، سي拒ع Postgres الاتصالات العادية إلا إذا طالبته بشكل صريح بـ SSL. تفعل ذلك باستخدام sslmode=require.
psql "postgresql://example_user:[email protected]:5432/my-pg-db?sslmode=require"
إذا كان SSL إلزاميًا وتنسى هذا العلم، فإن رسالة الخطأ تكون غالبًا محيرة. معرفة هذا الأمر مسبقًا يوفر الوقت.
تجنب كلمات المرور في تاريخ الأوامر
وضع كلمات المرور مباشرة في الأوامر له مشاكلتان:
- يتم حفظها في تاريخ شل الخاص بك.
- تكون مرئية للعمليات الأخرى عبر أدوات مثل
ps aux. من الأفضل استخدام متغير بيئة فقط لهذا الأمر:PGPASSWORD="example_password" psql -h 127.0.0.1 -p 5432 -U example_user example-dbهذا ي避ي كتابة كلمة المرور وي避ي تخزينها بشكل دائم. للاعدادات طويلة الأجل،.pgpassأفضل، ولكن هذا موضوع منفصل.
فحص صحة Docker عند فشل الاتصال
إذا لم ينجح الاتصال، قم بفحص Docker قبل لمس إعدادات Postgres. أولاً، تحقق من تشغيل الحاوية وتعرض المنفذ:
docker ps
يجب أن ترى شيئًا مثل:
0.0.0.0:5432->5432/tcp
إذا لم تر هذا الخريطة، فإن Postgres غير متاح من جهازك.
بعد ذلك، قم بفحص السجلات:
docker logs postgres-db
تريد رؤية رسائل تشير إلى أن Postgres بدأ بنجاح ويستمع على المنفذ المتوقع.
إذا كان Postgres سليمًا والمنفذ معروضًا، سيعمل psql. إذا لم ينجح، فإن المشكلة تقريبًا دائمًا تكون مع بيانات الاعتماد أو اسم قاعدة البيانات أو وضع SSL.
نموذج عقلي للحفظ
جهازك المحلي → تعيين منفذ Docker → Postgres داخل الحاوية مرة واحدة تصبح هذه السلسلة واضحة، ي停止 الاتصال بـ Postgres في Docker من الشعور بالغموض ويتحول إلى شيء ممل. الممل هو جيد في عمل الخلفية.

