Var olan bir Docker görüntüsünü alma ve yerel ortamda dağıtma
Docker, uygulama ve hizmetleri hızlı ve kolay bir şekilde dağıtmanızı sağlayan bir teknolojidir. Docker uygulamaları, Docker görüntülerini kullanarak çalışır. Docker görüntüsü, uygulama kodunu ve kodun yürütüldüğü ortamı içeren önceden paketlenmiş bir ortamdır.
Daha önce de anlatılan kurumsal senaryo doğrultusunda Docker ile uygulama paketleme ve çalıştırma süreçlerinin uygulanabilirliğini araştırmak istiyorsunuz. Test amaçlı web uygulamasını çalıştıran bir Docker görüntüsü oluşturmaya ve dağıtmaya karar veriyorsunuz.
Bu ünitede Docker görüntüsü halinde depolanan bir kapsayıcılı uygulamayı çalıştırma kapsamındaki temel kavramlar ve süreçler hakkında bilgi edineceksiniz.
Docker'a genel bakış
Docker, kapsayıcılı uygulamaları çalıştırmak için kullanılan bir araçtır. Kapsayıcılı uygulamalar hem uygulamayı hem de bu uygulamanın içinde çalıştırıldığı ortamı oluşturan dosya sistemini içerir. Örneğin kapsayıcılı uygulama bir veritabanından ve uygulamayı çalıştırmak için gereken ilişkili yazılım ve yapılandırma bilgilerinden oluştur.
Kapsayıcılı uygulamalar genellikle aynı uygulamayı çalıştırmak üzere yapılandırılmış bir sanal makineden çok daha küçük bir ayak izine sahiptir. Bu küçük ayak izinin nedeni, sanal makinenin işletim sisteminin ve ilgili destek ortamının tamamını sağlamak zorunda olmasıdır. Docker, kapsayıcıyı çalıştırmak için konak bilgisayarın sistem çekirdeğini kullandığından Docker kapsayıcıları bu yüke sahip değildir. Docker görüntüsünü indirip başlatmak, benzer işlevler sağlayan bir sanal makineyi indirip çalıştırmaktan daha hızlı ve alan açısından daha verimlidir.
Docker'ın kullandığı bir dosya kümesini ve yapılandırma bilgilerinin bir bölümünü içeren bir görüntü oluşturarak kapsayıcılı bir uygulama oluşturursunuz. Uygulamayı çalıştırmak için Docker'a görüntüyü temel alan bir kapsayıcıyı çalıştırma isteği gönderirsiniz. Kapsayıcı başlatıldığında Docker, görüntü yapılandırmasını kullanarak kapsayıcı içinde çalıştırılacak uygulamayı belirler. Docker, işletim sistemi kaynaklarını ve gerekli güvenliği sağlar. Kapsayıcıların eşzamanlı olarak çalışmasını ve görece yalıtılmış kalmasını sağlar.
Önemli
Docker, sanal makinelerle birlikte sunulan yalıtım düzeyini sağlamaz. Sanal makineler, donanım seviyesinde yalıtım sağlar. Docker kapsayıcıları temel işletim sistemi kaynaklarını ve kitaplıklarını paylaşır. Öte yandan Docker, kapsayıcılar bunu yapmak üzere yapılandırılmadığı sürece bir kapsayıcının diğerlerinin kaynaklarına erişememesini sağlar.
Yerel ortamda geliştirme ve test yapıyorsanız Docker'ı masaüstü veya dizüstü bilgisayarınızda çalıştırabilirsiniz. Üretim sistemleri için Docker, birçok farklı Linux dağıtımı ve Microsoft Windows Server 2016 dahil olmak üzere sunucu ortamlarında kullanılabilir durumdadır. Birçok üretici bulutta Docker desteği de sunmaktadır. Örneğin Docker görüntülerinizi Azure Container Registry'de depolayabilir ve Azure Container Instances ile çalıştırabilirsiniz.
Bu modülde Docker'ı yerel olarak kullanarak bir görüntü oluşturacak ve çalıştıracaksınız. Ardından görüntüyü Azure Container Registry'ye yükleyecek ve bir Azure Container Instance'da çalıştıracaksınız. Docker'ın bu sürümü Docker görüntülerinin yerel ortamda geliştirilmesi ve test edilmesi için uygundur.
Linux ve Windows Docker görüntüleri
Docker başlangıçta Linux için geliştirilmiştir ve o zamandan beri Windows'u destekleyecek şekilde genişletilmiştir. Docker görüntüleri Windows veya Linux tabanlı olabilir ancak aynı anda ikisi birden olamaz. Görüntünün işletim sistemi, kapsayıcının içinde ne tür bir işletim sistemi ortamı kullanıldığını belirler.
Hem Linux tabanlı hem de Windows tabanlı görüntülerde benzer işlevler sunmak isteyen Docker görüntüsü yazarları bu görüntüleri ayrı olarak oluşturabilir. Örneğin Microsoft, kapsayıcılı ASP.NET Core uygulamaları için temel olarak kullanabileceğiniz bir ASP.NET Core ortamı içeren Windows ve Linux Docker görüntüleri sunar.
Docker yüklü Linux bilgisayarlar yalnızca Linux kapsayıcıları çalıştırabilir. Docker yüklü Windows bilgisayarlar iki kapsayıcı türünü de çalıştırabilir. Windows, linux sistemini çalıştırmak için hem sanal makine kullanarak hem de Linux kapsayıcılarını çalıştırmak için sanal Linux sistemini kullanarak çalışır.
Bu modülde Linux tabanlı bir görüntü oluşturacak ve çalıştıracaksınız.
Docker kayıt defterleri ve Docker Hub
Docker görüntüleri, kayıt defterleri içinde depolanır ve kullanıma sunulur. Kayıt defteri, Docker'ın kapsayıcı görüntülerini yüklemek ve indirmek için bağlanabileceği bir web hizmetidir. En çok bilinen kayıt defteri, genel bir kayıt defteri olan Docker Hub'dır. Docker Hub'da görüntü yayımlayan birçok kişi ve kuruluş vardır. Bu görüntüleri masaüstü, sunucu veya bulutta çalışan Docker ortamına indirip çalıştırabilirsiniz. Ücretsiz bir Docker Hub hesabı oluşturabilir ve görüntülerinizi oraya yükleyebilirsiniz.
Kayıt defteri, depolardan oluşan bir dizi olarak düzenlenmiştir. Her depoda ortak bir ada, genellikle aynı amaca ve işleve sahip olan birden fazla Docker görüntüsü bulunur. Bu görüntüler normalde bir etiketle tanımlanan farklı sürümlere sahiptir. Bu mekanizma sayesinde uyumluluk gereksinimlerini karşılamak için görüntülerin birden fazla sürümünü yayımlayabilir ve saklayabilirsiniz. Bir görüntüyü indirip çalıştırmak istediğinizde görüntünün kayıt defterini, deposunu ve sürüm etiketini belirtmeniz gerekir. Etiketler, sürüm numarası sisteminizi (v1.0, v1.1, v1.2, v2.0 gibi) kullanabileceğiniz metin etiketleridir.
ASP.NET Core Çalışma Zamanı Docker görüntüsünü kullanmak istediğinizi düşünün. Bu görüntü iki sürüm olarak sağlanır:
mcr.microsoft.com/dotnet/core/aspnet:2.2
mcr.microsoft.com/dotnet/core/aspnet:2.1
Şimdi .NET Core örneklerinin Docker görüntülerini kullanmak istediğinizi düşünelim. Burada, aralarından seçim yapabileceğiniz dört sürüm vardır:
mcr.microsoft.com/dotnet/samples:dotnetapp
mcr.microsoft.com/dotnet/samples:aspnetapp
Not
Bir görüntüye birden fazla etiket atanabilir. Kural gereği, görüntünün en son sürümüne sürüm numarasını açıklayan bir etikete ek olarak en son etiket atanır. Görüntünün yeni sürümünü yayımladığınızda latest etiketini yeni görüntüye atayabilirsiniz.
Depo, aynı zamanda bir görüntünün gizlilik birimidir. Paylaşmak istemediğiniz görüntülerin deposunu özel olarak işaretleyebilirsiniz. Görüntüyü paylaşmak istediğiniz diğer kullanıcılara erişim verebilirsiniz.
Docker Hub'a göz atma ve görüntü çekme
Not
Aşağıdaki bölümlerde örneklerin hiçbirini tamamlamanız veya kodu çalıştırmanız gerekmez. Bunu bir sonraki ünitede yapacaksınız.
Docker Hub'da genellikle kapsayıcıya almak istediğiniz uygulama türüyle yakından eşleşen bir görüntü olduğunu görürsünüz. Böyle durumlarda ilgili görüntüyü indirip uygulama kodunuzla genişletebilirsiniz.
Docker Hub'da binlerce görüntü vardır. Komut satırından Docker'ı veya Docker Hub web sitesini kullanarak kayıt defterinde arama yapabilir ve kayıt defterine göz atabilirsiniz. Web sitesi türüne ve yayıncısına göre görüntüleri aramanıza, filtrelemenize ve seçmenize olanak tanır. Aşağıdaki şekilde örnek bir arama sayfası gösterilmiştir.
Görüntüyü almak için görüntü adıyla docker pull
komutunu kullanırsınız. Varsayılan olarak, yalnızca depo adını belirtirseniz Docker tarafından Docker Hub'daki bu depodan latest
etiketli görüntü indirilir. Farklı depolardan farklı etiketler çekmek için komutu değiştirebileceğinizi unutmayın. Bu örnek mcr.microsoft.com/dotnet/core/samples:aspnetapp deposundan aspnetapp
etiketli görüntüyü getirir. Bu görüntü basit bir ASP.NET Core web uygulaması içerir.
Not
Bu ünitedeki örnekler, çeşitli Docker komutlarının söz dizimini göstermek için seçilmiştir. Bu üniteyi okurken bu komutları çalıştırmanıza gerek yoktur. Bu üniteden sonra gelen alıştırmalarda doğrudan Docker ile çalışma konusunda gerekli yönergeler gösterilecektir.
docker pull mcr.microsoft.com/dotnet/samples:aspnetapp
Getirdiğiniz görüntüler Docker'da yerel olarak depolanır ve kapsayıcı çalıştırmak için uygun hale getirilir. Yerel kayıt defterinizdeki görüntüleri listelemek için docker image list komutunu kullanabilirsiniz.
docker image list
Çıktı aşağıdaki örneğe benzer:
REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples aspnetapp 6e2737d83726 6 days ago 263MB
Diğer Docker komutlarında görüntüye başvurmak için görüntü adı kimliğini kullanabilirsiniz.
Docker kapsayıcısı çalıştırma
Bir kapsayıcıyı başlatmak için docker run
komutunu kullanın. Adını veya kimliğini kullanarak çalıştırılacak görüntüyü belirtin. Görüntü için önceden docker pull
komutunu kullanmadıysanız Docker bunu sizin yerinize yapacaktır.
docker run mcr.microsoft.com/dotnet/samples:aspnetapp
Bu örnekte komut aşağıdaki iletiyle yanıt verir:
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.
Bu görüntü bir web uygulaması içerdiğinden 80 numaralı HTTP bağlantı noktasından gelecek istekleri dinlemektedir. Ancak bir web tarayıcısı açıp http://localhost:80
adresine gittiğinizde uygulamayı göremezsiniz.
Docker varsayılan olarak dışarıdan gelen ağ isteklerinin kapsayıcınıza erişmesine izin vermez. docker run
komutuna -p
seçeneğini ekleyerek Docker'a bilgisayarınızdaki belirli bir bağlantı noktası numarasını kapsayıcıdaki belirli bir bağlantı noktası numarasına atamasını bildirmeniz gerekir. Bu yönergeler belirtilen bağlantı noktasında kapsayıcıya yönelik ağ isteklerine olanak tanır.
Ayrıca bu görüntüdeki web uygulaması, komut satırından etkileşimli olarak kullanılmak üzere tasarlanmamıştır. Komutu verdiğimizde Docker'ın bunu arka planda başlatmasını ve yalnızca çalışır durumda tutmasını istiyoruz. Docker'a web uygulamasını arka planda başlatmasını bildirmek için -d
bayrağını kullanın.
Görüntüyü durdurmak için Ctrl+C tuşlarına basın ve ardından aşağıdaki örnekte gösterildiği gibi yeniden başlatın:
docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp
Komut, kapsayıcının 80 numaralı bağlantı noktasını bilgisayarınızın 8080 numaralı bağlantı noktasına eşler. Tarayıcıdan http://localhost:8080
sayfasına gittiğinizde örnek web uygulamasını görürsünüz.
Kapsayıcılar ve dosyalar
Çalışan bir kapsayıcının görüntüsündeki dosyalara yaptığı değişiklikler yalnızca değişikliklerin yapıldığı kapsayıcıya yansıtılır. Kapsayıcının durumunu korumak için belirli adımlar atmadığı sürece, kapsayıcı kaldırıldığında bu değişiklikler kaybolur. Benzer şekilde, aynı görüntüyü temel alan ve aynı anda çalışan birden çok kapsayıcı görüntüdeki dosyaları paylaşmaz. Her kapsayıcının kendi bağımsız kopyası vardır. Bir kapsayıcı tarafından dosya sistemine yazılan veriler diğerinde görünmez.
Bir kapsayıcıya yazılabilir birimler ekleyebilirsiniz. Birim, kapsayıcı tarafından takılabilen ve kapsayıcıda çalışan uygulama tarafından kullanılabilen bir dosya sistemini temsil eder. Birimdeki veriler kapsayıcı durduğunda kalıcı olur ve bir birim birden fazla kapsayıcı tarafından paylaşılabilir. Birim oluşturma ve kullanma adımları bu modülün kapsamının dışındadır.
Docker ile dağıtılan uygulamalar için görüntü dosya sisteminde değişiklik yapma gereğini ortadan kaldırmanız en iyi yöntemdir. Bunu yalnızca kaybetmeyi göze alabileceğiniz geçici dosyalar için kullanın.
Docker kapsayıcılarını yönetme
Etkin kapsayıcıları görüntülemek için docker ps
komutunu kullanabilirsiniz.
docker ps
Çıktı, görüntü başlatıldığında belirtilen komut satırı bayrakları ve ek bilgiler gibi diğer değerlerin yanı sıra kapsayıcının durumunu (çalışıyorsa Yukarı , sonlandırıldıysa Çıkıldı ) içerir. Docker aynı görüntüden aynı anda birden çok kapsayıcı çalıştırmanıza olanak tanır, böylece her kapsayıcıya benzersiz bir kimlik ve benzersiz bir insan tarafından okunabilir ad atanır. Kapsayıcıları yönetmek için kullanılan çoğu Docker komutunda bir kapsayıcıyı belirtmek için kimlik veya ad kullanılabilir.
Aşağıdaki çıkışta iki kapsayıcı görebilirsiniz. PORTS alanı, elegant_ramanujan
kimliğine sahip kapsayıcının Docker konağındaki 80 numaralı bağlantı noktası bilgisayarınızdaki 8080 numaralı bağlantı noktasına eşlenmiş olan görüntü olduğunu gösterir. youthful_heisenberg
örneği, görüntünün bir önceki çalıştırmasına ait kapsayıcıdır. COMMAND alanı, kapsayıcının görüntüdeki uygulamayı başlatmak için çalıştırdığı komutu gösterir. Bu durumda, her iki kapsayıcı için de dotnet aspnetapp.dll. Kapsayıcıların görüntü kimliği de aynıdır çünkü her iki kapsayıcı da aynı görüntüyü yürütür.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 42 seconds ago Up 41 seconds 0.0.0.0:8080->80/tcp elegant_ramanujan
d27071f3ca27 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 5 minutes ago Up 5 minutes 0.0.0.0:8081->80/tcp youthful_heisenberg
Not
docker ps
, docker container ls
için kullanılan bir kısayoldur. Bu komutların adları çalışan işlemleri ve dosyaları listeleyen ps
ve ls
Linux yardımcı programlarını temel almaktadır.
Kapsayıcı kimliğini belirterek komutuyla docker stop
etkin bir kapsayıcıyı durdurabilirsiniz.
docker stop elegant_ramanujan
docker ps
komutunu tekrar çalıştırdığınızda elegant_ramanujan kapsayıcısının çıktıda artık bulunmadığını görebilirsiniz. Kapsayıcı hala var, ancak artık çalışan bir işlemi barındırmaz. -a
bayrağını ekleyerek docker ps
komutunun çıktısında durdurulmuş kapsayıcıların da gösterilmesini sağlayabilirsiniz:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 2 minutes ago Exited (0) 21 seconds ago elegant_ramanujan
d27071f3ca27 mcr.microsoft.com/dotnet/core/samples:aspnetapp "dotnet aspnetapp.dll" 7 minutes ago Up 7 minutes 0.0.0.0:8081->80/tcp youthful_heisenberg
Durdurulmuş kapsayıcıları docker start
komutuyla yeniden başlatabilirsiniz. Kapsayıcının ana işlemi yeniden başlatılır.
docker start elegant_ramanujan
Durdurulan kapsayıcılar normalde kaldırılmalıdır. Kapsayıcı kaldırıldığında kullandığı kaynaklar da temizlenir. Bir kapsayıcıyı kaldırdığınızda görüntü dosya sisteminde yapılan değişiklikler kalıcı olarak silinir.
docker rm elegant_ramanujan
Çalışmakta olan bir kapsayıcıyı kaldıramazsınız, ancak komutunda -f bayrağıyla bir kapsayıcının durdurulmasını ve kaldırılmasını docker rm
zorlayabilirsiniz. Bu, kapsayıcıyı durdurmanın ve kaldırmanın hızlı bir yoludur, ancak yalnızca kapsayıcının içindeki uygulamanın düzgün bir kapatma gerçekleştirmesi gerekmiyorsa kullanılmalıdır.
docker container rm -f elegant_ramanujan
Docker görüntülerini kaldırma
Yerel bilgisayarınızdaki görüntüleri docker image rm
komutuyla kaldırabilirsiniz. Kaldırmak istediğiniz görüntünün kimliğini belirtin. Aşağıdaki örnek, örnek web uygulaması için görüntüyü kaldırır.
docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp
Görüntünün kaldırılabilmesi için görüntüyü çalıştıran kapsayıcıların sonlandırılması gerekir. Görüntü bir kapsayıcı tarafından hala kullanılıyorsa, aşağıdakine benzer bir hata iletisi alırsınız. Bu örnekte hatanın nedeni, youthful_heisenberg kapsayıcısının görüntüyü kullanmaya devam ediyor olmasıdır.
Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe