Kami menerbitkan terjemahan baru dan berharap rekomendasi penulis akan membantu Anda mengoptimalkan gambar Docker Anda.
Sejak awal, Docker telah merevolusi cara kami menggunakan container. Ini terutama karena kesederhanaan yang disediakan Docker. Ini dapat digunakan bahkan tanpa memahami topik wadah yang kompleks.
Jika Anda baru mengenal Docker, Anda dapat memilih templat (gambar dasar) dan menentukan instruksi Anda (perintah Dockerfile) untuk meletakkan kode Anda di dalam gambar dan menjalankannya.
Kesederhanaan Docker akan membantu Anda dengan pekerjaan Anda sejak awal, dan keterampilan untuk mengoptimalkannya datang dengan pengalaman dan biasanya membutuhkan waktu.
Saya telah bekerja dengan Docker untuk waktu yang lama, jadi saya memutuskan untuk membagikan pengalaman saya tentang cara membuat container dengan lebih baik, bahkan jika Anda seorang pemula.
1. Tentukan unit cache ➱
Tahukah Anda bahwa setiap perintah RUN yang disertakan dalam Dockerfile memengaruhi tingkat caching?
Menggunakan beberapa perintah RUN untuk menginstal paket akan memengaruhi performa dan efisiensi proses build. Menggunakan satu perintah RUN untuk menginstal semua paket dan dependensi akan membantu Anda membuat satu unit cache, bukan beberapa.
RUN apt-get update && apt-get install -y \ aufs-tools \ automake \ build-essential \ curl \ dpkg-sig \ libcap-dev \ libsqlite3-dev \ mercurial \ reprepro \ ruby1.9.1 \ ruby1.9.1-dev \ s3cmd=1.1.*
2. Kurangi ukuran gambar
Ukuran gambar memainkan peran penting dalam membuat Dockerfile yang baik. Menggunakan gambar yang lebih kecil memfasilitasi penyebaran yang lebih cepat dan mengurangi potensi serangan.
Hapus ketergantungan yang tidak perlu
Hindari menginstal alat yang tidak perlu, seperti alat debugging, ke dalam image.
Jika manajer paket secara otomatis menggunakan paket yang direkomendasikan untuk diinstal, gunakan tanda manajer paket dan hindari menginstal dependensi yang tidak perlu.
RUN apt-get update && apt-get -y install --no-install-recommends
Tip: Bagikan komponen yang dapat digunakan kembali antar proyek menggunakan Bit ( Github ).
Bit memudahkan untuk mendokumentasikan, berbagi, dan menggunakan kembali komponen independen antar proyek. Gunakan untuk menggunakan kembali kode, menjaga konsistensi desain, kolaborasi tim, meningkatkan kecepatan pengiriman, dan membangun aplikasi yang dapat diskalakan.
Bit mendukung Node, TypeScript, React, Vue, Angular dan banyak lagi
Jelajahi komponen yang dipublikasikan di Bit.dev
3. Dukungan gambar
Memilih gambar dasar yang tepat untuk aplikasi Anda sangat penting.
Gunakan image Docker resmi
Menggunakan image Docker resmi mengurangi ukurannya dengan mengurangi dependensi yang tidak perlu yang membuat image lebih besar. Ada 3 manfaat utama menggunakan gambar resmi:
- memungkinkan kami menggunakan gambar berdasarkan praktik terbaik,
- memastikan keandalan gambar dan keamanannya,
- meningkatkan kepercayaan dan keamanan.
#
FROM node:13.12.0-alpine
#
WORKDIR /app
# `/app/node_modules/.bin` $PATH
ENV PATH /app/node_modules/.bin:$PATH
Gunakan tag khusus
Saat memilih gambar dasar, disarankan untuk menggunakan tag tertentu. Jangan gunakan tag terbaru untuk gambar . Tag Terbaru dapat mengalami perubahan yang dapat merusak seiring waktu.
#
FROM node:13.12.0-alpine
Gunakan versi build minimal. Build
minimal mengurangi ukuran gambar akhir. Ini membantu Anda menerapkan aplikasi dengan lebih cepat dan lebih aman.
Seperti yang Anda lihat dari contoh di atas, saat menggunakan build minimal, ukuran gambarnya lebih kecil. Kebanyakan gambar menggunakan perakitan alpine. Alpine adalah gambar yang sangat ringan dengan ukuran standar 2MB.
Dengan menggunakan gambar berbasis alpine, kami dapat mengurangi ukuran gambar yang dihasilkan secara signifikan.
4. Reproduksibilitas
Membangun dari sumber di lingkungan yang konsisten
Jika Anda menggunakan Docker, yang terbaik adalah membangun aplikasi Anda di lingkungan terkelola untuk menyediakan isolasi.
Kita harus menghindari membuat aplikasi secara lokal dan menambahkannya ke registri.
Jika tidak, paket yang Anda instal di lingkungan lokal Anda dapat mempengaruhi konsistensi gambar. Mungkin tidak ada yang mau berada dalam situasi ini, karena itu membahayakan salah satu keuntungan utama Docker - eksekusi yang konsisten di seluruh lingkungan.
Menggunakan majelis multi-tahap untuk menghapus dependensi Kami
menyarankan Anda menggunakan metode penyebaran aplikasi multi-tahap.
Ini menghilangkan penggunaan dependensi rakitan dalam wadah yang sedang berjalan.
Kita dapat membangun aplikasi menggunakan image build unik yang memiliki dependensi dev dan memindahkan biner yang dikompilasi ke dalam image container terpisah untuk menjalankannya.
# Stage 0, "build-stage", based on Node.js, to build and compile the frontend
FROM node:13.12.0 as build-stage
WORKDIR /app
COPY package*.json /app/
RUN npm install
COPY ./ /app/
RUN npm run build
# Stage 1, based on Nginx, to have only the compiled app, ready for production with Nginx
FROM nginx:1.15
COPY --from=build-stage /app/build/ /usr/share/nginx/html
Ada dua langkah terpisah di Dockerfile di atas. Tahap 0 digunakan untuk membangun aplikasi node dari image node asli, dan tahap 1 digunakan untuk menyalin file yang dikumpulkan dari image build ke image server web (Nginx) yang pada akhirnya melayani aplikasi.
Kesimpulan
Itu saja yang ingin saya sampaikan. Jika Anda baru mengenal Docker, saya sarankan untuk mencoba praktik ini saat membangun image pertama Anda. Ini akan membantu Anda memahami topik lebih dalam dan memungkinkan Anda menggunakan Docker secara efektif sejak hari pertama.
Jika Anda mengetahui praktik keren lainnya, bagikan di komentar. Terima kasih sudah membaca!