Veri bilimcileri için en iyi Docker uygulamaları

Yazar | Sohan Ganegedara

Çevirmen | Crescent Moon, Sorumlu Editör | Tang Xiaoyin

Baş resmi | Oriental IC'den indirilen CSDN

Bir veri bilimci olarak her gün Docker ile uğraşmak zorundayım. Aynalar oluşturmak, içeriği güncellemek ve Python komut dosyaları yazmak günlük görevlerim haline geldi. Bu süreçte sık sık iç çekiyorum: "Keşke bu yöntemleri daha önce bilseydim."

Bu nedenle, bu makalede, veri bilimi projelerinde kullanılacak bazı en iyi Docker uygulamalarını inceleyeceğim. Kapsamlı olmasa da, veri bilimcilerin çalışmalarının çoğunu ele aldım.

Bu makale, Docker'ın temellerini belirli bir şekilde anladığınızı varsayar. Örneğin, Docker'ın amacını biliyorsunuz ve kolayca Dockerfile yazabilir ve Docker komutlarını (RUN, CMD vb.) Anlayabilirsiniz. Bu temel bilgileri anlamıyorsanız, lütfen önce resmi Docker web sitesindeki belgeleri okuyun.

Neden Docker'ı seçmelisiniz?

Docker, piyasaya sürüldüğünden beri dünyayı kasıp kavurdu. Docker'dan önceki günlerde bu alandaki boşluğu sanal makineler dolduruyordu. Ancak Docker, sanal makinelerden çok daha fazla işlev sağlar.

Docker'ın Avantajları

  • izolasyon: Temel işletim sistemi / altyapısı, kurulu yazılımlar, güncellemeler vb. Nasıl değişirse değişsin Docker yalıtılmış bir ortam sağlayabilir.

  • Hafif: Paylaşılan işletim sistemi çekirdeği, her kapsayıcı için işletim sistemi çekirdeği ayırmaya gerek yoktur.

  • verim: Hafiftir, aynı anda aynı işletim sistemi üzerinde birden çok kapsayıcı çalıştırabilirsiniz.

Docker ile başlarken

Docker, üç önemli kavram içerir.

Ayna: Bu, bir geliştirme / üretim / test ortamını temsil eden çalıştırılabilir kitaplıklar ve ikili dosyalar koleksiyonudur. Aşağıdaki şekillerde bir ayna görüntüsü indirebilir / oluşturabilirsiniz.

  • Ayna havuzundan çıkartın, örneğin: docker pull alpine. Bu komut bilgisayarda yerel olarak alp adında bir yansıtma arayacaktır.Eğer bulamazsa, bulmak için Dockerhub'a gidin.

  • Görüntüyü yerel olarak derlemek için Dockerfile kullanın, örneğin: docker build. -T < image_name > : < image_version > . Bu komut görüntüyü indirmek / çekmek değil, kendi görüntünüzü oluşturmak içindir. Dockerfile FROM içerdiği için bu ifade tamamlanmadı. < temel görüntü > Baştaki satır, bu satır kendisiyle başlayan temel imajı bulacak ve bulunamazsa Dockerhub'dan çıkartılacaktır.

konteyner: Kap, görüntünün çalışan örneğidir. Aşağıdaki komutla bir konteyner oluşturabilirsiniz: `docker container run < argümanlar > < görüntü > < komut > . Örneğin, alpine dayalı bir konteyner oluşturma komutu şöyledir: docker container run -it alpine / bin / bash.

Ses: Kapsayıcılar tarafından kullanılan verileri (günlükler, indirilen veriler vb.) Depolamak için hacimler kullanırız. Ek olarak, hacim birden fazla konteyner arasında paylaşılabilir. Sesi aşağıdaki şekillerde kullanabilirsiniz.

  • Birim oluştur: Birim oluşturma komutu: docker volume create < birim_adı > . Lütfen bir birimi silerseniz, içinde depolanan bilgilerin kaybolacağını unutmayın.

  • Bağlama bağlama birimi: Ana bilgisayardaki mevcut birimi kapsayıcıya bağlama ve bağlama komutu şöyledir: -v < kaynak > : < hedef > . Örneğin, volume / my_data'yı hacim / veri olarak kapsayıcıya bağlamanız gerekiyorsa, şu komutu çalıştırabilirsiniz: docker container run -it -v / my_data: / data alpine / bin / bash. Montaj sırasında yaptığınız değişiklikler ana bilgisayara yansıtılacaktır.

Bir, bir ayna yarat

1. Görüntü çok büyük olmamalı ve önbelleğe almaktan kaçınılmalıdır

Bir görüntü oluştururken önce iki şey yapmalısınız:

  • Linux paketlerini kurun

  • Python kitaplığını yükleyin

Bu paketleri ve kitaplıkları kurarken, paket yöneticisi verileri önbelleğe alır, böylece yeniden kurduğunuzda yerel verileri kullanabilirsiniz. Ancak bu, tamamen gereksiz olan görüntünün boyutunu artıracaktır. Docker görüntüleri olabildiğince hafif tutulmalıdır.

Linux yazılım paketini kurarken, önbelleğe alınmış tüm verileri silmek için apt-get installl komutuna bir satır eklemeyi unutmayın.

ÇALIŞTIR apt-get update apt-get install tini \ rm -rf / var / lib / apt / list / *

Python paketini yüklerken önbelleğe almaktan kaçınmak için lütfen aşağıdaki adımları izleyin:

RUN pip3 kurulumu < kütüphane-1 > < kütüphane-2 > --no-cache-dir`

