Penulisan Docker — Batas Memori

Docker Compose Memory Limits



Penulisan Docker adalah utilitas yang kuat. Ini menghemat waktu dan mengurangi kesalahan saat menerapkan aplikasi Dockerized Anda. Biasanya, bukan ide bagus untuk menjalankan seluruh tumpukan termasuk frontend, server database, dll dari dalam satu wadah tunggal.

Kami memutar container yang berbeda untuk menangani beban kerja aplikasi yang berbeda dan kami menggunakan Docker Compose untuk melakukan ini dengan mudah. Setiap beban kerja yang berbeda secara logis terdaftar sebagai yang berbeda melayani . Misalnya, server http frontend Anda akan terdaftar sebagai layanan frontend yang menjalankan gambar Apache atau Nginx sebagai wadah.







Semua layanan, kebutuhan jaringannya, persyaratan penyimpanan, dll dapat ditentukan dalam file docker-compose.yml. Kami akan fokus untuk menentukan penggunaan memori di sini.



Anda memerlukan alat berikut di gudang senjata Anda untuk mengikuti:



  1. Pemahaman dasar tentang Docker
  2. Docker untuk Windows atau Mac atau jika Anda menjalankan Linux, DockerCE untuk Linux
  3. Biner Tulis Docker y (Pengguna Windows dan Mac sudah menginstal ini)

Kami akan tetap menggunakan versi 2.4 untuk file docker-compose.yml kami karena mendukung versi 17.12 dan lebih tinggi dari Docker Engine dan lebih tinggi. Kami bisa menggunakan versi 3 yang lebih baru tetapi tidak mendukung sintaks batasan memori lama. Jika Anda mencoba menggunakan sintaks yang lebih baru, itu bersikeras menggunakan Docker dalam mode Swarm. Jadi agar masalah tetap sederhana bagi pengguna Docker biasa, saya akan tetap menggunakan versi 2.4





Sebagian besar kode akan bekerja sama untuk versi 3, dan di mana akan ada perbedaan, saya akan menyebutkan sintaks yang lebih baru untuk pengguna Docker Swarm.

Contoh Aplikasi

Mari kita coba dan jalankan layanan Nginx sederhana pada port 80 menggunakan CLI terlebih dahulu dan kemudian docker-compose.yml sederhana. Di bagian selanjutnya, kita akan menjelajahi batasan dan pemanfaatan memorinya dan memodifikasi docker-compose.yml kita untuk melihat bagaimana batasan kustom diterapkan.



Mari kita mulai server nginx sederhana menggunakan Docker-CLI :

$ docker run -d --name my-nginx -p80:80nginx: terbaru

Anda dapat melihat server nginx bekerja dengan mengunjungi http://localhost atau ganti lcoalhost

Dengan alamat IP dari host Docker Anda. Wadah ini berpotensi memanfaatkan seluruh memori yang tersedia di host Docker Anda (dalam kasus kami sekitar 2GB). Untuk memeriksa penggunaan memori, antara lain, kita dapat menggunakan perintah:

$ docker stats my-nginx

NAMA ID KONTAINER CPU % PENGGUNAAN MEM / BATAS MEM % NET I/O BLOCK I/O PIDS
6eb0091c0cf2 my-nginx0.00%2.133MiB / 1.934GiB0.11% 3.14kB / 2.13kB 0B / 0B2

MEM USAGE/LIMIT berada pada 2.133MiB dari total 1.934GiB. Mari kita hapus wadah ini dan mulai menulis skrip penulisan buruh pelabuhan.

$ docker hentikan my-nginx
$ buruh pelabuhan rm my-nginx

File ym setara

Wadah yang tepat seperti di atas dapat dibuat jika kita mengikuti langkah-langkah ini:

$ mkdir my-compose
$ cd my-compose
$ vim docker-compose.yml

Kami membuat direktori kosong baru dan membuat file docker-compose.yml di dalamnya. Ketika kami akan menjalankan docker-compose up dari direktori ini, ia akan mencari file khusus ini (mengabaikan yang lainnya) dan membuat penerapan kami sesuai dengan itu. Tambahkan konten berikut di dalam file .yml ini.

Versi: kapan:'3'
jasa:
my-nginx:
gambar: nginx:terbaru
port:
-'80:80'

$ docker-compose up -d

Bendera -d ditambahkan sehingga wadah yang baru dibuat berjalan di latar belakang. Jika tidak, terminal akan menempelkan dirinya ke kontainer dan mulai mencetak laporan darinya. Sekarang kita dapat melihat statistik dari container yang baru dibuat:

$ statistik buruh pelabuhan -semua

CONTAINER ID NAMA CPU% MEM PENGGUNAAN/BATAS MEM% NET I/O BLOK I/O PIDS
5f8a1e2c08ac my-compose_my-nginx_10.00% 2.25MiB/1.934GiB0.11% 1.65kB/0B 7.35MB/0B2

Anda akan melihat bahwa wadah serupa seperti sebelumnya dibuat dengan batas memori dan bahkan pemanfaatan yang sama. Dari direktori yang sama yang berisi file yml. Jalankan perintah berikut untuk menghapus wadah yang baru dibuat, bersama dengan jaringan jembatan pelanggan yang dibuat.

