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 perlu menjalankannya secara independen 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 bagian lain dari tumpukan Anda. Pastikan Anda telah menginstal Docker sebelum melanjutkan.
Memulai
PostgreSQL memiliki gambar resmi di Docker Hub yang tersedia dalam beberapa varian berbeda. Tag memungkinkan Anda memilih antara versi PostgreSQL utama 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 menggunakan docker run
perintah:
docker run -d --name postgres -p 5432:5432 -e POSTGRES_PASSWORD=<password> -v postgres:/var/lib/postgresql/data postgres:14
Anda harus berikan nilai untuk POSTGRES_PASSWORD
variabel lingkungan. Ini mendefinisikan kata sandi yang akan diberikan ke akun pengguna super default Postgres. Nama pengguna default ke postgres
tetapi dapat diubah dengan menyetel POSTGRES_USER
variabel lingkungan.
-v
flag digunakan untuk memasang volume Docker ke direktori data container PostgreSQL. Volume bernama bernama postgres
dirujuk; Docker akan membuatnya atau memasang kembali volume jika sudah ada. Anda harus menggunakan volume untuk menyimpan database Anda di luar wadah. Tanpanya, 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 dengan -p
bendera. -d
flag digunakan untuk memulai wadah dalam mode terpisah, secara efektif menjadikannya layanan latar belakang yang terus berjalan hingga dihentikan dengan docker stop
.
Menyediakan Kata Sandi sebagai File
Jika Anda tidak nyaman memberikan kata sandi pengguna super Anda sebagai tanda CLI teks biasa, Anda dapat menyuntikkannya sebagai file melalui volume sebagai gantinya. Anda kemudian 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
Teknik ini juga berfungsi untuk POSTGRES_USER
dan variabel lingkungan lain yang didukung.
Menghubungkan ke Database 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 panggil dengan docker exec
. Gunakan ini untuk berinteraksi dengan cepat dengan database Anda dari shell PostgreSQL di dalam wadah.
docker exec -it postgres psql -U postgres
Menghubungkan Dari Kontainer Docker Lain
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 ke jaringan dengan menggunakan --network
tandai 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 dalam jaringan dapat mencapai Postgres menggunakan postgres
hostname, karena ini adalah name
ditugaskan ke wadah Postgres. Gunakan port 5432 untuk menyelesaikan koneksi.
Mengonfigurasi PostgreSQL
Anda dapat melewati opsi server PostgreSQL menggunakan -c
tandai setelah nama gambar di docker run
perintah:
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 nama gambar diteruskan ke perintah yang dimulai di wadah. Perintah ini akan menjadi biner server PostgreSQL dalam kasus gambar Postgres.
Anda dapat menggunakan file konfigurasi khusus saat Anda mengatur nilai dari beberapa opsi. Anda harus menggunakan volume Docker lain untuk memasang file Anda ke dalam wadah, lalu berikan satu -c
tandai untuk menginstruksikan 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 mount pengikat Docker untuk mendapatkan postgres.conf
file di direktori kerja Anda di-mount ke /etc/postgresql
penampung direktori. Untuk referensi opsi yang dapat Anda atur dengan flag biner atau arahan file konfigurasi, lihat dokumentasi PostgreSQL.
Seeding Database
Gambar Docker mendukung file benih yang ditempatkan ke dalam /docker-entrypoint-initdb.d
direktori. .sql
Any atau .sql.gz
file akan dieksekusi untuk menginisialisasi database. Ini terjadi setelah akun pengguna default dan postgres
basis data telah dibuat. Anda juga dapat menambahkan .sh
file untuk menjalankan skrip shell arbitrer. Semua skrip dieksekusi dalam urutan abjad.
Mekanisme ini berarti semua yang Anda butuhkan untuk seed database Anda adalah satu set SQL atau skrip shell yang dinamai dalam urutan yang benar. Pasang ini ke wadah baru Anda menggunakan -v
tandai 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 inisialisasi 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 Khusus
Anda dapat memilih untuk mengenkapsulasi file konfigurasi dan skrip inisialisasi dalam gambar Docker Anda sendiri. Ini akan memungkinkan siapa pun yang memiliki akses ke gambar untuk membuat instance PostgreSQL baru yang telah dikonfigurasikan sebelumnya untuk aplikasi Anda. Berikut 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"]
Buat 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 ke dalam 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?
Mungkin sulit untuk memutuskan apakah akan menjalankan database di Docker. Containerizing PostgreSQL membuat pengalaman penyiapan lebih mudah tetapi terkadang lebih menantang untuk dipelihara. Anda perlu berhati-hati saat mengelola wadah Anda untuk menghindari kehilangan data di masa mendatang. Docker juga menambahkan overhead kinerja sederhana yang patut dipertimbangkan ketika Anda mengantisipasi database tur akan bekerja dengan volume data yang sangat besar.
Manfaat Docker adalah peningkatan portabilitas, kemudahan penskalaan, dan efisiensi pengembang. Menampung database Anda memungkinkan siapa pun menjalankan instance baru menggunakan Docker, tanpa menginstal dan mengonfigurasi PostgreSQL secara manual terlebih dahulu. Oleh karena itu, menulis Dockerfile untuk database PostgreSQL Anda yang menambahkan file konfigurasi dan skrip benih SQL adalah cara yang baik untuk membantu pengembang memulai lingkungan baru dengan cepat.
Ringkasan
PostgreSQL adalah mesin database berbasis SQL canggih yang menambahkan kemampuan relasional objek. Meskipun Anda dapat memilih untuk menjalankan penerapan tradisional dalam produksi, menggunakan instance dalam container menyederhanakan penyiapan dan membantu pengembang dengan cepat menjalankan infrastruktur mereka sendiri.
Aspek paling penting dari penerapan Dockerized adalah memastikan Anda menggunakan 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 akan terhubung ke Postgres dan menghindari mengikat port ke host Anda kecuali diperlukan. Saat menghubungkan dari penampung lain, sebaiknya gunakan jaringan Docker bersama untuk memfasilitasi akses.