Sıfırdan Docker Görüntüsü Oluşturma

Creating Docker Image From Scratch



Docker'ın diğer kapsayıcı teknolojilere göre en büyük avantajı, Docker'ın geliştiricilere ve onların üst düzey uygulamalarına yönelik olmasıdır. Uygun konteynerleştirme teknolojileri gibi LXC , Bölgeler ve hapishaneler operasyon perspektifinden hedeflenir veya basitçe söylemek gerekirse, bu platformlar bulutta çalışan sanal makinelerin yerini alır. Docker, paketlerin ve yürütülebilir ikili dosyaların yerine geçer.

Basitçe söylemek gerekirse, Docker, tüm olası Linux platformlarında çalışan evrensel bir paket yöneticisine giderek daha çok benziyor. Kapsayıcıları alır ve bunları geliştiricilerin karşılaştığı tamamen farklı bir sorunu çözmek için kullanır. Sorun, geliştiricilerin uygulama yazmak için masaüstü işletim sistemlerini (Windows, macOS veya Linux gibi bir ton masaüstü ile ilgili paket içeren) kullanmalarıdır. Yazdıkları uygulama, genellikle geliştiricinin dizüstü bilgisayarından tamamen farklı bir Linux dağıtımına sahip bir sunucudaki tamamen farklı bir işletim sisteminde çalışır.







Docker ile fikir, uygulamanızın bir Docker görüntüsü olarak paketlenmesidir. Bu imajı alıp sizin için containerized bir uygulama olarak çalıştırmak Docker'ın işidir. Kapsayıcılı olmak, uygulamanın ve bağımlılıklarının, geliştiricinin dizüstü bilgisayarından ve hatta üretim sunucusundan tamamen farklı olabilecek yalıtılmış bir ortamda çalışacağı anlamına gelir. İkisi de Docker'ı desteklediği sürece, ikisi de aynı uygulamayı tam olarak aynı şekilde çalıştırabilir.



Bir Docker Görüntüsünün Anatomisi

Daha önce de belirtildiği gibi, bir Docker uygulaması üzerinde anlaşmaya varılan bir ortamda çalışacaktır. Şimdi soru şu, bu ortamı nasıl yaratacağız? Çoğu uygulama görüntüsü, bir Docker temel görüntüsünü içe aktarır ve uygulamalarını bunun üzerine kurar.



Uygulamalar yazılım katmanlarından yapılır. Bir wordpress kapsayıcı görüntüsü, sırayla bir Ubuntu görüntüsünün üzerine inşa edilen bir httpd kapsayıcı görüntüsü kullanılarak oluşturulur. Üzerine daha yeni bir görüntünün oluşturulduğu görüntü, Docker terminolojisinde PARENT IMAGE olarak bilinir. Dockerfile'da (bir Dockerfile'ın ne anlama geldiğine biraz sonra geleceğiz), bu ana görüntü, aşağıda gösterildiği gibi dosyanın üstünde belirtilmiştir:





Ubuntu'DAN:18.04
## Docker dosyasının geri kalanı

Bu Dockerfile yürütüldüğünde, uygulamanızı bir Docker görüntüsüne (bir tür ikili) dönüştürür ve daha sonra başka bir yerde yeni kapsayıcılar oluşturmak için çekilebileceği bir kayıt defterine gönderebilirsiniz. Ancak, hepsinin temel görüntüsü olarak Ubuntu:18.04 olacak ve içinde çalıştıkları bir Ubuntu sistemiymiş gibi çalışacaklar.

Yeni bir liman işçisi görüntüsü çekmeye çalışırken bunu fark etmiş olabilirsiniz.



Sıfırdan Docker Görüntüsü Oluşturma

Bu, gerçek uygulama (sadece birkaç Megabayt boyutunda olabilir) getirilmeden önce kaç katmanın çekildiğini gösterir.

Bu nedenle, temel görüntü olarak bilinen şeyi oluşturmak istiyoruz. Hangi başka bir şeyin üzerine inşa edilmemiş. Scratch anahtar sözcüğü, bu katmanın başka hiçbir şeyin üzerine inşa edilmediğini belirtmek için kullanılır. Şöyle:

sıfırdan
## Dcoker dosyasının geri kalanı

Önce basit bir merhaba dünya uygulaması oluşturacağız ve ardından Dockerfile'ın geri kalanının ne olacağını bulacağız. Ana sistem Ubuntu:18.04 LTS'dir ve deney için Docker 17.12.1-ce sürümünü kullanıyoruz.

Statik bir ikili oluşturma

Docker kapsayıcıları, işletim sisteminin geri kalanından izole çalışan bir işlemler topluluğudur. İşlemin temas halinde olduğu tek şey Kernel'dir. Çekirdek, bu işlemleri CPU'da programlamaktan, bellek yönetimi yapmaktan ve diğer birkaç temel rezervasyon tutma görevinden sorumludur.

Ancak çoğu üst düzey uygulama, birçok sistem kitaplığına bağlıdır (örn. glibc, musl, klibc, vb ) ve Python veya Node.js veya Java Runtime gibi birçok çalışma zamanı bağımlılığı. Uygulama ikili dosyası, içinde mevcut tüm kitaplıklara sahip değildir, ancak yürütmeye başladığında ana bilgisayar işletim sisteminden bu kitaplıkları çağırır.

