Pengantar
Docker memodernisasi cara kami membangun dan men-deploy aplikasi. Ini memungkinkan kami membuat container yang ringan, portabel, dan mandiri yang dapat menjalankan aplikasi apa pun dengan mudah.
Blog ini dimaksudkan untuk menjelaskan cara menggunakan Docker untuk menjalankan database PostgreSQL. Itu tidak mencakup instalasi atau konfigurasi buruh pelabuhan. Silakan lihat petunjuk instalasi buruh pelabuhan di sini. Beberapa latar belakang tambahan dapat ditemukan di blog kami sebelumnya di MySQL dan Docker.
Sebelum masuk ke detailnya, mari kita tinjau beberapa terminologi.
- Dockerfile
Berisi kumpulan instruksi/perintah untuk menginstal atau mengkonfigurasi aplikasi/perangkat lunak. - Gambar Docker
Gambar Docker dibangun dari serangkaian lapisan yang mewakili instruksi dari Dockerfile. Gambar Docker digunakan sebagai template untuk membuat container. - Penautan wadah dan jaringan yang ditentukan pengguna
Docker menggunakan bridge sebagai mekanisme jaringan default dan menggunakan --links untuk menautkan container satu sama lain. Untuk mengakses wadah PostgreSQL dari wadah aplikasi, seseorang harus menautkan kedua wadah pada waktu pembuatan. Di sini, di artikel ini kami menggunakan jaringan yang ditentukan pengguna karena fitur tautan akan segera dihentikan. - Persistensi data di Docker
Secara default, data di dalam container bersifat sementara. Setiap kali wadah dimulai ulang, data akan hilang. Volume adalah mekanisme yang lebih disukai untuk mempertahankan data yang dihasilkan dan digunakan oleh wadah Docker. Di sini, kami memasang direktori host di dalam wadah tempat semua data disimpan.
Mari kita mulai membuat image PostgreSQL dan menggunakannya untuk menjalankan container.
File DockerPostgreSQL
# example Dockerfile for https://docs.docker.com/engine/examples/postgresql_service/
FROM ubuntu:14.04
# Add the PostgreSQL PGP key to verify their Debian packages.
# It should be the same key as https://www.postgresql.org/media/keys/ACCC4CF8.asc
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
# Add PostgreSQL's repository. It contains the most recent stable release
# of PostgreSQL, ``9.3``.
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ precise-pgdg main" > /etc/apt/sources.list.d/pgdg.list
# Install ``python-software-properties``, ``software-properties-common`` and PostgreSQL 9.3
# There are some warnings (in red) that show up during the build. You can hide
# them by prefixing each apt-get statement with DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y python-software-properties software-properties-common postgresql-9.3 postgresql-client-9.3 postgresql-contrib-9.3
# Note: The official Debian and Ubuntu images automatically ``apt-get clean``
# after each ``apt-get``
# Run the rest of the commands as the ``postgres`` user created by the ``postgres-9.3`` package when it was ``apt-get installed``
USER postgres
# Create a PostgreSQL role named ``postgresondocker`` with ``postgresondocker`` as the password and
# then create a database `postgresondocker` owned by the ``postgresondocker`` role.
# Note: here we use ``&&\`` to run commands one after the other - the ``\``
# allows the RUN command to span multiple lines.
RUN /etc/init.d/postgresql start &&\
psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" &&\
createdb -O postgresondocker postgresondocker
# Adjust PostgreSQL configuration so that remote connections to the
# database are possible.
RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
# And add ``listen_addresses`` to ``/etc/postgresql/9.3/main/postgresql.conf``
RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
# Expose the PostgreSQL port
EXPOSE 5432
# Add VOLUMEs to allow backup of config, logs and databases
VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
# Set the default command to run when starting the container
CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
Jika Anda melihat Dockerfile dari dekat, itu terdiri dari perintah yang digunakan untuk menginstal PostgreSQL dan melakukan beberapa perubahan konfigurasi pada OS ubuntu.
Membangun Gambar PostgreSQL
Kita dapat membangun image PostgreSQL dari Dockerfile menggunakan perintah docker build.
# sudo docker build -t postgresondocker:9.3 .
Di sini, kita dapat menentukan tag (-t) pada gambar seperti nama dan versi. Dot (.) di akhir menentukan direktori saat ini dan menggunakan Dockerfile yang ada di direktori saat ini. Nama file Docker harus "Dockerfile". Jika Anda ingin menentukan nama khusus untuk file docker Anda, maka Anda harus menggunakan -f
# sudo docker build -t postgresondocker:9.3 -f <your_docker_file_name>
Output:(Opsional gunakan jendela teks bilah gulir jika memungkinkan)
Sending build context to Docker daemon 4.096kB
Step 1/11 : FROM ubuntu:14.04
14.04: Pulling from library/ubuntu
324d088ce065: Pull complete
2ab951b6c615: Pull complete
9b01635313e2: Pull complete
04510b914a6c: Pull complete
83ab617df7b4: Pull complete
Digest: sha256:b8855dc848e2622653ab557d1ce2f4c34218a9380cceaa51ced85c5f3c8eb201
Status: Downloaded newer image for ubuntu:14.04
---> 8cef1fa16c77
Step 2/11 : RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys B97B0AFCAA1A47F044F244A07FCC7D46ACCC4CF8
---> Running in ba933d07e226
.
.
.
fixing permissions on existing directory /var/lib/postgresql/9.3/main ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/9.3/main/base/1 ... ok
initializing pg_authid ... ok
initializing dependencies ... ok
creating system views ... ok
loading system objects' descriptions ... ok
creating collations ... ok
creating conversions ... ok
creating dictionaries ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
loading PL/pgSQL server-side language ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok
copying template1 to postgres ... ok
syncing data to disk ... ok
Success. You can now start the database server using:
/usr/lib/postgresql/9.3/bin/postgres -D /var/lib/postgresql/9.3/main
or
/usr/lib/postgresql/9.3/bin/pg_ctl -D /var/lib/postgresql/9.3/main -l logfile start
Ver Cluster Port Status Owner Data directory Log file
9.3 main 5432 down postgres /var/lib/postgresql/9.3/main /var/log/postgresql/postgresql-9.3-main.log
update-alternatives: using /usr/share/postgresql/9.3/man/man1/postmaster.1.gz to provide /usr/share/man/man1/postmaster.1.gz (postmaster.1.gz) in auto mode
invoke-rc.d: policy-rc.d denied execution of start.
Setting up postgresql-contrib-9.3 (9.3.22-0ubuntu0.14.04) ...
Setting up python-software-properties (0.92.37.8) ...
Setting up python3-software-properties (0.92.37.8) ...
Setting up software-properties-common (0.92.37.8) ...
Processing triggers for libc-bin (2.19-0ubuntu6.14) ...
Processing triggers for ca-certificates (20170717~14.04.1) ...
Updating certificates in /etc/ssl/certs... 148 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
Processing triggers for sgml-base (1.26+nmu4ubuntu1) ...
Removing intermediate container fce692f180bf
---> 9690b681044b
Step 5/11 : USER postgres
---> Running in ff8864c1147d
Removing intermediate container ff8864c1147d
---> 1f669efeadfa
Step 6/11 : RUN /etc/init.d/postgresql start && psql --command "CREATE USER postgresondocker WITH SUPERUSER PASSWORD 'postgresondocker';" && createdb -O postgresondocker postgresondocker
---> Running in 79042024b5e8
* Starting PostgreSQL 9.3 database server
...done.
CREATE ROLE
Removing intermediate container 79042024b5e8
---> 70c43a9dd5ab
Step 7/11 : RUN echo "host all all 0.0.0.0/0 md5" >> /etc/postgresql/9.3/main/pg_hba.conf
---> Running in c4d03857cdb9
Removing intermediate container c4d03857cdb9
---> 0cc2ed249aab
Step 8/11 : RUN echo "listen_addresses='*'" >> /etc/postgresql/9.3/main/postgresql.conf
---> Running in fde0f721c846
Removing intermediate container fde0f721c846
---> 78263aef9a56
Step 9/11 : EXPOSE 5432
---> Running in a765f854a274
Removing intermediate container a765f854a274
---> d205f9208162
Step 10/11 : VOLUME ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
---> Running in ae0b9f30f3d0
Removing intermediate container ae0b9f30f3d0
---> 0de941f8687c
Step 11/11 : CMD ["/usr/lib/postgresql/9.3/bin/postgres", "-D", "/var/lib/postgresql/9.3/main", "-c", "config_file=/etc/postgresql/9.3/main/postgresql.conf"]
---> Running in 976d283ea64c
Removing intermediate container 976d283ea64c
---> 253ee676278f
Successfully built 253ee676278f
Successfully tagged postgresondocker:9.3
Pembuatan Jaringan Penampung
Gunakan perintah di bawah ini untuk membuat jaringan yang ditentukan pengguna dengan driver jembatan.
# sudo docker network create --driver bridge postgres-network
Konfirmasi Pembuatan Jaringan
# sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
a553e5727617 bridge bridge local
0c6e40305851 host host local
4cca2679d3c0 none null local
83b23e0af641 postgres-network bridge local
Pembuatan Kontainer
Kita perlu menggunakan perintah "docker run" untuk membuat wadah dari gambar buruh pelabuhan. Kami menjalankan wadah postgres dalam mode daemonisasi dengan bantuan opsi -d.
# sudo docker run --name postgresondocker --network postgres-network -d postgresondocker:9.3
Gunakan perintah di bawah ini untuk mengonfirmasi pembuatan container.
# sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
06a5125f5e11 postgresondocker:9.3 "/usr/lib/postgresql…" About a minute ago Up About a minute 5432/tcp postgresondocker
Kami belum menentukan port apa pun untuk diekspos, sehingga akan mengekspos port postgres default 5432 untuk penggunaan internal. PostgreSQL hanya tersedia dari dalam jaringan Docker, kami tidak akan dapat mengakses wadah Postgres ini di port host.
Kita akan melihat cara mengakses kontainer Postgres di port host di bagian selanjutnya di artikel ini.
Menghubungkan ke wadah PostgreSQL di dalam jaringan Docker
Mari kita coba menghubungkan ke wadah Postgres dari wadah lain dalam jaringan Docker yang sama yang kita buat sebelumnya. Di sini, kami telah menggunakan klien psql untuk terhubung ke Postgres. Kami menggunakan nama wadah Postgres sebagai nama host, pengguna, dan kata sandi yang ada di file Docker.
# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=#
Opsi --rm pada perintah run akan menghapus container setelah kita menghentikan proses psql.
# sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2fd91685d1ea postgresondocker:9.3 "psql -h postgresond…" 29 seconds ago Up 30 seconds 5432/tcp brave_spence
06a5125f5e11 postgresondocker:9.3 "/usr/lib/postgresql…" About a minute ago Up About a minute 5432/tcp postgresondocker
Persistensi data
Wadah Docker bersifat sementara, yaitu data yang digunakan atau dihasilkan oleh wadah tidak disimpan di mana pun secara implisit. Kami kehilangan data setiap kali penampung dimulai ulang atau dihapus. Docker menyediakan volume tempat kita dapat menyimpan data persisten. Ini adalah fitur yang berguna di mana kami dapat menyediakan wadah lain menggunakan volume atau data yang sama jika terjadi bencana.
Mari buat volume data dan konfirmasikan pembuatannya.
# sudo docker volume create pgdata
pgdata
# sudo docker volume ls
DRIVER VOLUME NAME
local pgdata
Sekarang kita harus menggunakan volume data ini saat menjalankan wadah Postgres. Pastikan Anda menghapus wadah postgres lama yang berjalan tanpa volume.
# sudo docker container rm postgresondocker -f
postgresondocker
# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3
Kami telah menjalankan wadah Postgres dengan volume data yang menyertainya.
Buat tabel baru di Postgres untuk memeriksa persistensi data.
# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=# \dt
No relations found.
postgresondocker=# create table test(id int);
CREATE TABLE
postgresondocker=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+------------------
public | test | table | postgresondocker
(1 row)
Hapus wadah Postgres.
# sudo docker container rm postgresondocker -f
postgresondocker
Buat wadah Postgres baru dan konfirmasikan tabel pengujian ada atau tidak.
# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -d postgresondocker:9.3
# docker run -it --rm --network postgres-network postgresondocker:9.3 psql -h postgresondocker -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=# \dt
List of relations
Schema | Name | Type | Owner
--------+------+-------+------------------
public | test | table | postgresondocker
(1 row)
Unduh Whitepaper Hari Ini Pengelolaan &Otomatisasi PostgreSQL dengan ClusterControlPelajari tentang apa yang perlu Anda ketahui untuk menerapkan, memantau, mengelola, dan menskalakan PostgreSQLUnduh Whitepaper Mengekspos layanan PostgreSQL ke host
Anda mungkin telah memperhatikan bahwa kami belum mengekspos port apa pun dari wadah PostgreSQL sebelumnya. Ini berarti PostgreSQL hanya dapat diakses oleh container yang ada di jaringan postgres yang kita buat sebelumnya.
Untuk menggunakan layanan PostgreSQL, kita perlu mengekspos port container menggunakan opsi --port. Di sini, kami telah mengekspos port container Postgres 5432 pada port 5432 host.
# sudo docker run --name postgresondocker --network postgres-network -v pgdata:/var/lib/postgresql/9.3/main -p 5432:5432 -d postgresondocker:9.3
# sudo docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
997580c86188 postgresondocker:9.3 "/usr/lib/postgresql…" 8 seconds ago Up 10 seconds 0.0.0.0:5432->5432/tcp postgresondocker
Sekarang Anda dapat menghubungkan PostgreSQL di localhost secara langsung.
# psql -h localhost -U postgresondocker --password
Password for user postgresondocker:
psql (9.3.22)
SSL connection (cipher: DHE-RSA-AES256-GCM-SHA384, bits: 256)
Type "help" for help.
postgresondocker=#
Penghapusan Penampung
Untuk menghapus container, kita harus menghentikan container yang sedang berjalan terlebih dahulu lalu menghapus container menggunakan perintah rm.
# sudo docker container stop postgresondocker
# sudo docker container rm postgresondocker
postgresondocker
Gunakan opsi -f (--force) untuk langsung menghapus container yang sedang berjalan.
# sudo docker container rm postgresondocker -f
postgresondocker
Mudah-mudahan, Anda sekarang memiliki lingkungan lokal dockerized Anda sendiri untuk PostgreSQL.
Catatan: Artikel ini memberikan ikhtisar tentang bagaimana kita dapat menggunakan PostgreSQL di buruh pelabuhan untuk lingkungan pengembangan/POC. Menjalankan PostgreSQL di lingkungan produksi mungkin memerlukan perubahan tambahan dalam konfigurasi PostgreSQL atau buruh pelabuhan.
Kesimpulan
Ada cara sederhana untuk menjalankan database PostgreSQL di dalam wadah Docker. Docker secara efektif merangkum penyebaran, konfigurasi, dan prosedur administrasi tertentu. Docker adalah pilihan yang baik untuk menerapkan PostgreSQL dengan upaya minimal. Yang perlu Anda lakukan adalah memulai container Docker yang telah dibuat sebelumnya dan Anda akan memiliki database PostgreSQL yang siap untuk layanan Anda.
Referensi
- Instalasi Docker:https://docs.docker.com/install
- Volume:https://docs.docker.com/storage/volumes
- Jaringan Buatan Pengguna:https://docs.docker.com/network/
- File Docker Postgres:https://docs.docker.com/engine/examples/postgresql_service
- MySQL di Docker:Memahami Dasar-dasarnya:https://severalnines.com/blog/mysql-docker-containers-understanding-basics