2. Python kitaplığını gereksinimler.txt dosyasında ayrı olarak belirtin

Python kitaplığını gereksinim.txt dosyasında ayrı ayrı belirtmek ve ardından kitaplığı aşağıdaki komutla kurmak en iyisidir.

ÇALIŞTIR pip3 yükleme -r gereksinimleri.txt --no-cache-dir

Bu yaklaşım, Dockerfile ve Python kitaplıkları arasında iyi bir ayrım olabilir. Ek olarak, birden fazla Dockerfile'ınız varsa (örneğin üretim / geliştirme / test için) ve hepsinin aynı kitaplığı kurmasını istiyorsanız, bu komutu kolayca yeniden kullanabilirsiniz. Requirements.txt dosyası yalnızca bir grup kitaplık adı içerir.

numpy == 1.18.0 scikit-learn == 0.20.2 pandalar == 0.25.0

3. Kitaplık sürümünü değiştirin

Lütfen gereksinimleri.txt'ye yüklenecek sürümü dondurmanız gerektiğini unutmayın ki bu çok önemlidir. Aksi takdirde, bir Docker imajını her oluşturduğunuzda, farklı bir versiyon kurabilirsiniz, o zaman "bağımlılık cehennemi" ile karşılaşacaksınız.

İkincisi, konteynerin çalışması

1. Root olmayan kullanıcıları daha fazla kullanın

Konteyneri çalıştırırken, çalışan kullanıcı kimliğini belirtmezseniz, varsayılan olarak kök kullanıcı kullanılacaktır. Önceden saftım ve özellikle sudo veya root kullanmayı severdim. Ancak, gereksiz ayrıcalıklara sahip olmanın gereksiz sorunlara neden olacağı konusunda acı bir ders aldım.

Konteyneri kök olmayan bir kullanıcı olarak çalıştırmak istiyorsanız, aşağıdaki komutu çalıştırmanız yeterlidir:

docker run -it -u < Kullanıcı kimliği > : < Grup kimliği > < resim adı > < komut >

Mevcut bir konteynere girmek istiyorsanız, aşağıdaki komutu çalıştırabilirsiniz:

docker exec -it -u < Kullanıcı kimliği > : < Grup kimliği > < kapsayıcı kimliği > < komut >

Örneğin geçebilirsin < Kullanıcı kimliği > $ (İd -u) olarak belirtin, < Grup kimliği > Kapsayıcıdaki kullanıcı kimliği ve grup kimliğini ana bilgisayarla eşleştirmek için $ (id -g) olarak belirtin.

Farklı işletim sistemlerinin, kullanıcı kimliklerini ve grup kimliklerini atamanın farklı yolları olduğunu unutmayın. Örneğin, MacOS'taki kullanıcı kimliği / grup kimliği Ubuntu kapsayıcısında önceden tahsis edilmiş / ayrılmış kullanıcı kimliği / grup kimliği olabilir.

2. Ayrıcalıklı olmayan bir kullanıcı oluşturun

Konteynere ana bilgisayardan root olmayan bir kullanıcı olarak giriş yapabiliriz. Ancak, bu şekilde oturum açarsanız, kapsayıcıda bir kullanıcı adınız olmaz. Çünkü açıkçası konteyner, kullanıcı kimliğinin nereden geldiğini bilmiyor. Ayrıca, bir konteyneri her başlatmak veya yürütmek istediğinizde, bu kullanıcı kimliklerini ve grup kimliklerini hatırlamanız ve girmeniz gerekir. Bu sorunlardan kaçınmak için Dockerfile'da kullanıcılar / gruplar oluşturabilirsiniz.

