پایگاه داده PostgreSQL با استفاده از Docker

سلام! توی این پست می‌خوام برای کسایی که تازه می‌خوان کار با PostgreSQL کار کنن، یه راهکار تقققریبا ساده بنویسم. توی این راهکار نیازی نیست که خود postgres رو مستقیما روی دستگاهتون نصب کنید و با مشکلات ویندوز/لینوکس/مک دست و پنجه نرم کنید. + کار کردن با postgres ای که روی داکره مزایای خودش رو داره مخصوصا وقتی که صرفا تستیه و خیلی نگران persistence داده‌هاتون نیستید!علاوه بر خود postgres، برنامه‌ی pgadmin رو هم توی این پست بالا میاریم برای مدیریت کردن دیتابیسمون.در مرحله‌ی اول باید Docker رو نصب کنید. طریقه‌ی نصب داکر رو توی همین ویرگول می‌تونید پیدا کنید ولی من یه لینک به صفحه‌ی مستندات خود داکر می‌ذارم براتون: https://docs.docker.com/engine/install/ خوب، با فرض این که الان داکر نصبه و در حال اجراس (این مهمه ها! اگر در حال اجرا نباشه سر daemon و اینا ارور میده خلاصه حواستون باشه)حالا باید image هایی که می‌خوایم باهاشون کار کنیم رو pull کنیم. پس ترمینال/کامند لاین رو بگشایید:docker pull postgres:latest docker pull dpage/pgadmin4این جا، جا داره یاداوری کنم که اگر توی ایران هستید، dockerhub تحریممون کرده و احتمالا خطای pull rate limit رو خواهید خورد که یه جور 403 هست. برای رفع این مشکل می‌تونید از shecan استفاده کنید. طریقه‌ی استفاده‌اش توی shecan.ir هست ولی خوب منم برای mac و linux یه پست دیگه گذاشتم که با ترمینال فعالش کنید: https://virgool.io/@saee_saadat/تنظیم-shecan-در-ترمینال-برای-مک-و-لینوکس-sk6qtmmrplzv برای داکر می‌تونید از رجیستری‌های mirror هم استفاده کنید که یکم بگردید باز تو همین ویرگول روشش هست ولی خوب همون شکن کارتون رو راه می‌اندازه.حالا که ۲ تا ایمیجمون با موفقیت دانلود شدن، وقتشه که راه بندازیمشون.در مرحله‌ی اول، یه network درست کنیم برای این که pgadmin و postgres با هم بتونن ارتباط بگیرن:docker network create pgverseالبته این مرحله‌هم الزامی نیست و می‌تونید بدون نتورک هم این کار رو انجام بدید، ولی با نتورک یکم تمیز تره. بعد یه اینستنس از پوستگرس رو اجرا می‌کنیم:docker run --name pgdocker --network=&quotpgverse&quot -p 5432:5432 -e POSTGRES_PASSWORD=3cure -e POSTGRES_USERNAME=postgres -d postgresاسم کانتینرمون رو با --name گذاشتیم pgdocker و وصلش کردیم به نتورکمون، بعد پورت ۵۴۳۲ کانتینر که روش دیتابیس داره گوش میده رو وصل می‌کنیم به پورت ۵۴۳۲ خودمون که بتونیم بهش وصل شیم. بعد برای یوزر دیفالت یه یوزرنیم پسورد میدیم که یوزرش به صورت دیفالت همین postgres عه و پسوردش رو گذاشتیم 3cure که خیلی سکیوره.الان یه دیتابیس خوشگل روی پورت ۵۴۳۲ مون داریم که آماده‌ی استفادس! حالا می‌خوایم وارد کانتینر شیم و با psql یکم باهاش ور بریم. برای این کار از دستور زیر استفاده کنید:docker exec -it pgdocker shحالا که وارد کانتینرمون شدیم، با اجرای این دستور وارد shell برای psql میشیم:psql -U postgres -Wوقتی این دستور رو بزنین، ازتون پسورد می‌خواد (چون -W رو زدیم) که باید همون پسوردی که موقع ساخت بهش دادیم رو بدیم که 3cure بود. برای ورود به psql یه سری آرگومان دیگه هم هستند که این‌جا خیلی خلاصه اصلی‌ها رو استفاده می‌کنم:psql -d {database name (like mydatabase)} -h {host name (like localhost)} -p {port (like 5432)} -U {username (like postgres)} -W psql -d postgres -h localhost -p 5432 -U postgres -Wحالا وارد shell شدیم و می‌تونیم دستورات sql رو توش اجرا کنیم! مثلا توی کد زیر، یه user جدید می‌سازیم، تبدیلش می‌کنیم به superuser (راجع به انواع اکسس‌ها بعدا بخونید)، بعد یه دیتابیس جدید می‌سازیم، به یوزر جدیدمون همه‌ی دسترسی‌ها رو روی دیتابیس جدید می‌دیم و از شل خارج میشیم.create user unicorn with encrypted password 'amniat'; alter user unicorn with superuser; create database mydatabase; grant all privileges on database mydatabase to unicorn;حالا چند تا دستور کوچولو غیر sql ای می‌زنیم که ببینیم چه خبره، این دستورا همه با \ شروع می‌شن. \du \l \dt \?اولی لیست یوزر‌ها (یا role ها)، دومی لیست دیتابیس‌ها، سومی لیست جدول‌ها (که الان خالیه احتمالا) و آخری هم لیست تمام دستورات \ ای عه.حالا یه بار از psql خارج می‌شیم.exit; و دوباره وارد میشیم.psql -U unicorn -d mydatabase -W password: amniatبا یوزر جدیدمون، وارد دیتابیس جدیدمون شدیم. حالا می‌تونیم دستورات sql ای اجرا کنیم. مثلا یه تیبل کوچولو بسازیم و یه چیزی توش درج کنیم:create table unicorns (id serial primary key, name varchar(20), is_pink bool); \dt insert into unicorns (name, is_pink) values ('shoolati', true); select * from unicorns;کلا تمام دستورات sql ای که بلدید رو داخل همین کنسول psql می‌تونید اجرا کنید.حالا وقتشه که pgadmin رو بیاریم بالا!برای این کار، باید یه کانتینر جدید اجرا کنیم (همون اول پست ایمیجش رو دانلود کردید)docker run --name pgadmin --network=&quotpgverse&quot -e 'PGADMIN_DEFAULT_EMAIL=admin@pgadmin.ir' -e 'PGADMIN_DEFAULT_PASSWORD=admin' -e 'PGADMIN_LISTEN_PORT=80'-e 'PGADMIN_LISTEN_ADDRESS=0.0.0.0' -p 8080:80 -d dpage/pgadmin4توی این دستور، اسم کانتینرمون رو گذاشتیم pgadmin و وصلش کردیم به همون نتورک pgverse که بتونه postgres مون رو ببینه، بعد هم یه یوزر دیفالت بهش دادیم که از طریقش قراره لاگین کنیم و پورت ۸۰ اش رو وصل کردیم به پورت ۸۰۸۰ خودمون. نکته‌ی ریز برای ویندوزیا: ممکنه سر اسم ایمیج dpage/pgadmin4 به ارور بخورید که اسم کانتینر فقط می‌تونه lowercase باشه، اگر این‌جوری شد دستور docker images رو اجرا کنید، ایمیج dpage/pgadmin4 رو توی خروجی پیدا کنید، یه id داره که ترکیب عدد و حروفه. اون رو کپی کنید و آخر دستور به جای dpage/pgadmin4، اون آیدی رو بذارید تا اجرا شه.حالا براوزرتون رو باز کنید و آدرس localhost:8080 رو بزنید تا pgadmin با تمام شکوه و جبروتش ازتون اطلاعات لاگین بخواد. ایمیل و پسوردی که خودمون تو دستور اجرا کانتینر بهش دادیم رو وارد کنید و وارد پنل مدیریتش بشید.همونطور که می‌بینید، هیچی توش نیست! چون هنوز به سرور دیتابیسی وصلش نکردید. برای این کار از پنل سمت چپ، روی servers کلیک راست کنید و register و بعد روی server بزنید. حالا باید اطلاعات اتصال به دیتابیس رو بهش بدید. توی تب اول صرفا یه اسم براش بذارید. بعد برید توی تب connection و توی قسمت host، آیپی کانتینر رو بهش بدید (برای پیدا کردن آیپی کانتینر دستور زیر رو بزنید و همون آخرای خروجی، آیپی نوشته شده جلوی IPAddress رو کپی کنید.)docker inspect pgdockerاگر هم همون اول network نساختید، می‌تونید به جای آدرس آیپی، آدرس خود host رو بدید که توی ویندوز و مک host.docker.internal هست و توی لینوکس همون localhost جواب میده. ولی پیشنهاد می‌کنم از همون روش آیپی استفاده کنید.یوزرنیم، پسورد و اسم دیتابیس (مثلا اینجا mydatabase ولی در کل خیلی مهم نیست همه‌ی دیتابیس‌ها رو میبینید) رو وارد کنید و save رو بزنید. دیتابیستون به پنل سمت چپ اضافه میشه و می‌تونید بازش کنید و همه‌چیشو ببینید. دیگه اکتشاف کردن توی pgadmin رو به خودتون می‌سپارم شایدم تو پست دیگه‌ای کاورش کنم.بای بای ✌?