MongoDb Notlarım

Cem Topkaya
4 min readFeb 4, 2021

--

Docker ile MongoDb kurmak

Varsa cdb adında bir konteyner silinerek başlanabilinir veya farklı bir konteyner adıyla (–-name yeniad) devam edilebilinir.$ docker rm -f cdb
docker run komutu arka planda önce mongo isimli docker yansısını çeker ve ondan bir konteyner oluşturmak için devam eder.
Bu aşamayı ikiye bölerek önce$ docker pull mongo
komutuyla mongo isimli docker yansısını/kalıbını (image) kendi bilgisayarımıza çekerek, yereldeki yansıların arasına katabilir ve ardından
$ docker run --name cdb --restart=always -d -p 27017:27017 mongo
komutuyla devam ederek konteyner yaratabilirsiniz. Komutun en sonunda yer alan mongo, docker yansı adını bu şekilde bıraktığımızda konteyner ayaklandığında "/usr/local/bin/docker-entrypoint.sh" dosyası ENTRYPOINT olarak çalışacak.

Docker yansısını ayaklandırırken ortam değişkenlerine atayacağımız değerler ile mongodb’nin varsayılan kullanıcıyı oluşturmasını sağlarız.

MongoDb'nin yönetici kullanıcısı ve şifresi
ME_CONFIG_MONGODB_ADMINUSERNAME
ME_CONFIG_MONGODB_ADMINPASSWORD
Birlikte kullanılan bu değişkenler yeni bir kullanıcı yaratır ve o kullanıcının şifresini belirler.
MONGO_INITDB_ROOT_USERNAME
MONGO_INITDB_ROOT_PASSWORD

Kullanıcı Doğrulama Mekanizması

mongo --help ile baktığımızda "--authenticationDatabase" için tanım şöyledir: user source (defaults to dbname)

Kullanıcı kimlik bilgilerinin mongo kabuğunun bağlandığı (test) varsayılan veritabanında değil, admin veritabanında depolanır. Doğrulama yapabilmek için admin veritabanını bağlantı tümcesiyle ya da "--authenticationDatabase" anahtarıyla vermemiz gerekir.

# mongo localhost:27017/admin -u mongoadmin -p secret

mongoHost:mongoPort(default:27017)/kullanıcıBilgileriDoğrulamaVeritabanı

Bulunduğumuz veritabanını getirir:
> db

Aşağıdaki komutla docker konteyner yaratıp içinde mongo uygulamasına bağlanıyoruz.

c:\> docker run -d --name cdb                \
--restart=always \
-p 27017:27017 \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo

Aşağıdaki komutla localhost:27017 adresini varsayılan olarak bağlantı kurup, varsayılan olarak "test" veri tabanına bağlanır
root@828dba6deea5:/# mongo -u mongoadmin -p secret
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb...
---
> db
test
>
Aşağıdaki komutla localhost:27017 adresini varsayılan olarak bağlantı kurup, varsayılan olarak "test" veri tabanına bağlanırroot@828dba6deea5:/# mongo localhost:27017/admin -u mongoadmin -p secret
..connecting to: mongodb://localhost:27017/admin?compressors=disabled&gssapiServiceName=mongodb...
---
> db
admin
>
Aşağıdaki komutta bağlanılacak veri tabanı ornekDb ama kullanıcı bilgilerini doğrulayacağı veri tabanı admin.root@828dba6deea5:/# mongo ornekDb \
-u mongoadmin -p secret \
--authenticationDatabase admin
... connecting to: mongodb://127.0.0.1:27017/ornekDb?authSource=admin&compressors=disabled&gssapiServiceName=mongodb
...
---
> db
ornekDb
>

ornekDb Veri tabanı oluşturulmuş ancak kullanıcı doğrulama için hedef veri tabanı “admin” olmalı. Aşağıdaki bağlantı localhost:27017/ornekDb bağlantı tümcesinde kullanıcı doğrulama için ornekDb veri tabanı işaret ediliyor ancak kullanıcı bilgileri admin veri tabanında olduğu için doğal olarak bağlantı kuramıyor.

Artık kullanıcı doğrulamayı öğrendik. Şimdi MongoDb servisini yetkisiz erişimlere kapatma için --auth argümanını kullanabiliriz.

$ docker run -d --name cdb                   \
-e MONGO_INITDB_ROOT_USERNAME=mongoadmin \
-e MONGO_INITDB_ROOT_PASSWORD=secret \
mongo
--auth argümanı mongod servisine geçirilirse erişim kontrolü ile başlatılır.$ docker run --name cdb --restart=always -d -p 27017:27017 mongo --auth
Veritabanlarını listele
> db.adminCommand( { listDatabases: 1 } )

Kullanıcı Oluşturma

admin Veri tabanı bir meta veri tutan veri tabanıdır. Burada tanımlı bilgiler bir uygulamanın verileri değil, MongoDb içinde kullanılan verilerdir. Kullanıcı tanımladığımızda

admin Veritabanına geç
> use admin
Tanımlı kullanıcıları görmek için:
> db.getUsers()
Belirli bir kullanıcı bilgilerini görmek için
> db.getUser("cnrusr")
Kullanıcıyı silmek için
> dn.dropUser("cnrusr")
Farklı bir kullanıcıyla giriş yapabilmek için:
> db.auth("kullanıcı adı", "şifresi")
Veri tabanında kayıtlı kolleksiyonları listeler:
> db.getCollectionNames()
ornekDb veritabanını oluşturmak için use kullanırız
> use ornekDb
veritabanı içinde kolleksiyon oluşturduğumuzda kalıcı olacaktır
> db.createCollection("tablo adı")
admin veritabanına tanımlı kullanıcıyı oluşturmak
> db.createUser({user:"cem",pwd:"sifre123",roles:[{role: "userAdminAnyDatabase", db:"admin"}, { role:"dbAdmin", db:"ornekDb"} ]})
Yarattığımız kullanıcıyla veritabanına tekrar yetkilendirilmek için (mongod hizmeti -auth ile başlatılmış veya /etc/mongod.conf.orig dosyasındaki "security: authorization: enabled" varsa) :> db.auth("cem", "sifre123")

Kolleksiyonu daha ayrıntılı ayarlarla oluşturmak

> db.createCollection("tabloo", { capped : false, autoIndexId : true, size : 6142800, max : 10000 } )

Başlangıçta kullanıcı tanımımızı yapıyor ve docker komutumuzla veri tabanı ve kolleksiyonlar oluşturmak istiyorsak:

$ docker run -d --name cdb                   \
-e MONGO_INITDB_ROOT_USERNAME=cem \
-e MONGO_INITDB_ROOT_PASSWORD=ccc \
mongo
$ docker exec -it cdb# mongo --authenticationDatabase admin -u cem -p ccc ornekDb --eval "db.createCollection('col1'); db.getCollectionNames()"

--

--

Cem Topkaya
Cem Topkaya

Written by Cem Topkaya

Evlat, kardeş, ağabey, eş, baba, müzik sever, öğrenmek ister, paylaşmaya can atar, iyi biri olmaya çalışır, hakkı geçenlerden helallik ister vs.

No responses yet