Penulis | Thushan Ganegedara
Penerjemah | Bulan Sabit, Editor yang Bertanggung Jawab | Tang Xiaoyin
Gambar kepala | CSDN diunduh dari Oriental IC
Sebagai data scientist, saya harus berurusan dengan Docker setiap hari. Membuat cermin, memperbarui konten, dan menulis skrip Python telah menjadi tugas harian saya. Dalam prosesnya, saya sering mendesah: "Betapa saya berharap dapat mengetahui metode-metode ini sebelumnya."
Oleh karena itu, dalam artikel ini, saya akan membahas beberapa praktik terbaik Docker yang akan digunakan dalam proyek ilmu data. Meskipun tidak lengkap, saya telah membahas sebagian besar pekerjaan data scientist.
Artikel ini mengasumsikan bahwa Anda memiliki pemahaman tertentu tentang dasar-dasar Docker. Misalnya, Anda mengetahui tujuan Docker, dan dapat dengan mudah menulis Dockerfile, serta memahami perintah Docker (seperti RUN, CMD, dll.). Jika Anda kurang memahami dasar-dasar ini, silakan baca dokumentasi di situs resmi Docker terlebih dahulu.
Mengapa memilih Docker?
Sejak dirilis, Docker telah menggemparkan dunia. Pada hari-hari sebelum Docker, mesin virtual mengisi celah di bidang ini. Namun, Docker menyediakan lebih banyak fungsi daripada mesin virtual.
Keuntungan dari Docker
-
isolasi: Tidak peduli bagaimana sistem operasi / infrastruktur dasar, perangkat lunak yang diinstal, pembaruan, dll. Berubah, Docker dapat menyediakan lingkungan yang terisolasi.
-
Ringan: Kernel OS bersama, tidak perlu mengalokasikan kernel OS untuk setiap penampung.
-
kinerja: Ringan, Anda dapat menjalankan banyak kontainer pada sistem operasi yang sama pada waktu yang sama.
Memulai dengan Docker
Docker berisi tiga konsep penting.
Cermin: Ini adalah kumpulan pustaka yang dapat dijalankan dan file biner, yang mewakili lingkungan pengembangan / produksi / pengujian. Anda dapat mengunduh / membuat gambar cermin dengan cara berikut.
-
Ekstrak dari repositori mirror, misalnya: docker pull alpine. Perintah ini akan mencari mirror bernama alpine secara lokal di komputer. Jika tidak dapat menemukannya, buka Dockerhub untuk menemukannya.
-
Gunakan Dockerfile untuk membangun image secara lokal, misalnya: docker build. -T < image_name > : < image_version > . Perintah ini bukan untuk mengunduh / menarik gambar, tetapi untuk membangun gambar Anda sendiri. Pernyataan ini tidak lengkap, karena Dockerfile berisi FROM < gambar dasar > Garis di awal, baris ini akan menemukan gambar dasar yang diawali dengannya, dan jika tidak ditemukan, itu akan diekstraksi dari Dockerhub.
wadah: Penampung adalah instance gambar yang sedang berjalan. Anda dapat membuat container dengan perintah berikut: `docker container run < argumen > < gambar > < perintah > . Misalnya, perintah untuk membuat container berdasarkan alpine adalah: docker container run -it alpine / bin / bash.
volume: Kami menggunakan volume untuk menyimpan data yang digunakan oleh kontainer (seperti log, data yang diunduh, dll.). Selain itu, volume dapat dibagi di antara beberapa wadah. Anda dapat menggunakan volume dengan cara berikut.
-
Buat volume: Perintah pembuatan volume adalah: pembuatan volume buruh pelabuhan < volume_name > . Harap dicatat bahwa jika Anda menghapus volume, informasi yang disimpan di dalamnya akan hilang.
-
Volume mengikat mount: Perintah untuk mengikat dan memasang volume yang ada di host ke penampung adalah: -v < sumber > : < target > . Misalnya, jika Anda perlu me-mount volume / my_data ke container sebagai volume / data, Anda dapat menjalankan perintah berikut: docker container run -it -v / my_data: / data alpine / bin / bash. Perubahan yang Anda buat selama pemasangan akan terlihat di host.
Satu, buat cermin
1. Gambar tidak boleh terlalu besar dan penyimpanan cache harus dihindari
Saat membuat gambar, Anda harus terlebih dahulu melakukan dua hal:
-
Instal paket Linux
-
Instal pustaka Python
Saat menginstal paket dan pustaka ini, pengelola paket akan menyimpan data ke dalam cache sehingga Anda dapat menggunakan data lokal saat menginstalnya lagi. Tetapi ini akan meningkatkan ukuran gambar, yang sama sekali tidak perlu. Gambar Docker harus dibuat seringan mungkin.
Saat menginstal paket perangkat lunak Linux, ingatlah untuk menambahkan baris ke perintah apt-get installl untuk menghapus semua data cache.
JALANKAN pembaruan apt-get apt-get install tini \ rm -rf / var / lib / apt / list / *Untuk menghindari caching saat menginstal paket Python, ikuti langkah-langkah di bawah ini:
JALANKAN pemasangan pip3 < perpustakaan-1 > < perpustakaan-2 > --no-cache-dir`2. Tentukan pustaka Python secara terpisah di Requirement.txt
Cara terbaik adalah menentukan pustaka Python secara terpisah di Requirement.txt, lalu instal pustaka tersebut melalui perintah berikut.
JALANKAN pemasangan pip3 -r requirement.txt --no-cache-dirPendekatan ini bisa menjadi perbedaan yang baik antara pustaka Dockerfile dan Python. Selain itu, jika Anda memiliki beberapa Dockerfile (misalnya untuk produksi / pengembangan / pengujian), dan Anda ingin semuanya menginstal pustaka yang sama, Anda dapat dengan mudah menggunakan kembali perintah ini. File Requirement.txt hanya berisi sekumpulan nama perpustakaan.
numpy == 1.18.0 scikit-learn == 0.20.2 panda == 0.25.03. Ubah versi perpustakaan
Harap dicatat bahwa Anda perlu membekukan versi untuk diinstal di Requirement.txt, yang sangat penting. Karena jika tidak, setiap kali Anda membangun image Docker, Anda mungkin menginstal versi yang berbeda, maka Anda akan menghadapi "neraka ketergantungan".
Kedua, pengoperasian wadah
1. Gunakan lebih banyak pengguna non-root
Saat menjalankan penampung, jika Anda tidak menentukan identitas pengguna yang sedang berjalan, pengguna root akan digunakan secara default. Saya dulu naif, dan saya sangat suka menggunakan sudo atau root. Namun, saya diberi pelajaran pahit bahwa memiliki hak istimewa yang tidak perlu akan menyebabkan masalah yang tidak perlu.
Jika Anda ingin menjalankan container sebagai pengguna non-root, cukup jalankan perintah berikut:
buruh pelabuhan menjalankan -it -u < identitas pengguna > : < group-id > < image-name > < perintah >Jika Anda ingin memasukkan container yang sudah ada, Anda dapat menjalankan perintah berikut:
buruh pelabuhan exec -it -u < identitas pengguna > : < group-id > < container-id > < perintah >Misalnya, Anda bisa lulus < identitas pengguna > Tentukan sebagai $ (id -u), < group-id > Tentukan sebagai $ (id -g) untuk mencocokkan ID pengguna dan ID grup di penampung dengan host.
Perhatikan bahwa sistem operasi yang berbeda memiliki cara yang berbeda untuk menetapkan ID pengguna dan ID grup. Misalnya, ID pengguna / ID grup di MacOS mungkin merupakan ID pengguna / ID grup yang telah dialokasikan sebelumnya / dicadangkan di kontainer Ubuntu.
2. Buat pengguna tanpa hak istimewa
Kita bisa masuk ke penampung dari host sebagai pengguna non-root. Namun, jika Anda masuk dengan cara ini, maka Anda tidak memiliki nama pengguna di penampung. Sebab, jelas penampung tidak tahu dari mana asal user ID tersebut. Selain itu, setiap kali Anda ingin memulai atau menjalankan penampung, Anda perlu mengingat dan memasukkan ID pengguna dan ID grup ini. Untuk menghindari masalah ini, Anda dapat membuat pengguna / grup di Dockerfile.
ARG UID = 1000 ARG GID = 1000-
Pertama tambahkan ARG UID = 1000 dan ARG GID = 1000 ke Dockerfile. UID dan GID adalah variabel lingkungan dalam penampung. Anda dapat meneruskan nilai ke penampung selama fase pembuatan buruh pelabuhan (defaultnya adalah 1000).
-
Kemudian melalui RUN groupadd -g $ GID john-group, tambahkan grup Linux dengan ID grup GID ke mirror.
-
Selanjutnya, melalui useradd -N -l -u $ UID -g john-group -G sudo john, tambahkan pengguna Linux dengan ID pengguna UID ke gambar. Di sini, kami akan menambahkan john ke grup sudo. Tapi ini opsional. Jika Anda 100% yakin bahwa Anda tidak memerlukan izin sudo, abaikan langkah ini.
Kemudian, selama pembuatan gambar, Anda dapat meneruskan nilai untuk parameter ini, misalnya:
buruh pelabuhan membangun < build_dir > -t < gambar > : < image_tag > --build-arg UID = < nilai uid > --build-arg GID = < nilai gid >sebagai contoh:
build docker. -t docker-tut: terbaru --build-arg UID = $ (id -u) --build-arg GID = $ (id -g)Memiliki pengguna yang tidak memiliki hak istimewa sangat berguna saat menjalankan proses yang tidak memerlukan hak akses root. Misalnya, jika skrip Python Anda hanya membaca dan menulis data dari direktori, tidak perlu menjalankannya sebagai root. Selain itu, ada manfaat lain, jika ID pengguna dan ID grup dalam penampung sama persis dengan host, semua file yang Anda buat akan menjadi hak milik pengguna host. Oleh karena itu, jika Anda me-mount file ini (atau membuat file baru), itu akan terlihat seperti dibuat di host.
Tiga, buat volume
1. Gunakan gulungan untuk pemisahan
Sebagai data scientist, Anda perlu menangani berbagai data, model, dan kode. Anda dapat meletakkan kode di satu volume (misalnya, / app) dan data di volume lain (misalnya, / data). Dengan cara ini, image Docker Anda dapat memiliki struktur yang baik dan menyingkirkan semua dependensi level host.
Apa yang saya maksud dengan ketergantungan ini? Misalkan Anda memasukkan kode di / home / < pengguna > / code / src. Jika Anda mengatur / home / < pengguna > / code / src disalin / dipasang ke volume / app, dan / home / < pengguna > / code / data dipasang ke volume / data, jadi meskipun lokasi kode dan data pada host berubah, itu tidak masalah. Setelah dipasang ke image Docker, lokasinya tidak akan berubah. Oleh karena itu, Anda dapat menentukan jalur ini dalam skrip Python sebagai berikut.
data_dir = "/ data" model_dir = "/ model" src_dir = "/ app"Anda dapat menyalin kode dan data yang diperlukan ke mirror dengan metode berikut:
SALIN data uji / data SALIN kode uji / aplikasiHarap dicatat bahwa data uji dan kode uji adalah direktori pada host.
2. Pasang direktori selama pengembangan
Keuntungan dari pemasangan adalah bahwa perubahan dalam penampung akan terlihat pada host. Pendekatan ini sangat nyaman saat mengembangkan dan men-debug proyek. Mari kita lihat contohnya.
Misalkan Anda membuat image buruh pelabuhan dengan perintah berikut:
buruh pelabuhan membangun < build-dir > < image-name > : < versi gambar >Jadi, sekarang Anda dapat menggunakan perintah berikut untuk membuat wadah gambar:
buruh pelabuhan menjalankan -it < image-name > : < versi gambar > -v / home / < pengguna > / kode_saya: / kodeKemudian, Anda dapat menjalankan kode di penampung, saat men-debug, dan perubahan kode akan diterapkan di host. Hal ini terutama disebabkan oleh penggunaan ID pengguna host dan ID grup yang sama dalam penampung. Semua perubahan yang Anda buat tampaknya berasal dari pengguna ini di host.
3. Jangan pernah memasang direktori kritis dari host
Saya pernah melakukan hal yang lucu, saya memasang direktori home mesin ke dalam kontainer Docker dan ingin mengubah hak akses direktori home. Tak perlu dikatakan lagi, saya tidak bisa lagi masuk ke sistem dan butuh beberapa jam untuk memperbaikinya. Oleh karena itu, Anda sebaiknya hanya memasang apa yang Anda butuhkan.
Misalnya, Anda memiliki tiga direktori yang ingin Anda pasang selama pengembangan:
/rumah/ < pengguna > /data saya /rumah/ < pengguna > / kode_saya /rumah/ < pengguna > /model sayaAnda mungkin ingin memasang / home / langsung dengan satu baris kode < pengguna > Direktori, tetapi menulis tiga baris kode untuk memasang subdirektori individual ini secara terpisah pasti sepadan, karena dapat menghemat berjam-jam kerja keras (atau bahkan berhari-hari).
Empat, tips lainnya
1. Pahami perbedaan antara ADD dan COPY
Anda mungkin tahu bahwa Docker memiliki dua perintah yang disebut TAMBAH dan SALIN, jadi apa perbedaan keduanya?
-
TAMBAH: Anda dapat menggunakan TAMBAH < url > Unduh file dari URL.
-
TAMBAHKAN: Jika file terkompresi (seperti tar.gz) akan mengekstrak file dari lokasi yang ditentukan, gunakan ADD.
-
COPY: Salin file / folder ke lokasi tertentu dari wadah.
2. Perbedaan antara ENTRYPOINT dan CMD
Mari saya analogikan, Anda dapat menganggap ENTRYPOINT sebagai mobil, dan CMD adalah pengontrol mobil (seperti akselerator, rem, setir). ENTRYPOINT itu sendiri tidak melakukan operasi apa pun, ini hanya kotak yang menampung operasi yang Anda lakukan di wadah. Itu tidak akan memproses perintah apa pun yang Anda dorong ke penampung.
Perintah CMD adalah perintah yang benar-benar dijalankan dalam wadah. Misalnya, bash akan membuat shell di dalam container, sehingga Anda dapat menggunakan container seperti terminal biasa di Ubuntu.
3. Salin file ke wadah yang ada
Kami sering membuat kesalahan dengan lupa menambahkan file ke gambar setelah membuat wadah. Butuh waktu lama untuk membangun image. Apakah ada cara untuk menghindari masalah ini dan secara otomatis menambahkan file ke penampung yang ada?
Anda dapat menggunakan perintah docker cp untuk melakukan operasi ini. Itu mudah:
buruh pelabuhan cp < src > < wadah > : < tujuan >Lain kali Anda memasuki wadah, Anda dapat melihat file yang disalin tergeletak < tujuan > di. Namun, jangan lupa untuk memodifikasi Dockerfile sehingga Anda dapat menyalin file yang diperlukan selama pembuatan berikutnya.
Bahasa Inggris: Praktik Terbaik Docker untuk Ilmuwan Data
Tautan: https://towardsdatascience.com/docker-best-practices-for-data-scientists-2ed7f6876dff
Penulis: Thushan Ganegedara, ilmuwan matematika.
Artikel ini adalah terjemahan CSDN, harap sebutkan sumber cetak ulang.
- Platform Seluler Baidu Menutup Saluran Android; Apple Akan Mendorong iPhone SE 2; Microsoft Open Sources Scalar | Berita Utama Geek
- Pembelajaran mesin mendominasi daftar gaji tinggi, dan blockchain sudah mati? Interpretasi status insinyur perangkat lunak pada tahun 2020