ARG UID = 1000 ARG GID = 1000
  • Önce Dockerfile'a ARG UID = 1000 ve ARG GID = 1000 ekleyin. UID ve GID, konteynerdeki ortam değişkenleridir. Docker derleme aşamasında değerleri konteynere aktarabilirsiniz (varsayılan 1000'dir).

  • Daha sonra RUN groupadd -g $ GID john-group aracılığıyla, GID grup kimliğine sahip Linux grubunu aynaya ekleyin.

  • Ardından, useradd -N -l -u $ UID -g john-group -G sudo john aracılığıyla, görüntüye kullanıcı kimliği UID olan Linux kullanıcılarını ekleyin. Burada, sudo grubuna john ekleyeceğiz. Ancak bu isteğe bağlıdır. Sudo izinlerine ihtiyacınız olmadığından% 100 eminseniz, bu adımı göz ardı edebilirsiniz.

Ardından, görüntü oluşturma sırasında bu parametreler için değerler iletebilirsiniz, örneğin:

Docker derlemesi < build_dir > -t < görüntü > : < image_tag > --build-arg UID = < uid-değeri > --build-arg GID = < gid-değeri >

Örneğin:

docker build. -t docker-tut: en yeni --build-arg UID = $ (id -u) --build-arg GID = $ (id -g)

Ayrıcalıksız bir kullanıcıya sahip olmak, kök ayrıcalıkları gerektirmeyen süreçleri çalıştırırken çok kullanışlıdır. Örneğin, Python betiğiniz yalnızca bir dizinden veri okuyup yazıyorsa, onu kök olarak çalıştırmanıza gerek yoktur. Ek olarak, başka bir avantaj daha vardır: Kapsayıcıdaki kullanıcı kimliği ve grup kimliği ana makineyle tam olarak eşleşirse, oluşturduğunuz tüm dosyalar ana bilgisayar kullanıcısının sahipliğine sahip olur. Bu nedenle, bu dosyaları bağlarsanız (veya yeni dosyalar oluşturursanız), ana bilgisayarda oluşturulmuş gibi görünecektir.

Üç, bir cilt oluştur

1. Ayırma için rulo kullanın

Bir veri bilimcisi olarak çeşitli veriler, modeller ve kodlarla uğraşmanız gerekir. Kodu bir birime (örneğin / app) ve verileri başka bir birime (örneğin, / data) koyabilirsiniz. Bu şekilde Docker görüntünüz iyi bir yapıya sahip olabilir ve tüm ana bilgisayar düzeyindeki bağımlılıklardan kurtulabilir.

Bu bağımlılıkla ne demek istiyorum? Kodu / home / içine koyduğunuzu varsayalım < kullanıcı > / kod / src. / Home / ayarlarsanız < kullanıcı > / code / src kopyalandı / birim / uygulama ve / home / içine eklendi < kullanıcı > / code / data birime / veriye bağlanır, bu nedenle kodun ve ana bilgisayardaki verilerin konumu değişse bile önemli değildir. Docker görüntüsüne bağlandıktan sonra konumları değişmeyecektir. Bu nedenle, bu yolları Python betiğinde aşağıdaki gibi tanımlayabilirsiniz.

data_dir = "/ data" model_dir = "/ modeller" src_dir = "/ uygulama"

Gerekli kodu ve verileri aşağıdaki yöntemlerle aynaya kopyalayabilirsiniz:

Test verilerini / verilerini KOPYALA Test kodunu / uygulamayı KOPYALA

Lütfen hem test verilerinin hem de test kodunun ana bilgisayardaki dizinler olduğunu unutmayın.

2. Geliştirme sırasında dizini bağlayın

Montajın avantajı, kaptaki değişikliklerin ana makineye yansıtılmasıdır. Bu yaklaşım, projeleri geliştirirken ve hata ayıklarken çok kullanışlıdır. Bir örneğe bakalım.

Aşağıdaki komutla bir docker görüntüsü oluşturduğunuzu varsayalım:

Docker derlemesi < build-dir > < resim adı > : < görüntü versiyonu >

Dolayısıyla, şimdi görüntünün bir kabını oluşturmak için aşağıdaki komutu kullanabilirsiniz:

docker çalıştırma -it < resim adı > : < görüntü versiyonu > -v / ev / < kullanıcı > / kodum: / kod

Ardından, hata ayıklama sırasında konteynırdaki kodu çalıştırabilirsiniz ve kod değişiklikleri ana bilgisayara yansıtılacaktır. Bunun başlıca nedeni, kapsayıcıda aynı ana bilgisayar kullanıcı kimliğinin ve grup kimliğinin kullanılmasıdır. Yaptığınız tüm değişiklikler ana bilgisayardaki bu kullanıcıdan geliyor gibi görünüyor.

3. Asla ana bilgisayarın kritik dizinini bağlamayın

Bir keresinde komik bir şey yaptım, makinenin ana dizinini Docker konteynerine ekledim ve ana dizinin izinlerini değiştirmek istedim. Söylemeye gerek yok, artık sisteme giriş yapamıyorum ve düzeltmem birkaç saat sürdü. Bu nedenle, sadece ihtiyacınız olanı monte etmelisiniz.

