Menjelajahi Docker, Bagian 4: Mengurangi Ukuran Gambar dan Mempercepat Perakitan Mereka

Di bagian terjemahan seri Docker ini, kami akan berbicara tentang cara mengoptimalkan ukuran gambar dan mempercepat perakitan. Dalam materi sebelumnya, kami membandingkan gambar Docker dengan pizza, istilah dengan donat, dan instruksi Dockerfile dengan bagel. Hari ini tidak akan ada kue. Saatnya melakukan diet.

Bagian 1: dasar-dasarnya
Bagian 2: istilah dan konsep
Bagian 3: File Dockerfile
Bagian 4: mengurangi ukuran gambar dan mempercepat perakitannya
Bagian 5: tim
Bagian 6: bekerja dengan data


Untuk memahami apa yang akan kita bahas di sini, akan berguna bagi Anda untuk menyegarkan ingatan tentang apa yang telah dibahas di bagian ketiga dari rangkaian materi ini. Yaitu, di sana kami berbicara tentang instruksi file Dockerfile. Mengetahui instruksi ini dan fitur Docker yang kami bahas hari ini akan membantu Anda mengoptimalkan file gambar Docker Anda.

Caching


Salah satu kekuatan Docker adalah caching. Berkat mekanisme ini, perakitan gambar dipercepat.

Saat merakit gambar Docker, ia mengikuti instruksi Dockerfile, mengikuti mereka secara berurutan. Dalam proses menganalisis instruksi, Docker memeriksa cache sendiri untuk gambar, yang merupakan apa yang kita dapatkan pada tahap menengah dari perakitan gambar lain. Jika gambar tersebut dapat ditemukan, maka sistem dapat menggunakannya tanpa membuang waktu untuk membuatnya kembali.

Jika cache tidak valid, instruksi di mana itu terjadi dijalankan, membuat layer baru tanpa menggunakan cache. Hal yang sama terjadi ketika mengeksekusi instruksi yang mengikutinya.

Akibatnya, jika selama pelaksanaan instruksi dari Dockerfile ternyata gambar dasar ada di cache, maka gambar dari cache ini digunakan. Ini disebut cache hit. Jika gambar dasar tidak ada dalam cache, maka seluruh proses perakitan gambar akan terjadi tanpa menggunakan cache.

Kemudian instruksi berikut ini dibandingkan dengan semua gambar dari cache, yang didasarkan pada gambar dasar yang sama yang sudah ditemukan dalam cache. Setiap gambar perantara yang di-cache diperiksa untuk melihat apakah gambar tersebut mengandung apa yang dibuat oleh instruksi yang sama. Jika kecocokan tidak ditemukan, ini disebut "cache miss" dan cache dianggap tidak valid. Hal yang sama terjadi hingga seluruh Dockerfile diproses.

Sebagian besar instruksi baru dibandingkan dengan apa yang sudah ada di gambar perantara. Jika sistem berhasil menemukan kecocokan, maka majelis menggunakan apa yang sudah ada dalam cache.

Menggunakan cache dapat mempercepat perakitan gambar, tetapi ada satu masalah. Sebagai contoh, jika RUN pip install -r requirements.txt instruksi ditemukan di Dockerfile, maka Docker mencari instruksi yang sama di cache lokal gambar perantara. Namun, isi dari file requirements.txt versi lama dan baru tidak dibandingkan.

Ini dapat menyebabkan masalah jika informasi tentang paket baru ditambahkan ke requirements.txt , setelah itu, ketika membangun gambar yang diperbarui, untuk menginstal paket yang baru, Anda perlu menjalankan pernyataan RUN pip install lagi. Segera kita akan berbicara tentang cara mengatasi masalah ini.

Tidak seperti instruksi Docker lainnya, saat menjalankan instruksi ADD dan COPY , Docker perlu memeriksa isi file atau file untuk menentukan apakah cache dapat digunakan saat membuat gambar. Yaitu, checksum dari file yang disebutkan dalam instruksi ini dibandingkan dengan checksum dari file yang ada di gambar perantara yang sudah ada di cache. Jika konten file atau metadata-nya telah berubah, maka cache tidak valid.

Berikut adalah beberapa tips untuk meningkatkan cache Docker:

  • Caching dapat dinonaktifkan dengan meneruskan --no-cache=True switch ke docker build .
  • Jika Anda bermaksud untuk melakukan perubahan pada instruksi Dockerfile, maka setiap lapisan yang dibuat oleh instruksi yang datang setelah yang diubah akan dipasang kembali cukup sering, tanpa menggunakan cache. Untuk memanfaatkan caching, letakkan instruksi yang sangat mungkin berubah, sedekat mungkin dengan ujung Dockerfile.
  • Gabungkan perintah RUN apt-get update dan apt-get install in chain untuk menghindari masalah yang terkait dengan penggunaan cache yang tidak tepat.
  • Jika Anda menggunakan manajer paket, seperti pip , dengan file requirements.txt , maka patuhi skema di bawah ini untuk mengecualikan penggunaan gambar perantara yang sudah usang dari cache yang berisi kumpulan paket yang terdaftar di versi lama dari file requirements.txt . Begini tampilannya:

     COPY requirements.txt /tmp/ RUN pip install -r /tmp/requirements.txt COPY . /tmp/ 

Jika Anda tahu cara lain untuk menangani "masalah requirement.txt", Anda dapat mengetahuinya di komentar.

Mengurangi ukuran gambar


▍ Pemilihan gambar dasar dengan cermat


Gambar Docker bisa sangat besar. Ini bertentangan dengan keinginan kuat dari orang yang menciptakan mereka untuk membuatnya sekompleks mungkin, yang akan memudahkan pengunduhan mereka dari repositori jarak jauh dan akan memiliki efek menguntungkan pada jumlah ruang kosong pada komputer tempat mereka dimuat. Mari kita bicara tentang cara mengurangi ukurannya.


Alih-alih bagel dan donat, sekarang kita akan makan sayuran hijau

Salah satu cara untuk mengurangi ukuran gambar adalah dengan hati-hati memilih gambar dasar dan penyesuaian selanjutnya.

Sebagai contoh, gambar dasar Alpine adalah distribusi lengkap dari OS mirip Linux, yang berisi minimal paket tambahan. Ukurannya sekitar 5 megabyte. Namun, membangun gambar Anda sendiri berdasarkan Alpine akan membutuhkan banyak waktu untuk melengkapinya dengan segala yang diperlukan untuk memastikan pengoperasian aplikasi tertentu.

Ada juga versi khusus gambar dasar Alpine. Sebagai contoh, gambar yang sesuai dari repositori python ke mana naskah print("hello world") dikemas beratnya sekitar 78,5 MB. Berikut adalah Dockerfile untuk membuat gambar seperti itu:

 FROM python:3.7.2-alpine3.8 COPY . /app ENTRYPOINT ["python", "./app/my_script.py", "my_var"] 

Pada saat yang sama, Hub Docker mengatakan bahwa gambar dasar ini memiliki ukuran 29 MB. Ukuran gambar berdasarkan gambar dasar ini ditingkatkan dengan mengunduh dan menginstal Python.

Selain menggunakan gambar dasar berdasarkan Alpine, Anda dapat mengurangi ukuran gambar melalui penggunaan teknologi perakitan multi-tahap.

▍ Rangkaian gambar bertingkat


Dockerfile, yang menjelaskan perakitan multi-tahap gambar, menggunakan beberapa instruksi FROM . Pencipta gambar seperti itu dapat mengatur penyalinan selektif dari file yang disebut build artifacts dari satu level build ke level build lainnya. Pada saat yang sama, menjadi mungkin untuk menyingkirkan semua yang tidak diperlukan dalam gambar yang sudah jadi. Berkat metode ini, Anda dapat mengurangi ukuran gambar yang sudah jadi.

Inilah cara kerja setiap pernyataan FROM :

  • Dia memulai langkah membangun baru.
  • Itu tidak tergantung pada apa yang dibuat pada langkah build sebelumnya.
  • Dia dapat menggunakan gambar dasar yang berbeda dari yang digunakan pada langkah sebelumnya.

Berikut ini adalah contoh modifikasi dari Dockerfile dari dokumentasi Docker yang menggambarkan pembangunan multi-tahap.

 FROM golang:1.7.3 AS build WORKDIR /go/src/github.com/alexellis/href-counter/ RUN go get -d -v golang.org/x/net/html COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . FROM alpine:latest RUN apk --no-cache add ca-certificates WORKDIR /root/ COPY --from=build /go/src/github.com/alexellis/href-counter/app . CMD ["./app"] 

Harap perhatikan bahwa kami memberi nama tahap pertama majelis, dengan menyebutkannya setelah pernyataan FROM . Kami merujuk ke fase build bernama dalam COPY --from= di bawah ini di Dockerfile.

Penggunaan proses perakitan gambar multi-tahap masuk akal dalam beberapa kasus ketika Anda harus membuat banyak wadah untuk lingkungan produksi. Perakitan multistage memungkinkan Anda meminimalkan ukuran gambar yang sudah jadi. Namun terkadang pendekatan ini mempersulit dukungan gambar. Oleh karena itu, Anda mungkin tidak akan menggunakan rakitan multi-tahap gambar dalam kasus-kasus di mana Anda dapat melakukannya tanpa itu. Anda dapat membaca tentang fitur-fitur teknologi ini di sini dan di sini .

Seperti yang Anda lihat, perakitan multi-tahap adalah teknologi yang menarik, tetapi tidak cocok untuk semua kasus. Cara yang sama untuk mengurangi ukuran gambar, yang akan kita bahas di bawah ini, dapat direkomendasikan untuk semua orang.

▍ .dockerignore file


Benar-benar semua orang yang ingin mempelajari Docker perlu tahu tentang file .dockerignore . File-file ini mirip dengan file .gitignore . Mereka berisi daftar file dan folder, dalam bentuk nama atau template yang harus diabaikan Docker selama perakitan gambar.

File ini ditempatkan di tempat Dockerfile berada, dan semua hal lain yang termasuk dalam konteks unit gambar.

