Docker Üzerinde Postgres ve pgAdmin Kullanmak

Bu yazı dizisinde Docker’dan ve Docker üzerinde PostgreSQL kullanımından bahsedeceğim. PostgreSQL ve PgAdmin kurulumuyla başlayan yazı dizisine ise persistent storage eklemek, network ayarlarını düzenlemek ve postgres kurulumunu özelleştirmek başlıklarını da ekleyerek bu konudaki tecrübelerimizi detaylandırmayı planlıyorum.

Docker, gerek bu yazıda bahsedeceğim PostgreSQL özelinde olsun gerek Hub sayfasından sunduğu sayısız uygulama için olsun kullanıcılara uygulamaları kurmalarında acısız ve izole bir ortam sunuyor. Aslında birşeyi kurmak yerine Docker üzerinde “ zaten kurulmuşuyla” çalışabilirsiniz.

… ve PostgreSQL kurulumu için harcayacağınız zamanın belki onda biri kadar bir zamanda Docker üzerinde çalışan bir PostgreSQL clusterında çalışmaya başlayabilirsiniz.

Tabi ki Docker ortamını ne için tercih edeceğinizle ilgili farklı sebepleriniz olabilir. Ancak hangi sebeple bu yolu tercih ederseniz edin, Docker üzerinde hızlıca çalışmaya başlayabileceğiniz konusunda emin olabilirsiniz.

Bu yazıda Docker üzerinde bir PostgreSQL clusterı ile hem psql hem de PgAdmin4 istemcisinin kullanımını göreceğiz. Tabi PgAdmin4 kurulumu için de Docker imajını tercih edeceğiz ki bu yazının bir anlamı olsun.

Önce Docker kurulumu yapalım. Bunun için işletim sisteminde gerekli bağımlılıkların kurulumunu ve gerekli repoların eklenmesini, sonrasında ise Docker’ın kurularak servislerinin başlatılması yapmamız gerekiyor. Ben Centos 7 kurulu bilgisayarım üzerinde bu çalışmaya başladığımı da not olarak belirtmek isterim.

[hillshade@localhost ~]$ sudo yum install -y yum-utils
device-mapper-persistent-data lvm2

[hillshade@localhost ~]$ sudo yum-config-manager –add-repo
https://download.docker.com/linux/centos/docker-ce.repo

[hillshade@localhost ~]$ sudo yum install docker
[hillshade@localhost ~]$ sudo systemctl start docker
[hillshade@localhost ~]$ sudo systemctl enable docker

Artık Docker ve PostgreSQL kullanmaya başlayabiliriz. İhtiyacımız olan docker imajlarını indirebileceğimiz güvenli limanı hub.docker.com adresinde buluyoruz. Sayfada PostgreSQL veritabanımızı aratıp buluyoruz.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

PostgreSQL imajımızın bulunduğu sayfaya gidiyoruz. Docker kullanmaya yeni başlarken ve olabildiğince varsayılan komutları test ederken resmi imajlar üzerinden ilerlemekte fayda var. Bu yüzden Docker Verified Publisher ya da Official Images seçeneklerini seçerek ilerlemek bize çeşitli testlerden geçirilmiş çalışan bir Docker imajı garantisi de vermekte.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Şimdilik PostgreSQL versiyonuna çok takılmadan “latest” etiketiyle gelen postgres imajını yükleyebilmek için sağda görünen kodu terminalde çalıştırabiliriz. “Latest” ne derseniz, yayımcının Docker Hub’ına attığı en (güncel değil) son imajın etiketi ve eğer biz imaj çekerken bir : koyarak bir etiket vermezsek varsayılan etiket olarak :latest gelmekte. Eğer başka bir PostgreSQL sürümüne ihtiyaç duyuyorsak View Available Tags linki üzerinden başka hangi imajlar olduğunu da araştırabilir ve kurabilir ya da imaj ismi olan postgres’in sonuna, örneğin :11 gibi bir sürüm numarası ekleyerek 11 sürümünü indirebiliriz.

Artık hızlıca postgres’imizi kurup çalışmaya başlayalım.

[hillshade@localhost ~]$ sudo docker pull postgres

[hillshade@localhost ~]$ sudo docker run –name pg12 -e
POSTGRES_PASSWORD=pg1234 -d postgres

[hillshade@localhost ~]$ sudo docker exec -it pg12 bash

root@b943f3780e42:/# su – postgres