Sıfırdan bir imaj yaratmaya çalıştığımız için bu güzellikleri alamayacağız. Bu nedenle uygulamamızın statik bir dosya veya bağımsız bir yürütülebilir dosya olması gerekir.

MyDockerImage adında bir klasör oluşturup içine bir hello.cc dosyası oluşturarak başlayalım.

$mkdirMyDockerImage
$CDMyDockerImage
$dokunmamerhaba.cc

Hello.cc'yi favori metin düzenleyicinizi kullanarak açın ve içine aşağıdaki satırları ekleyin.

#Dahil etmek
ad alanı std kullanarak;
intana(){
maliyet<< 'Merhaba! Bu mesaj bir kapsayıcıdan geliyor ';
dönüş 0;

}

Bu, Hello! yazdıran basit bir C++ programıdır. Bu mesaj …

Daha önce tartışılan nedenlerden dolayı bunu statik bayrağı kullanarak derleyeceğiz. Kullanılan derleyici g++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Programı derlemek için aynı dizinde aşağıdaki komutu çalıştırın:

$ gr++ -merhaba-statikMerhaba.DC

Bu, aynı dizinde merhaba bir ikili yürütülebilir dosya oluşturur. Bu bizim statik dosyamız. Terminaldeki dosya adından bahsederek istendiği gibi çalışıp çalışmadığını test edin.

$./Merhaba

Şimdi bu basit programı konteynerleştirmeye hazırız.

docker dosyası

Dockerfile, uygulama dosyalarınızı (ikili dosyalar, kaynak dosyalar vb.) dosya sistemi düzeni, açık bağlantı noktaları vb. gibi çeşitli yapılandırma parametreleriyle birlikte alan ve bunları bir Docker görüntü dosyasına dönüştüren bir dizi kuraldan oluşur. Daha sonra görüntü dosyasını, o uygulamayı çalıştırmak isteyen herkesle paylaşabilirsiniz.

Dockerfile için mevcut olan her seçeneği araştırmayacağız, bunun yerine çok minimalist bir Dockerfile yazacağız. Merhaba yürütülebilir dosyanızın bulunduğu aynı dizinde, adlı boş bir dosya oluşturun. Docker dosyası.

$dokunmadocker dosyası

Favori metin düzenleyicinizle açın ve aşağıdaki satırları ona yazın:

sıfırdan
EKLE merhaba/
CMD['/Merhaba']

kaşımak bir ebeveyn resmi değildir. Bunun yerine, Docker'a görüntünün başka bir görüntünün üzerine inşa edilmediğini gösterir. Sıfırdan inşa edilmiştir. ADD komutu, geçerli dizinden |_+_|adlı statik ikiliyi alır ve onu görüntü dosyasının kök dizinine ekler. Sonunda bu görüntüye dayalı bir kapsayıcı çalıştırdığımızda, merhaba yürütülebilir dosyası kök dizinin kendisinde |_+_|

Son olarak, CMD satırının bir dizesi vardır /Merhaba Bu görüntüden bir kap oluşturulduğunda bu dize bir kabuk komutu olarak yürütülür, böylece kapsayıcımıza eklediğimiz ikili dosya ve uygulamamızda yazdığımız mesajı yazdırır.

öğesini çağırarak görüntüyü oluşturalım. liman işçisi inşa Dockerfile'ın içeriğini gözden geçirecek ve görüntüyü oluşturacak komut. Aşağıdaki komutu Dockerfile ve yürütülebilir ikili dosya ile aynı dizinde çalıştırın.

$liman işçisi inşa--etiketMerhaba .

NS – merhabayı etiketle flag, görüntü adını şu şekilde ayarlar: Merhaba ve nokta ( . ) sonunda söyler liman işçisi inşa Dockerfile ve ilgili içerikler için geçerli dizine bakmak için.

Docker kapsayıcısını çalıştırma

Yeni oluşturduğumuz resmin resim listesinde görünüp görünmediğini kontrol etmek için şunu çalıştırın:

$liman işçisi resimleri

Merhaba resminin diğer resimlerle karşılaştırıldığında ne kadar küçük olduğuna dikkat edin. Her durumda konteyner olarak çalıştırılmaya hazırdır,

$liman işçisi merhaba

Bu kadar! İlk minimalist kapsayıcınızı sıfırdan yarattınız.

Diğer seçenekler

Sıfırdan görüntüler oluşturmak her zaman bir seçenek olsa da, insanlar genellikle diğer hafif Linux dağıtımlarından görüntüler oluşturma eğilimindedir. Örneğin alpine ve meşgul kutusu gibi görüntüler, glibc yerine musl gibi daha küçük kitaplıklara sahip gerçekten hafif ortamlardır.

Bunları kullanarak ana resminiz olarak kullanma alpten:en son daha küçük görüntülere neden olur. Temel görüntülerin boyutu yalnızca 2-5 MB olduğundan. Daha sonra ele almamızı isteyebileceğiniz Docker ile ilgili herhangi bir konu varsa bize bildirin. adresinden bize ulaşabilirsiniz heyecan , Facebook veya e-posta yoluyla bize abone olun.