Örneğin, geliştirme sırasında bağlamak istediğiniz üç dizininiz olduğunu varsayalım:

/ev/ < kullanıcı > /benim verim /ev/ < kullanıcı > / kodum /ev/ < kullanıcı > /benim modelim

Doğrudan bir kod satırıyla / home / mount etmek isteyebilirsiniz < kullanıcı > Dizin, ancak bu alt dizinleri ayrı ayrı monte etmek için üç satırlık kod yazmak kesinlikle buna değer, çünkü sizi saatlerce sıkı çalışmadan (hatta günlerce) kurtarabilir.

Dört, diğer ipuçları

1. EKLE ve KOPYALA arasındaki farkı anlayın

Docker'ın ADD ve COPY adında iki komutu olduğunu biliyor olabilirsiniz, peki bu ikisi arasındaki fark nedir?

  • EKLE: ADD kullanabilirsiniz < url > Dosyayı URL'den indirin.

  • EKLE: Sıkıştırılmış bir dosya (tar.gz gibi) dosyayı belirtilen konumdan çıkaracaksa, ADD'yi kullanın.

  • KOPYALA: Bir dosyayı / klasörü konteynerin belirtilen konumuna kopyalayın.

2. ENTRYPOINT ve CMD arasındaki fark

Bir benzetme yapmama izin verin, ENTRYPOINT'i bir araba olarak düşünebilirsiniz ve CMD aracın kumandasıdır (gaz, fren, direksiyon simidi gibi). ENTRYPOINT'in kendisi herhangi bir işlem gerçekleştirmez, sadece konteynerde gerçekleştirdiğiniz işlemleri tutan bir kutudur. Konteynere ittiğiniz hiçbir komutu işlemez.

CMD komutu, kapta fiilen yürütülen komuttur. Örneğin, bash kabın içinde bir kabuk oluşturacaktır, böylece kabı Ubuntu'da normal bir terminal gibi kullanabilirsiniz.

3. Dosyaları mevcut kapsayıcıya kopyalayın

Bir kapsayıcı oluşturduktan sonra görüntüye dosya eklemeyi unutarak sık sık hata yaparız. Görüntünün oluşturulması uzun zaman alıyor. Bu sorunu önlemenin ve mevcut kapsayıcıya otomatik olarak dosya eklemenin bir yolu var mı?

Bu işlemi gerçekleştirmek için docker cp komutunu kullanabilirsiniz. Basit:

docker cp < src > < konteyner > : < dest >

Konteynere bir dahaki sefer girdiğinizde, kopyalanan dosyaların yalan söylediğini görebilirsiniz. < dest > içinde. Ancak, bir sonraki derleme sırasında gerekli dosyaları kopyalayabilmeniz için Dockerfile'ı değiştirmeyi unutmayın.

İngilizce: Veri Bilimciler için Docker En İyi Uygulamaları

Bağlantı: https://towardsdatascience.com/docker-best-practices-for-data-scientists-2ed7f6876dff

Yazar: Böylecehan Ganegedara, matematik bilimci.

Bu makale bir CSDN çevirisidir, lütfen yeniden basımın kaynağını belirtin.

Bu geceden itibaren, tüm Guangzhou şehri onlara haraç vermek için aydınlanacak! En güzel retrograd
önceki
Programlama dili performansı ölçüldü, Go Python'dan daha mı iyi?
Sonraki
Drone topluluğunda bir daire içinde vücut ısısını ölçmek için kullanılan teknoloji mi var?
Bugün süreç bana ipliğin artık yaşamak istemediğini söyledi
Matplotlib çiziminin temel ilkelerinin açıklaması
Kırıldı ve Python ölümüne oynadı! Netizen: Ne yazık
Programın hafıza düzeninden bahsetmek
Fusing ve downgrading elde etmek için ASP.NET Core nasıl kullanılır?
Baidu Mobil Platformu Android Kanalını Kapatıyor; Apple iPhone SE 2'yi Zorlayacak; Microsoft Açık Kaynak Skaler | Geek Manşetleri
50.000 kişi evde nasıl verimli bir şekilde çalışabilir? ByteDance bir rehber sağlar
Makine öğrenimi yüksek maaş listesine hükmediyor ve blok zinciri öldü mü? 2020 yılında yazılım mühendislerinin durumunun yorumlanması
AI çip geliştirmenin geçmişi ve bugünü
Python'un üç "suçunu" sayın! Neden benden 10 kat daha iyi programlama becerisine sahip insanlar onu övüyor?
Evden çalışıyorum, çalışmaktan daha yorgunum, buna inanıyor musun?
To Top