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.
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.
Ş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.
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.
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
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.
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.
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.
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.