PostgreSQL, juga disebut sebagai Postgres, adalah sistem basis data relasional objek terkemuka. Ini populer karena tingkat kepatuhannya yang tinggi terhadap standar SQL dan penyertaan fitur tambahan yang menyederhanakan bekerja dengan kumpulan data kompleks dalam skala besar.
PostgreSQL menggunakan arsitektur client-server tradisional sehingga Anda harus menjalankannya secara terpisah dari kode aplikasi Anda. Dalam panduan ini, Anda akan menerapkan instance server PostgreSQL sebagai wadah Docker. Ini menghindari penambahan paket ke mesin host Anda dan membantu mengisolasi database Anda dari sisa tumpukan Anda. Pastikan Anda telah menginstal Docker sebelum melanjutkan.
mulai
PostgreSQL memiliki gambar resmi di Docker Hub yang tersedia dalam berbagai varian. Tag memungkinkan Anda memilih antara versi utama PostgreSQL dari v9 hingga v14 dan memilih sistem operasi yang digunakan sebagai gambar dasar. Alpine, Debian Stretch, dan Debian Bullseye ditawarkan.
Untuk keperluan tutorial ini, kita akan menggunakan postgres:14
tag yang menyediakan PostgreSQL 14 di atas Bullseye. Anda bebas memilih versi lain yang sesuai dengan kebutuhan Anda.
Mulai wadah PostgreSQL dengan docker run
memerintah:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Anda harus memberikan nilai untuk POSTGRES_PASSWORD
variabel lingkungan. Ini menentukan kata sandi yang akan ditetapkan ke akun pengguna super Postgres default. Nama pengguna default ke postgres
tetapi dapat diubah dengan mengatur POSTGRES_USER
variabel lingkungan.
Itu -v
Bendera digunakan untuk memasang volume Docker di direktori data wadah PostgreSQL. Volume bernama disebut postgres
mengacu pada; Docker akan melakukan ini atau memasang kembali volume jika sudah ada. Anda harus menggunakan volume untuk menyimpan database Anda di luar wadah. Tanpa itu, Anda akan menggunakan data Anda saat penampung berhenti.
PostgreSQL mendengarkan pada port 5432 secara default. Port kontainer terikat ke port 5432 di host Docker Anda dari -p
bendera Itu -d
flag digunakan untuk memulai wadah dalam mode terpisah, secara efektif menjadikannya layanan latar belakang yang terus berjalan hingga berhenti di docker stop
.
Memberikan Kata Sandi sebagai File
Jika Anda tidak nyaman memberikan kata sandi superuser Anda sebagai tanda CLI teks biasa, Anda dapat menyuntikkannya sebagai file melalui volume. Anda harus mengatur POSTGRES_PASSWORD_FILE
variabel lingkungan untuk memberikan Postgres jalur ke file itu:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD_FILE=/run/secrets/postgres-password -v ./postgres-password.txt:/run/secrets/postgres-password -v postgres:/var/lib/postgresql/data postgres:14
Metode ini juga berfungsi untuk POSTGRES_USER
dan variabel lingkungan yang didukung lainnya.
Menghubungkan ke Basis Data Anda
Karena PostgreSQL terikat ke port 5432 di atas, Anda dapat terhubung ke database Anda di localhost:5432
dari klien yang kompatibel. Gunakan kredensial yang Anda tetapkan sebagai variabel lingkungan saat memulai penampung.
Gambar Docker juga menyertakan psql
biner yang dapat Anda gunakan docker exec
. Gunakan untuk berinteraksi dengan cepat dengan database Anda dari shell PostgreSQL di dalam wadah.
docker exec -it postgres psql -U postgres
Menghubungkan Dari Kontainer Docker Lainnya
Membuat jaringan Docker adalah cara yang lebih disukai untuk mengakses PostgreSQL dari wadah lain di host yang sama. Ini menghindari pengikatan port server Postgres dan berpotensi mengekspos layanan ke jaringan host Anda yang lebih luas.
Buat jaringan Docker:
docker network create my-app
Mulai wadah Postgres Anda dengan koneksi jaringan dengan menggunakan --network
bendera dengan docker run
:
docker run -d --name postgres --network my-app -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Sekarang gabungkan wadah aplikasi Anda ke jaringan yang sama:
docker run -d --name api --network my-app my-api:latest
Wadah jaringan dapat mencapai Postgres menggunakan postgres
nama host, karena itu adalah name
ditugaskan ke wadah Postgres. Gunakan port 5432 untuk menyelesaikan koneksi.
Mengonfigurasi PostgreSQL
Anda dapat meneruskan opsi ke server PostgreSQL menggunakan -c
bendera setelah nama gambar di docker run
memerintah:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14 -c max_connections=100
Semuanya setelah meneruskan nama gambar ke perintah dimulai dengan wadah. Perintah ini adalah biner server PostgreSQL dalam kasus gambar Postgres.
Anda dapat menggunakan file konfigurasi khusus saat Anda mengatur nilai dari beberapa opsi. Anda perlu menggunakan volume Docker lain untuk memasang file kontainer Anda, lalu sediakan satu -c
tandai untuk memberi tahu Postgres ke mana harus mencari:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./postgres.conf:/etc/postgresql/postgresql.conf -v postgres:/var/lib/postgresql/data postgres:14 -c config_file=/etc/postgresql/postgresql.conf
Contoh ini menggunakan Docker bind mount untuk mendapatkan postgres.conf
file di direktori kerja Anda yang dipasang di wadah /etc/postgresql
direktori. Untuk referensi opsi yang dapat Anda atur menggunakan flag biner atau arahan file konfigurasi, lihat dokumentasi PostgreSQL.
Menyemai Database
Gambar Docker mendukung file benih yang ditempatkan di /docker-entrypoint-initdb.d
direktori. Apa pun .sql
Hai .sql.gz
file akan dieksekusi untuk menginisialisasi database. Ini terjadi setelah akun pengguna default dan postgres
basis data dibuat. Anda juga dapat menambahkan .sh
file untuk menjalankan skrip shell arbitrer. Semua skrip dieksekusi dalam urutan abjad.
Mekanisme ini berarti bahwa semua yang Anda butuhkan untuk menyemai database Anda adalah satu set skrip SQL atau shell yang diberi nama dalam urutan yang benar. Pasang di wadah baru Anda menggunakan a -v
bendera dengan docker run
:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v ./db-seed-files/:/etc/docker-entrypoint-initdb.d -v postgres:/var/lib/postgresql/data postgres:14
Skrip startup hanya akan digunakan ketika direktori data Postgres kosong. Untuk tujuan praktis, itu berarti mereka akan berjalan pertama kali wadah dimulai dengan volume kosong baru yang terpasang.
Membuat Gambar Database Kustom
Anda dapat memilih untuk mengenkapsulasi file konfigurasi dan skrip inisialisasi dalam gambar Docker Anda sendiri. Ini akan memungkinkan siapa saja yang memiliki akses ke gambar untuk membuat instance PostgreSQL baru yang telah dikonfigurasi sebelumnya untuk aplikasi Anda. Inilah Dockerfile sederhana yang dapat Anda gunakan:
FROM postgres:14 COPY postgres.conf /etc/postgresql/postgresql.conf COPY db-seed-files/ /etc/docker-entrypoint-initdb.d/ CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]
Bangun gambar khusus Anda:
docker build -t custom-postgres:latest .
Instruksi build di Dockerfile akan menyalin file konfigurasi PostgreSQL dan skrip inisialisasi dari direktori kerja Anda dan menyematkannya di image container. Sekarang Anda dapat memulai wadah basis data tanpa menyediakan sumber daya secara manual:
docker run -d --name custom-postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data custom-postgres:latest
Haruskah Anda Menampung Basis Data Produksi Anda?
Memutuskan apakah akan menjalankan database Docker bisa jadi sulit. Instalasi PostgreSQL membuat pengalaman pengaturan lebih mudah tetapi terkadang lebih sulit untuk dipelihara. Anda harus berhati-hati saat mengelola container untuk menghindari kehilangan data di masa mendatang. Docker juga menambahkan overhead kinerja sederhana yang layak dipertimbangkan ketika Anda mengharapkan database tur bekerja dengan sejumlah besar data.
Manfaat Docker adalah peningkatan portabilitas, kemudahan penskalaan, dan efisiensi pengembang. Menampung database Anda memungkinkan siapa pun untuk membuat instance baru menggunakan Docker, tanpa harus menginstal dan mengonfigurasi PostgreSQL secara manual terlebih dahulu. Menulis Dockerfile untuk database PostgreSQL Anda yang menambahkan file konfigurasi dan skrip benih SQL adalah cara yang bagus untuk membantu pengembang dengan cepat memulai lingkungan baru.
Ringkasan
PostgreSQL adalah mesin database berbasis SQL canggih yang menambahkan kemampuan relasional objek. Meskipun Anda dapat memilih untuk menjalankan penerapan produksi tradisional, menggunakan instans dalam container menyederhanakan penyiapan dan membantu pengembang meningkatkan infrastruktur mereka sendiri dengan cepat.
Aspek paling kritis dari penerapan Dockerized adalah memastikan Anda menggunakan satu volume untuk menyimpan data Anda. Ini akan memungkinkan Anda untuk menghentikan, mengganti, dan memperbarui penampung Anda ke versi gambar yang lebih baru tanpa kehilangan database Anda. Di luar penyimpanan, Anda harus menilai bagaimana Anda terhubung ke Postgres dan menghindari mengikat port ke host Anda kecuali diperlukan. Saat menghubungkan dari wadah lain, yang terbaik adalah menggunakan jaringan Docker bersama untuk memfasilitasi akses.