Postgresql kuruldu ve çalışmaya başladı. Bunun için yaptığımız işlemler Postgres imajını Hub’dan çekmek (docker pull), bu imajı kullanarak bir PostgreSQL konteynerini çalıştırmak (docker run) ve bu konteynerin içine girerek Postgres’i kullanmaya başlamaktan (docker exec) ibaret. Hatta ilk komut (docker pull), aslında ikinci komut (docker run) tarafından kapsandığı için (yani Docker bir imajı lokalimizde aradığında bulamazsa önce Hub’a bağlanarak çekeceği ve sonra onu çalıştırmaya başlayacağı için) doğrudan ikinci komuttan da başlayabilirdik. Ayrıca ikinci komutla bir Postgres konteynerini ayağa kaldırırken postgres makinasına isim atayabilir, veri kaydında kullanması amacıyla diskimizde bir klasörü verebiliriz.

Bunlara ek olarak docker run içinde kullandığımız -e ifadesi run ile koşturmaya başladığımız imaja bir çevre değişkeni de atar. Yani burada yaptığımız gibi çevresel bir değişken olan postgres kullanıcısının şifresini veya cluster’ın kullanacağı veri dizinini tanımlayabiliriz.

Docker exec komutu ise çalışan bir konteynerde işletmek üzere bir komut göndermemize yarıyor. Exec komutuna -it ekleyerek Docker’dan bize bir Linux terminali açmasını (ve açık tutmasını) istiyoruz ki bir komut gönderebilelim. Ben burada basitçe bash komutunu gönderdim ve konteynerin komut satırına geçtim. Zaten terminaldeki satırın artık b943f3780e42 makinası (ki bu benim konteynerimin ID’si) üzerindeki root kullanıcısı olarak değiştiği de dikkatimizden kaçmamıştır.

Yukarıdaki en son satırda ise Postgres makinasında, “PostgreSQL üzerinde çalışmaya en yetkili” postgres kullanıcısına geç komutunu vermiş bulunuyoruz.

Hala postgres’imizin nasıl bu kadar hızlı bir şekilde çalışmaya başladığına inanmayanlar için küçük testimizi yapıyoruz.

Bakalım minik Docker makinamızda hangi prosesler çalışıyormuş, tanıdık bir şeyler var mıymış?

postgres@b943f3780e42:~$ ps -ef
UID PID PPID C STIME TTY TIME CMD
postgres 1 0 0 12:10 ? 00:00:00 postgres
postgres 53 1 0 12:10 ? 00:00:00 postgres: checkpointer
postgres 54 1 0 12:10 ? 00:00:00 postgres: background writer
postgres 55 1 0 12:10 ? 00:00:00 postgres: walwriter
postgres 56 1 0 12:10 ? 00:00:00 postgres: autovacuum launcher
postgres 57 1 0 12:10 ? 00:00:00 postgres: stats collector
postgres 58 1 0 12:10 ? 00:00:00 postgres: logical replication launcher
root 68 0 0 12:11 pts/0 00:00:00 bash
root 132 68 0 12:34 pts/0 00:00:00 su – postgres
postgres 133 132 0 12:34 pts/0 00:00:00 -bash
postgres 147 133 0 12:34 pts/0 00:00:00 ps -ef

Bunlar Docker üzerinde koşan Postgres makinamızın içindeki prosesler. Farkettiysek postgresin arkaplan prosesleri.

Sonraki adımda artık psql istemcisini kullanarak veritabanında yapmak istediklerimizi yapmaya her türlü iznimiz var, çünkü şu anda postgres’iz!

postgres@b943f3780e42:~$ psql
psql (12.2 (Debian 12.2-1.pgdg100+1))
Type “help” for help.
postgres=# create database otomobil;
CREATE DATABASE
postgres=# \c otomobil
You are now connected to database “otomobil” as user “postgres”.
otomobil=# create table marka (id serial, marka text);
CREATE TABLE
otomobil=# insert into marka (marka) values (‘Audi’), (‘BMW’), (‘Citroen’), (‘Ford’), (‘Hyundai’), (‘Renault’), (‘Volvo’);
INSERT 0 7
otomobil=# select * from marka;
id | marka
—|———
1 | Audi
2 | BMW
3 | Citroen
4 | Ford
5 | Hyundai
6 | Renault
7 | Volvo
(7 rows)
otomobil=\q
postgres@b943f3780e42:~$ logout
postgres@b943f3780e42:~$ exit
logout root@b943f3780e42:/# exit
exit

Şimdi de ikinci parmak şıklatmamızı gerçekleştirelim ve Docker üzerinde PgAdmin4 kurulumunu yapalım. Bu sefer de PgAdmin4 imajını bulmak için Hub’a geri dönüyorum.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Bu kez resmi bir imaj olmadığı için şimdilik çok indirilen imajlardan birisine yöneliyoruz. Ben ikinci sırada gelen imajı tercih ettim. Bu imaja ait sayfada yeni başlayanlar için daha fazla yönlendirme bulunmakta.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Bu imajı çekmek için sayfada sağda yer alan komutu kullanabiliriz. Ancak bunun yerine sayfadaki yönergeleri inceleyerek hızlıca aşağıdaki docker run komutunu kullanmayı deneyelim.