Ketika Anda menjalankan docker build , yang memulai perakitan gambar, Docker memeriksa folder untuk keberadaan file .dockerignore di dalamnya. Jika file seperti itu dapat ditemukan, maka file ini diuraikan, dan aturan Match() berfungsi dari paket Go filepath dan beberapa aturan Docker sendiri digunakan untuk menentukan daftar file yang akan diabaikan.

Jadi, misalnya, jika Templat formulir *.jpg ditemukan di file .dockerignore , maka saat membuat gambar, file dengan nama apa pun dan dengan ekstensi .jpg akan diabaikan. Jika videos string videos di file, sistem akan mengabaikan folder videos dan semua kontennya.

Saat mengompilasi file .dockerignore , Anda dapat berkomentar menggunakan simbol # .

Inilah yang diberikan oleh file .dockerignore kepada siapa pun yang membuat gambar Docker:

  • Ini memungkinkan Anda untuk mengecualikan dari file gambar yang berisi informasi sensitif seperti login dan kata sandi.
  • Ini memungkinkan Anda untuk mengurangi ukuran gambar. Semakin kecil file dalam gambar, semakin kecil ukurannya dan semakin cepat untuk bekerja dengannya.
  • Ini memungkinkan untuk mengurangi jumlah alasan untuk membatalkan cache ketika merakit gambar yang serupa. Sebagai contoh, jika selama pemasangan kembali gambar beberapa file layanan dari proyek berubah, seperti file log, karena data yang disimpan dalam cache, pada dasarnya, tidak valid tidak valid, ini memperlambat perakitan gambar.

.dockerignore dapat membaca lebih lanjut tentang file .dockerignore di dokumentasi Docker.

Penelitian ukuran gambar


Mari kita bicara tentang cara menggunakan alat-alat baris perintah untuk mengetahui ukuran gambar dan wadah Docker.

  • Untuk mengetahui perkiraan ukuran wadah yang sedang berjalan, Anda dapat menggunakan perintah dari docker container ls -s bentuk docker container ls -s .
  • Perintah docker image ls menampilkan ukuran docker image ls .
  • Anda dapat menggunakan docker image history my_image:my_tag mengetahui ukuran gambar perantara dari mana gambar tertentu dirakit.
  • Gambar docker image inspect my_image:tag memungkinkan Anda menemukan informasi terperinci tentang gambar, termasuk ukuran setiap lapisannya. Lapisan sedikit berbeda dari gambar perantara yang membentuk gambar selesai, tetapi, dalam kebanyakan kasus, mereka dapat dianggap sebagai entitas yang identik. Berikut adalah beberapa bahan yang bagus tentang detail struktur internal gambar Docker.
  • Untuk memeriksa isi kontainer, Anda dapat menginstal paket menyelam .

Sekarang kita telah membahas kemungkinan mengurangi ukuran gambar, saya membawa delapan rekomendasi kepada Anda mengenai pengurangan ukuran gambar dan mempercepat proses pemasangannya.

Rekomendasi untuk mengurangi ukuran gambar dan mempercepat proses perakitan


  1. Kapan pun memungkinkan, gunakan gambar resmi sebagai gambar dasar. Gambar resmi diperbarui secara berkala, lebih aman daripada gambar informal.
  2. Untuk mengumpulkan gambar seringkas mungkin, gunakan gambar dasar berdasarkan Alpine Linux.
  3. Jika Anda menggunakan apt , gabungkan perintah apt-get update dan apt-get install dalam satu pernyataan RUN . Selain itu, gabungkan perintah instalasi paket menjadi satu instruksi. Daftar paket-paket berdasarkan abjad pada banyak baris, pisahkan daftar dengan \ . Misalnya, mungkin terlihat seperti ini:

     RUN apt-get update && apt-get install -y \   package-one \   package-two \   package-three && rm -rf /var/lib/apt/lists/* 

    Metode ini mengurangi jumlah lapisan yang harus ditambahkan ke gambar, dan membantu menjaga kode file dalam bentuk yang layak.
  4. Sertakan konstruk seperti && rm -rf /var/lib/apt/lists/* di akhir pernyataan RUN yang digunakan untuk menginstal paket. Ini akan menghapus cache yang apt dan akan membuatnya tidak disimpan di lapisan yang dibentuk oleh perintah RUN . Rincian tentang ini dapat ditemukan di dokumentasi .
  5. Gunakan kemampuan cache Anda dengan bijaksana dengan menempatkan perintah di Dockerfile yang sangat mungkin berubah di dekat akhir file.
  6. Gunakan file .dockerignore .
  7. Lihatlah dive , alat hebat untuk menjelajahi gambar Docker yang membantu mengurangi ukurannya.
  8. Jangan menginstal paket yang bisa dikeluarkan.

Ringkasan


Sekarang Anda tahu cara membuat gambar Docker cepat berkumpul, memuat dengan cepat dari repositori dan tidak memakan terlalu banyak ruang komputer. Lain kali kita akan berbicara tentang tim Docker.

Pembaca yang budiman! Apakah Anda mengalami masalah dengan mekanisme caching saat membuat gambar Docker?

Source: https://habr.com/ru/post/id440658/


All Articles