Var olan bir Docker görüntüsünü alma ve yerel ortamda dağıtma

Tamamlandı

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.

Çeşitli kapsayıcı görüntülerini listeleyen Docker Hub arama sayfasının ekran görüntüsü.

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.

Tarayıcıda çalışan örnek web uygulamasının ekran görüntüsü.

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