$docker-compose down

Ini akan mengembalikan buruh pelabuhan ke keadaan bersih dengan pengecualian volume apa pun yang dibuat (kami tidak membuatnya jadi itu bukan masalah.)

Batas Memori dan Reservasi Memori

Batas Memori dan Reservasi Memori adalah dua aspek berbeda untuk memastikan kelancaran fungsi aplikasi Anda dan host Docker yang Anda jalankan.

Secara garis besar, Batas Memori memberlakukan batas atas jumlah memori yang berpotensi dapat digunakan oleh wadah Docker. Secara default, wadah Docker, seperti proses sistem lainnya, dapat menggunakan seluruh memori yang tersedia dari host Docker. Ini dapat menyebabkan Out-of-Memory-Exception dan sistem Anda mungkin crash. Bahkan jika tidak pernah terjadi, itu masih bisa membuat proses lain kelaparan (termasuk wadah lain) dari sumber daya yang berharga, sekali lagi merusak kinerja. Batas Memori memastikan bahwa wadah yang haus sumber daya tidak melampaui batas tertentu. Ini membatasi radius ledakan aplikasi yang ditulis dengan buruk ke beberapa wadah, bukan seluruh host.

Reservasi Memori, di sisi lain, kurang kaku. Ketika sistem kehabisan memori dan mencoba untuk mendapatkan kembali sebagian darinya. Ini mencoba membawa konsumsi memori penampung pada atau di bawah batas reservasi. Namun, jika ada banyak memori, aplikasi dapat memperluas hingga batas memori yang disetel keras.

Untuk meringkas:

  1. Batas Memori: Batas atas yang ketat untuk jumlah memori yang tersedia untuk wadah.
  2. Reservasi Memori: Ini harus ditetapkan sebagai jumlah minimum memori yang dibutuhkan aplikasi untuk berjalan dengan benar. Jadi tidak crash atau salah tingkah ketika sistem mencoba untuk mendapatkan kembali sebagian dari memori.

Jika reservasi memori lebih besar dari batas memori, batas memori diutamakan.

Menentukan Batas Memori dan Reservasi

Versi 2

Mari kembali ke docker-compose.yml yang kita tulis sebelumnya dan tambahkan batas memori ke dalamnya. Ubah versi ke 2.4 untuk alasan yang dibahas di bagian prasyarat.

Versi: kapan:'2.4'
jasa:
my-nginx:
gambar: nginx:terbaru
port:
-'80:80'
mem_limit: 300m

Baris terakhir menetapkan batas untuk layanan my-nginx ke 300MiB. Anda dapat menggunakan k untuk KiB, dan g untuk GiB dan b hanya untuk byte. Namun, angka sebelumnya harus berupa bilangan bulat. Anda tidak dapat menggunakan nilai seperti 2,4m, Anda harus menggunakan 2400k sebagai gantinya. Sekarang jika Anda menjalankan:

$ status buruh pelabuhan --semua

CONTAINER ID NAMA CPU% MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
44114d785d0a my-compose_my-nginx_10.00% 2.141MiB/300MiB0,71% 1.16kB/0B 0B/0B2

Anda akan melihat bahwa batas memori diatur ke 300 MiB. Mengatur reservasi memori juga sama mudahnya, cukup tambahkan baris mem_reservation:xxx di bagian akhir.

Versi: kapan:'2.4'
jasa:
my-nginx:
gambar: nginx:terbaru
port:
-'80:80'
mem_limit: 300m
mem_reservasi: 100m

Versi 3 (Opsional)

Untuk menggunakan versi tiga, Anda harus menjalankan Docker dalam mode swarm. Untuk Windows dan Mac Anda dapat mengaktifkannya menggunakan menu pengaturan Docker. Pengguna Linux harus menjalankan docker swarm init. Informasi lebih lanjut tentang itu dapat ditemukan di sini . Ini bukan langkah yang perlu, dan jika Anda belum mengaktifkannya, tidak apa-apa juga. Bagian ini untuk orang-orang sudah berjalan dalam mode swarm dan dapat menggunakan versi yang lebih baru.

Versi: kapan:'3'
jasa:
my-nginx:
gambar: nginx:terbaru
port:
-'80:80'
menyebarkan:
sumber daya:
batas:
memori: 300m
reservasi:
memori: 100m

Kami mendefinisikan semua ini di bawah opsi sumber daya. Batas dan Reservasi menjadi kunci utama mereka sendiri dan memori hanyalah salah satu dari banyak sumber daya yang dikelola di sini. CPU menjadi parameter penting lainnya.

Informasi lebih lanjut

Anda dapat mempelajari lebih lanjut tentang docker-compose dari dokumentasi resmi ditautkan di sini . Setelah Anda mendapatkan inti dari cara menulis file penulisan, dokumentasi dapat membantu Anda dengan berbagai parameter spesifik.

Anda tidak perlu tahu semuanya, cukup cari apa yang dibutuhkan aplikasi Anda dan referensi akan memandu Anda dalam mengimplementasikannya.