2. İmajlar
Docker imajları oluşturmak ve kullanmak
Önceki bölümde, konteyner içersinde çalıştırmak için imajları Docker hub ‘dan indirmiştik. Sonrasında birden fazla örnek çalıştırdık ve her bir örneğin diğerlerinden nasıl izole edildiğini gözlemledik.
Bu durumun aynısının her gün birçok canlı BT ortamında kullanıldığını bilmeliyiz. Fakat Docker’ın gerçekten zaman ve para dan nasıl tasarruf sağlayacağı noktasına henüz gelmedik. Bu bölüm içersinde bu konulara değineceğiz.
Zorluk seviyesi: Başlangıç
Zaman: Yaklaşık 25 dakika
İçerik:
Docker kullanan bir kişinin yapmak isteyeceği ilk şey, kendi imajlarını nasıl yaratacağını öğrenmektir. [Docker hub] ‘da (https://hub.docker.com) 700.000’den fazla imaj mevcut, fakat sistemleriniz üzerinde kendi isteklerinize göre özelleştirdiğiniz bir imajı çalıştırmak istersiniz. Windows işletim sistemi imajı bile olsa, onu kendi istekleriniz için özelleştirmek istersiniz.
Docker Bölüm1 ‘de, konteyner örneklerimizden birinde “merhaba.txt” adlı bir dosya oluşturduk. Alpine konteyner’i bu örnek, gelecekteki yaratacağımız konteynerlerde yeniden kullanmak ve başkalarıyla paylaşmak istediğimiz bir şey olabilir. Bu durumda “merhaba.txt” dosyasının bulunduğu ve herkesin kullanabileceği özel bir imaj oluşturmamız gerekir.
Konteyner örneklerimizden birini bir imaj olarak basitçe commit
(yüklemek) edebileceğimiz en basit imaj oluşturma biçimiyle başlayacağız. Ardından imaj oluşturmak için çok daha güçlü ve kullanışlı bir yöntemi keşfedeceğiz: Dockerfile.
Daha sonra, bir imajın ayrıntılarını inceleme yoluyla nasıl elde edeceğimizi göreceğiz ve arka planda ne gerçekleştiğini daha iyi anlamak için dosya sistemini inceleyeceğiz.
1. Konteyner üzerinden imaj(Kalıp) oluşturmak
Bir ubuntu kapsayıcısında etkileşimli bir shell çalıştırarak başlayalım:
docker container run -ti ubuntu bash
Daha önceki laboratuvarlardan bildiğiniz gibi, Docker Hub’dan “ubuntu” adlı imajı indirdiniz ve şu anda bu konteynerin içindeki bash kabuğunu çalıştırıyorsunuz.1
İşleri biraz özelleştirmek için yarattığımız konteynere figlet adında bir paket kuracağız. Bu işlem için konteynırınız hala çalışıyor olması gereklidir, bu nedenle ubuntu konteyner içersinde komut satırınıza aşağıdaki komutları yazın:
apt-get update
apt-get install -y figlet
figlet "selam docker"
Ekranda büyük ascii karakterleri ile yazılmış “selam docker” kelimelerini görmelisiniz. Devam edin ve bu konteynerden çıkın
exit
Şimdi bu yeni figlet uygulamasının oldukça kullanışlı olduğunu varsayalım ve ekibinizin geri kalanıyla paylaşmak istediğinizi düşünelim. Onlara yukarıda yaptığınız şeyi tam olarak yapmalarını ve bu örnekte yeterince basit olan figlet’i kendi konteynerlerine yerleştirmelerini söyleyebilirsiniz.
Ancak bu, birkaç paket kurduğunuz ve bir dizi yapılandırma adımından geçtiğiniz gerçek dünya uygulaması olsaydı, süreç hantal hale gelebilir ve hataya oldukça açık olurdu. Bunun yerine, ekibinizle paylaşabileceğiniz bir Docker imajı oluşturmak daha kolay olacaktır.
Başlamak için, ls komutunu kullanarak bu konteynerin ID’sini almalıyız (çalışmayan konteyner ls komutu tarafından görüntülenmeyecektir, bu yüzden -a seçeneğini eklemeniz gerekir).
docker container ls -a
Kendi docker imajımızı yaratmadan önce, yaptığımız tüm değişiklikleri analiz etmemiz gerekir. Yeni oluşturduğunuz konteyner için docker container diff <container ID>
komutunu yazmayı deneyelim. Figlet’i kurduğunuzda konteynere eklenen veya değiştirilen tüm dosyaların bir listesini göreceksiniz.
Docker, tüm bu bilgileri arka planda bizim için takip ediyor. Bu, birkaç dakika içinde keşfedeceğimiz katman (layer) konseptinin bir parçasıdır.
Şimdi, bir docker imajı oluşturmak için bu konteyneri “commit” etmemiz gerekir. Commit, Docker engine çalıştıran sistemde yerel olarak bir imaj oluşturur. Konteyneri commit etmek ve ondan bir imaj oluşturmak için aşağıdaki komutu çalıştırın.
docker container commit CONTAINER_ID
Hepsi bu - ilk imajınızı yarattınız! commit edildikten sonra, yeni oluşturulan imajı mevcut imajlar listesinde görebiliriz.
docker image ls
Şöyle birşey görüyor olmanız gerekir:
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> a104f9ae9c37 46 seconds ago 160MB
ubuntu latest 14f60031763d 4 days ago 120MB
İlk adımda (ubuntu) indirdiğimiz imajı burada kendi oluşturduğumuz imajımız ile birlikte listelendiğini unutmayın. Özel imajımızın REPOSITORY veya TAG sütunlarında hiçbir bilgi bulunmaz. Oluşturduğumuz imajı birden fazla ekip üyesi arasında paylaşmak istiyorsak, bu konteynırda tam olarak ne olduğunu belirlemeyi zorlaştıracaktır.
Bu bilgilerin bir imaja eklenmesi, bir imajı etiketlemek (TAG) olarak bilinir. Önceki komuttan, yeni oluşturulan görüntünün kimliğini(ID) alın ve bizimfiglet olarak adlandırılacak şekilde etiketleyin:
docker image tag <IMAGE_ID> bizimfiglet
docker image ls
Artık imajımızın hangisi olduğunu biliyoruz, “bizimfiglet” ismimli imaj bizim kendi imajımız.
REPOSITORY TAG IMAGE ID CREATED SIZE
bizimfiglet latest a104f9ae9c37 5 minutes ago 160MB
ubuntu latest 14f60031763d 4 days ago 120MB
Az önce tamamladığımız şeyin grafiksel bir görünümü aşağıdaki gibidir:
Şimdi, yeni oluşturulan bizimfiglet isimli imajımız ile bir konteyner çalıştıracağız:
docker container run bizimfiglet figlet merhaba docker
Figlet paketi bizimfiglet imajı içersinde mevcut olduğundan komut aşağıdaki çıktıyı üretecektir:
_ _ _ _
_ __ ___ ___ _ __| |__ __ _| |__ __ _ __| | ___ ___| | _____ _ __
| '_ ` _ \ / _ \ '__| '_ \ / _` | '_ \ / _` | / _` |/ _ \ / __| |/ / _ \ '__|
| | | | | | __/ | | | | | (_| | |_) | (_| | | (_| | (_) | (__| < __/ |
|_| |_| |_|\___|_| |_| |_|\__,_|_.__/ \__,_| \__,_|\___/ \___|_|\_\___|_|
Buradaki örnekte gördüğünüz gibi, bir konteyner oluşturduk, içine tüm kitaplıkları ve program dosyalarını ekledik ve ardından bir imaj oluşturduk. Sonrasında bu imaj Docker Hub’dan indirdiğimiz başka bir imaj gibi kullanabiliriz. Docker imajımızın yalnızca yerel olarak depoluyoruz, başkalarının kullanımına açabilmemiz için birkaç işlem daha yapabilmemiz gerekir. Docker imajımızı paylaşmak için, imajı bir yerdeki bir kayıt defterine yüklemek (push) isteriz. Bu işlemi laboratuvarın kapsamı dışında tuttuk, kolaylıkla internetten bu konuda bilgi alabilirsiniz. Yine de bu işlemi yapmak isterseniz ücretsiz bir Docker hesabı açabilirsiniz, bu laboratuvarları çalıştırabilir ve Docker Community Hub‘a oluşturduğunuz docker imajınızı yükleyebilirsiniz.
Yukarıda belirtildiği gibi, yazılımı bir konteynere manuel olarak yükleme ve ardından bunu özel bir imaja kaydetme yaklaşımı, bir imaj oluşturmanın yollarından yalnızca biridir. Yine de bu görmüş olduğunuz yöntem oldukça iyi çalışır ve çokça yaygındır. Fakat, imaj oluşturmanın daha sağlam bir yolu var. Aşağıdaki alıştırmada, bir imaj oluşturmak için tüm talimatları içeren bir metin dosyası olan Dockerfile kullanılarak görüntülerin nasıl oluşturulduğunu göreceğiz. Sizlere benim tavsiyem’de Dockerfile ile imaj oluşturmanızdır.
2. Dockerfile ile imaj yaratmak
Statik bir binary(çalışabilen) docker imaj oluşturmak yerine, Dockerfile isminde bir dosya kullanarak bu işlemi yapabiliriz. Sonuçta ortaya çıkacak imaj aynı olacaktır, ancak bir Dockerfile ile oluşturduğunuzda bu işlemi yapmak için talimatları bir dosyaya yazıyoruz.
Bu yöntem çok daha doğrudur, çünkü bu şekilde imajlarımız büyüdükçe ve daha karmaşık hale geldikçe değişiklikleri yönetmek çok daha kolay hale gelir.
Yukarıda verdiğimiz örnekten yola çıkacak olursak, figlet’in yeni bir sürümü yayınlanırsa, docker imajımızı sıfırdan oluşturmamız veya imajımızı çalıştırmamız(Konteyner yaratmamız) ve kurulu figlet sürümünü yükseltmemiz gerekir.
Buna karşılık, bir Dockerfile, figlet’i kurmak için kullandığımız “apt-get” komutlarını içerecektir, böylece biz - veya Dockerfile kullanan herhangi biri - bu talimatları kullanarak imajı kolayca yeniden oluşturabilir.
Aristonun sözüne benzetecek olursak:
Bir sistem yöneticisine bir imaj verin ve uygulamaları bir gün boyunca güncel olsun, bir sistem yöneticisine bir Dockerfile verin ve uygulamaları her zaman güncel olsun.
Tamam dosyalar ile işlem yapmayı sevmeyebiliriz, belki biraz zor da olabilir ama Dockerfile kullanmak oldukça güçlüdür, çünkü nasıl oluşturulduğunu yönetmemize izin verir. Pratikte Dockerfile dosyası, kaynak kodunu yönettiğiniz şekilde yönetebilirsiniz.
Çünkü bunlar basit bir metin dosyasıdır(TXT) ve versiyon kontrolü ile kolaylıkla yönetebilirsiniz edebilirsiniz. Github üzerinde kontrol ettiğinizde, birsürü projenin içersinde Dockerfile görebilirsiniz.
Bu bölümde basit bir örnek vereceğiz ve Node.js ile bir “merhaba dünya” uygulaması yapacağız. Node.js ile aşina değilseniz endişelenmeyin, yapacağımız örnek için bu ayrıntıları bilmenize gerek yok.
Bilgisayarımızın adını öğrenen(hostname) ve görüntülediğimiz bir dosya oluşturarak başlıyoruz.
NOT: Docker çalışan bilgisayarın komut satırında ($
) olmalısınız. root@deneme123:/#
a benzer bir komut satırı görürseniz, muhtemelen önceki alıştırmadan kalan ubuntu konteyneri içindesinizdir. Labaratuar içersinde komut satırına dönmek için “exit” yazın.
Aşağıdaki içeriği index.js adlı bir dosyaya kaydedin. Bu alıştırmada vi, vim veya daha farklı bir Linux editörünü kullanabilirsiniz. Bunu yapmak için Linux editörü komutlarıyla ilgili yardıma ihtiyacınız varsa, bu dipnotu 2 izleyin. Veya Linux laboratuvarımız içersindeki Linux 101 Bölüm4 içersinde vim kullanımı ile ilgili bilgilere bakabilirsiniz.
var os = require("os");
var hostname = os.hostname();
console.log(hostname + " sunucusu içinden merhaba" );
Az önce oluşturduğumuz dosya, sunucumuz için javascript kodudur. Muhtemelen tahmin edebileceğiniz gibi, Node.js sadece bir “merhaba” mesajı yazdıracaktır. Bir Dockerfile oluşturarak bu uygulamayı Docker-ize edeceğiz. Temel işletim sistemi imajı olarak alpine imajını kullanacağız, bir Node.js çalıştırma betiği ekleyeceğiz ve ardından kaynak kodumuzu konteyner’a kopyalayacağız. Ayrıca, konteyner oluşturulduktan sonra varsayılan olarak çalışacak komutu da belirleyeceğiz.
Dockerfile adlı bir dosya oluşturun ve aşağıdaki içeriği içine kopyalayın. Yine, bu dosyayı Linux editörleriyle oluşturmaya yardım etmek burada 3 veya Linux 101 Bölüm4.
FROM alpine
RUN apk update && apk add nodejs
COPY . /app
WORKDIR /app
CMD ["node","index.js"]
İlk imajımızı bu Dockerfile’dan oluşturalım ve isim olarak hello:v0.1 verelim:
docker image build -t hello:v0.1 .
Az önce yapmış olduğumuz şey tam olarak aşağıdaki gibidir:
Ardından, uygulamalarımızın düzgün çalışıp çalışmadığını kontrol etmek için bir konteyner başlatıyoruz:
docker container run hello:v0.1
Çalışan konteyner aşağıdakine benzer bir çıktı üretir (tabii kimlik sizde farklı olacaktır).
92d79b6de29f sunucusu içinden merhaba
Gerçekleşen işlemi analiz edersek
İki dosya oluşturduk: uygulama kodumuz için (index.js), bir mesaj yazdıran basit bir javascript kodu. Docker engine nasıl bir imaj oluşturmasını istediğimizi söylediğimiz Dockerfile. Bu Dockerfile şunları yapar:
- İndirilecek temel(base) imaj için FROM kullanılır. - önceki laboratuarlarda kullandığımız alpine imajını temel imaj olarak belirtiyoruz.
- Ardından, RUN ile Node.js yükleyen konteynerin içinde iki komutu çalıştırıp güncelleriz.(apk update ve apk add).
- Sonra çalışma dizinimizdeki dosyaları konteyner a COPY kopyala dedik. Şu anda sahip olduğumuz tek dosya index.js dir.
- Daha sonra, konteynerin başladığında kullanması gereken WORKDIR çalışma dizinini belirtiyoruz
- Son olarak, konteynerimize konteyner başladığında çalıştırılması için bir komut (CMD) verdik.
Önceki laboratuvarlarda komut satırına echo "merhaba dünya"
gibi komutlar koyduğumuzu hatırlayın. Bir Dockerfile ile, bu konteyneri kullanan herkes için çalıştırılacak kesin komutlar belirleyebiliriz. Diğer kullanıcıların, konteynerinizi bir depoya (daha sonra ele alacağımız) kadar commit ettiğimizde(yüklediğimizde) hangi komutların kullanıldığını bileceklerdir. Kullanacağınız konteyneri kendinizin oluşturmasına gerek yoktur. Dockerfile, bu adımları her seferinde tam olarak tekrarlayabilmemizi ve konteynerin çalıştığında ne yapması gerektiğini belirlememizi sağlar. Aslında, bir konteynerin kullanacağı komutları belirtmek ve parametreleri kabul etmek için birden fazla yöntem vardır, ancak şimdilik oldukça kullanışlı imajlar oluşturmak için farklı araçlara sahip olduğunuzu bilmek yeterlidir.
3. İmaj katmanları
Docker ile oluşturduğumuz imajlarda ilginç bir şey daha var. Çalışırken tek bir işletim sistemi ve uygulama gibi görünebilirler. Fakat imajların kendisi aslında katmanlarda oluşturulmuştur. Aslında Konteynerlerin farklı bir işletim sistemi gibi çalışmasının en önemli sebebi bu katmanlı dosya sistemidir.
Geri gidip docker image build
komutunuzun çıktısına bakarsanız, 5 adım olduğunu ve her adım içinde birkaç görev olduğunu görebilirsiniz. Docker’ın, Docker hub’dan veya diğer yerlerden çeşitli parçaları topladığı birkaç “indir”(pull) ve “çek”(fetch) görevi görebilirsiniz. Bu parçalar, bir veya daha fazla imaj (kap) katmanı oluşturmak için kullanılıyor. Katmanlar docker içinde çok önemli bir kavramdır. Bunu keşfetmek ve anlamak için bir kaç alıştırma daha yapacağız. Bana sorarsanız Docker ile Vagrant arasındaki fark nedir derseniz, size cevabım katmanlı dosya sistemi olurdu.
Öncelikle, history komutunu kullanarak daha önce oluşturduğunuz imajınızı kontrol edin (imaj kimliklerinizi bulmak için önceki alıştırmalardaki docker image ls
komutunu kullanmayı unutmayın):
docker image history <image ID>
Yukarıdaki görsel içinden anlayacağınız gibi, son olarak oluşmuş olan Node.js uygulama imajını oluştururken kullandığımız ara katman imajların listesidir. Ara katmanlarda bulunan imajlardan bazıları, son konteyner imajınızda katmanların birleşimi haline gelecektir. History komut çıktısında, orijinal Alpine katmanları listenin en altındadır ve ardından Dockerfile’ımıza eklediğimiz her özelleştirme, çıktıdaki birer katman olarak görünür. Burada bahsettiğimiz katman kavramı Docker sistemini oluşturan en önemli kavram. Tek bir katmanda yapacağınız değişiklik sonuçta oluşan çözümü doğrudan etkiler! . Bunu göstermek için uygulamamızı biraz değiştirip yeni bir imaj oluşturacağız.
Konsol pencerenize şunu yazın: (comment olarak “surum v0.2 yazıyoruz”)
echo "console.log(\"surum v0.2\");" >> index.js
Bu şekilde, önceden oluşturduğumuz index.js dosyamızın altına yeni bir satır ekleyecek ve burada comment olarak “surum v0.2” yazacaktır. Şimdi güncellenmiş kodumuzu kullanarak yeni bir imaj oluşturacağız. Yeni imajımızı yeni bir sürüm olarak işaretlemek için de etiketleyeceğiz, böylece imajımızı kullanan kişiler doğru sürümü kullanabilirler:
docker image build -t hello:v0.2 .
Aşağıdakine benzer bir çıktı oluşacaktır:
Sending build context to Docker daemon 86.15MB
Step 1/5 : FROM alpine
---> 7328f6f8b418
Step 2/5 : RUN apk update && apk add nodejs
---> Using cache
---> 2707762fca63
Step 3/5 : COPY . /app
---> 07b2e2127db4
Removing intermediate container 84eb9c31320d
Step 4/5 : WORKDIR /app
---> 6630eb76312c
Removing intermediate container ee6c9e7a5337
Step 5/5 : CMD node index.js
---> Running in e079fb6000a3
---> e536b9dadd2f
Removing intermediate container e079fb6000a3
Successfully built e536b9dadd2f
Successfully tagged hello:v0.2
Burada aldığımız çıktı içersinde yine 5 adım vardır, fakat bazı aşamalarda Using cache yazdığını görüyoruz.
Docker, bu katmanlardan bazılarını önceki imaj oluşturmamız sırasında oluşturduğumuz ve bu katmanlarda hiçbir şey değişmediğinden, kodu ikinci kez aşağı indirip bu adımları çalıştırmak yerine katmanın önbelleğe(cache) alınmış bir sürümünü kullandı.
Docker’ın katman yönetimi, sistemleri yamalarken, kodun en son sürümüne güncellerken veya yükseltirken ya da uygulamalarda yapılandırma değişiklikleri yaparken BT ekipleri için çok büyük kolaylık sağlar. Docker, her seferinde sıfırdan tekrar tekrar bir imaj oluşturmak yerine, konteyner’i mümkün olan en verimli şekilde oluşturmaya çalışır.
4. İmaj İnceleme
Şimdi biraz tersten düşünelim. Docker hub’dan veya başka bir kayıt defterinden(Docker Registry) bir konteyner indirirsek ve kullandığımız konteynerin içinde ne olduğu hakkında biraz bilgi almak istersek bunu nasıl yapabiliriz?
Docker, imajlar için bir inspect komutuna sahiptir ve konteyner görüntüsü, çalıştırdığı komutlar, işletim sistemi ve daha birçok ayrıntıya bu şekilde erişebiliriz.
Alpine imajı, yukarıdaki örnekte kullandığımız için yerel olarak mevcut olmalıdır (kontrol etmek için docker image ls
kullanabilirsiniz), değilse, indirmek için aşağıdaki komutu çalıştırabilirsiniz:
docker image pull alpine
İmajın mevcut olduğunu anladığımızda, aşağıdaki (inspect) komutunu yazarak inceleyelim
docker image inspect alpine
Birsürü bilgi geldi değilmi? Bu bilgilerin içinde neler var?:
- imajın oluşturduğu katmanlar
- katmanları saklamak için kullanılan sürücü
- oluşturulduğu mimari / işletim sistemi
- imajın meta verileri
- …
Buradaki tüm ayrıntılara girmeyeceğiz, ancak resimle ilgili belirli ayrıntıları incelemek için bazı filtreler kullanabiliriz. Görüntü bilgilerinin JSON biçiminde olduğunu fark etmiş olabilirsiniz. İnceleme komutunu bazı filtreleme bilgileriyle birlikte kullanarak yalnızca görüntüden belirli verileri almak için bundan yararlanabiliriz.
Şimdi de katmanların listesini alalım:
docker image inspect --format "{{ json .RootFS.Layers }}" alpine
Alpine çok basit bir işletim sistemi imajıdır, dolaysı ile sadece bir katman mevcuttur:
["sha256:60ab55d3379d47c1ba6b6225d59d10e1f52096ee9d5c816e42c635ccc57a5a2b"]
Hazırladığımız Hello imajımıza bir bakalım. Bunu yapabilmek için imaj ID’sine ihtiyacımız olacak( bulmak için docker image ls
komutunu kullanabilirsiniz):
docker image inspect --format "{{ json .RootFS.Layers }}" <image ID>
Hello için hazırladığımız imaj gördüğünüz üzere oldukça ilginç (sha256 hashes bilgilerimiz değişik):
["sha256:5bef08742407efd622d243692b79ba0055383bbce12900324f75e56f589aedb0","sha256:5ac283aaea742f843c869d28bbeaf5000c08685b5f7ba01431094a207b8a1df9","sha256:2ecb254be0603a2c76880be45a5c2b028f6208714aec770d49c9eff4cbc3cf25"]
Uygulamamızda üç katman var. Önce likle temel Alpine imajına (Dockerfile’mızdaki FROM
komutu) sahip olduğumuzu söyleyelim, sonrasında bazı paketleri kurmak için bir RUN
komutumuz var ve ardından javascript kodumuza eklemek için bir COPY
komutumuz olduğunu mevcut. Bunlar bizim imajımızın katmanları! Yakından bakarsanız, hem alpine hem de merhaba imajlarının aynı sha256 hash değerine sahip oldukları için bildiğimiz aynı temel katmanı kullandığını görebilirsiniz.
Katmanlar hakkında bir başka önemli nokta: her katman değişmezdir. Bir imaj oluşturulurken ve farklı katmanlar eklendikçe, yeni katmanlar aşağıdaki katmandaki değişiklikleri izler. Docker imajını çalıştırmaya başladığınızda, uygulama çalışırken meydana gelen değişiklikleri takip etmek için kullanılan ek bir katman vardır (önceki örnekte oluşturduğumuz “merhaba.txt” dosyası gibi).
Bu dizayn prensibi, hem güvenlik hem de veri yönetimi için önemlidir. Bir kişi yanlışlıkla veya kötü niyetle çalışan bir konteynerde bir şeyi değiştirirse, temel katmanlar değiştirilemediği için çok kolay bir şekilde orijinal haline geri dönebilirsiniz. Veya bozulmamış görüntünüzden yeni başlayacak sıfır bir konteyner başlatabilirsiniz. Veri oluşturan veya depolayan uygulamalar (örneğin, veritabanları) verilerini volume adı verilen özel bir Docker nesnelerinde depolayabilir. Bu şekilde veriler kalıcı olarak saklanabilir ve diğer kapsayıcılarla paylaşılabilir.
Bundan sonraki bölümde, birkaç konteynerde çalışan ve mimarimizi tanımlamak ve yönetmek için kullanabileceğimiz Docker Compose ve Docker Swarm‘ı kullanan daha sofistike uygulamaları inceleyeceğiz.
5. Terminoloji
- Layers - (Katmanlar) Docker imajı bir dizi katmandan oluşturulmuştur. Her katman, imaj’ın Dockerfile içindeki bir talimatı temsil eder. Sonuncusu dışındaki her katman salt okunurdur.
- Dockerfile - Belirli bir imajı oluşturmak için gereken sırayla tüm komutları içeren bir metin dosyası. Dockerfile referans dökümü Dockerfile dosyası için kullanılabilecek komnutları içerir.
- Volumes - Verilerin kalıcı olmasına ve konteynerin kendisinden ayrı olarak paylaşılmasına izin verilen özel bir Docker konteyner katmanı. Volume’lar, kalıcı verilerinizi uygulamanın kendisinden ayrı olarak soyutlamanızı ve yönetmenizi sağlar.
Dip Notları
[bu eğitimin ingilizce sürümü play-with-docker içersinde mevcuttur]
Konu tekrarı, kısa sınav
seçeneklerden doğru olanları seçtikten sonra Gönder butonuna basınız. Sonuçları doğru ve yanlış görebilirsiniz.
Docker imajları varsayılan olarak nereden indirilirler?
- ( ) Docker Trusted Registry
- (x) Docker Hub
- ( ) Varsayılan yoktur
- ( ) Docker Store
Docker imajlarını nasıl listelersiniz?
- (x) docker image ls
- ( ) docker run
- ( ) docker container ls
Aşağıdakilerden hangisi ubuntu 20.10(groovy) bir konteyner içerisinde komut satırına bağlanır?
- ( ) docker run ubuntu:groovy /bin/bash
- (x) docker run -it ubuntu:groovy /bin/bash
- ( ) docker pull ubuntu:groovy -c /bin/bash
-
İmajlar ve Docker Hub hakkında bir not: Docker kayıtları birçok repository‘ye (kayıt defteri) bölünmüştür. Görüntü adları benzersiz olmalıdır ve
<repository>/<image>:<tag>
biçiminde belirtilmelidir. Çalışmalarımızda “ubuntu” ve “alpine” adlı imajları indirdik(pull). Herhangi bir depo belirtilmediğinden, Docker’da tarafımızca tutulan “library”(kütüphane) adlı varsayılan bir genel havuzdan aldık. Ve bir etiket belirtmediğimiz için, varsayılan, “latest”(en son) adlı bir etiketi aramış ve onu kullanmıştır. Etiketler genellikle sürümleri belirtir (bu mecburi değildir). ↩ -
vi index.js
yazın ve ardından editör yüklendiğindei
tuşuna basın. Şimdi, örnekte gösterildiği gibi komutların her birini yazabilirsiniz. Bitirdiğinizde<esc>
tuşuna basın ve ardından:wq
yazın, bunu yaparak dosyayı kaydeder ve komut istemine geri dönersiniz. İndex.js dosyanızın orada olduğundan emin olmak için komut isteminels
yazabilir veya tüm kodun dosyada olduğundan emin olmak içincat index.js
yazabilirsiniz. Editör(vim) içinde bir hata yaparsanız ve düzenleyicide gezinmekte zorlanırsanız, yeni bir başlangıç yapmak daha iyi olacaktır: düzenleyicide<esc>
ve ardından:wq
yazıp dosyayı kaydedebilir verm index.js
ile dosyayı silebilirsiniz. ↩ -
vi index.js
yazın ve ardından editör yüklendiğindei
tuşuna basın. Şimdi, örnekte gösterildiği gibi komutların her birini yazabilirsiniz. Bitirdiğinizde<esc>
tuşuna basın ve ardından:wq
yazın, bunu yaparak dosyayı kaydeder ve komut istemine geri dönersiniz. İndex.js dosyanızın orada olduğundan emin olmak için komut isteminels
yazabilir veya tüm kodun dosyada olduğundan emin olmak içincat index.js
yazabilirsiniz. Editör(vim) içinde bir hata yaparsanız ve düzenleyicide gezinmekte zorlanırsanız, yeni bir başlangıç yapmak daha iyi olacaktır: düzenleyicide<esc>
ve ardından:wq
yazıp dosyayı kaydedebilir verm index.js
ile dosyayı silebilirsiniz. ↩