[hillshade@localhost ~]$ docker run –name pgadmin4 -p 5050:5050 -d fenglc/pgadmin4
Unable to find image ‘fenglc/pgadmin4:latest’ locally
latest: Pulling from fenglc/pgadmin4
f2b6b4884fc8: Pull complete
4fb899b4df21: Pull complete
74eaa8be7221: Pull complete
2d6e98fe4040: Pull complete
414666f7554d: Pull complete
135a494fed80: Pull complete
6ca3f38fdd4d: Pull complete
4de6fcaa1241: Pull complete
83869b6e8a68: Pull complete
017969f75f4b: Pull complete
9ea069bc6ed7: Pull complete
Digest:
sha256:0326d703c75a333758e8b974b0c6b40572417b1b12af5ff3b87406d59d786 63e
Status: Downloaded newer image for fenglc/pgadmin4:latest ef7931a3d4b1e46b0c4df351cf7901276943b69340543dbcacac37066f8e7326

Ve evet… Artık bir de çalışan PgAdmin 4’ümüz var. Üstelik demin bahsettiğim gibi, az önceki gibi lokalde bir imajımız da yoktu. Doğrudan docker run komutunu çalıştırdığımızda önce imajı çekti (docker pull), ardından da imajı koşturdu (docker run).

Burada docker run komutuyla birlikte PgAdmin4 makinamıza pgadmin4 ismini verdik ve -d ile bu Docker imajının detached modda, yani ayrık şekilde çalışmasını istediğimizi belirttik. Ayrıca -p 5050:5050 gibi bir komut kullandık. Bu komut docker makinasındaki portu açığa çıkartarak sunucu makinanın ilgili portuna bağlar. Bunu ifade ederken -p veya –expose etiketlerine iliştirdiğim ilk port birbirine bağlamak istediğim sunucumun portunu, ikinci port ise Docker konteynerimin portunu gösteriyor. Bu sayede sunucu makinamdaki 5050 portuna gelen tüm istekler Docker makinamdaki 5050 portuna gelmiş gibi çalışacak.

Artık docker’ı kurduğum makinada bir browser açıp PgAdmin’e ulaşabilirim. Bunun için http://localhost:5050 adresine gitmem ve login olmam yeterli. Bu imajda pgadmin 4 giriş şifresi için varsayılan olarak aşağıdaki giriş bilgileri kullanılmış. Bu sefer -e ile çevresel değişken vermeden doğrudan bunları kullanarak giriş yapalım.

Kullanıcı adı: pgadmin4@pgadmin.org / Parola: admin

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Giriş yaptığım PgAdmin içinde tabi bir sunucu yok ve diğer Docker konteynerini burada görmek için Add New Server kısmından yeni bir sunucu ekliyorum.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Sunucuya bir isim verip Connection sekmesine geçiyorum ve aşağıdaki bilgileri (PgAdmin’in bağlanacağı Postgres’in host adresi, portu, kullanıcı adı ve şifresi) vermem gerektiğini öğreniyorum.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Burada host kısmı hariç diğer bilgiler aslında imajı indirdiğimiz sayfada da yazıyor ancak hıst adresi bilgisi için Docker’da oluşturduğumuz Postgres konteynerinin IP adresini öğrenmeliyiz. Bunu öğrenmek için konsolda docker inspect pg12 yazıp konteynerle ilgili birçok bilginin içinden ihtiyacım olanlara bakabilir veya buna docker inspect pg12 | grep IPAdress şeklinde bir grep ekleyip zaten aradığım IPAddress bilgisini süzebilirim.

[hillshade@localhost ~]$ docker inspect pg12 | grep IPAddress
“SecondaryIPAddresses”: null,
“IPAddress”: “172.17.0.2”,
“IPAddress”: “172.17.0.2”,

Sunucumu eklediğime göre demin psql’de oluşturduğum veritabanı ve tabloyu aşağıdaki gibi görüntüleyebilirim. Burada verilerimi inceleyebilir ya da psql yerine işlerime PgAdmin4 üzerinden devam edebilirim.

Docker Üzerinden Postgres ve PgAdmin Kullanmak

Bir sonraki yazıda Docker üzerinde çalışan PostgreSQL’in ve PgAdmin’in kullandığı disk alanı üzerinde biraz daha kontrol elde etmeye çalışacağız. Sonraki yazımda Docker Volume komutlarını biraz daha detaylı bir şekilde inceleyip cluster’da saklanan verileri, çalıştığımız sunucu üzerinden de ulaşabilmeyi test edeceğiz.

Görüşmek üzere.