Docker Compose - Had Memori

Docker Compose Memory Limits



Docker compose adalah utiliti yang hebat. Ini menjimatkan masa dan mengurangkan kesilapan ketika menggunakan aplikasi Dockerized anda. Biasanya, bukan idea yang bagus untuk menjalankan keseluruhan timbunan termasuk frontend, pelayan pangkalan data, dll dari dalam satu wadah tunggal.

Kami memungut bekas yang berlainan untuk menangani beban kerja aplikasi yang berbeza dan kami menggunakan Docker Compose untuk melakukan ini dengan mudah. Setiap beban kerja yang berbeza secara logik disenaraikan sebagai berbeza perkhidmatan . Contohnya, pelayan http frontend anda akan disenaraikan sebagai perkhidmatan frontend yang menjalankan Apache atau gambar Nginx sebagai wadah.







Semua perkhidmatan, keperluan rangkaian mereka, keperluan penyimpanan, dan lain-lain dapat ditentukan dalam fail docker-compose.yml. Kami akan memberi tumpuan untuk menentukan penggunaan memori di sini.



Anda memerlukan alat berikut di gudang senjata anda untuk mengikuti:



  1. Pemahaman asas mengenai Docker
  2. Docker untuk Windows atau Mac atau jika anda menjalankan Linux, DockerCE untuk Linux
  3. Docker Compose binar y (Pengguna Windows dan Mac sudah memasangnya)

Kami akan berpegang pada versi 2.4 untuk fail docker-compose.yml kami kerana menyokong versi 17.12 dan Docker Engine yang lebih tinggi dan lebih tinggi. Kita boleh menggunakan versi 3 yang lebih baru tetapi tidak menyokong sintaks had memori lama. Sekiranya anda cuba menggunakan sintaks yang lebih baru, sebaliknya, ia tetap menggunakan Docker dalam mod Swarm. Oleh itu, untuk memastikan perkara mudah bagi pengguna Docker biasa, saya akan berpegang pada versi 2.4





Sebilangan besar kod akan berfungsi sama untuk versi 3, dan di mana akan ada perbezaan, saya akan menyebutkan sintaks yang lebih baru untuk pengguna Docker Swarm.

Permohonan Contoh

Mari cuba dan jalankan perkhidmatan Nginx ringkas di port 80 menggunakan CLI pertama dan kemudian docker-compose.yml yang mudah. Pada bahagian seterusnya, kita akan meneroka batasan dan penggunaan memori dan mengubah mod docker-compose.yml kami untuk melihat bagaimana batasan khusus dikenakan.



Mari mulakan pelayan nginx mudah menggunakan Docker-CLI:

$ docker run -d --nama my-nginx -p80:80nginx: terkini

Anda dapat melihat pelayan nginx berfungsi dengan melawati http: // localhost atau menggantikan lcoalhost

Dengan alamat IP host Docker anda. Bekas ini berpotensi menggunakan keseluruhan memori yang ada di host Docker anda (dalam kes kami kira-kira 2GB). Untuk memeriksa penggunaan memori, antara lain, kita dapat menggunakan perintah:

$ docker statistik my-nginx

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

PENGGUNAAN / BATAS MEM berada pada 2.133MiB daripada jumlah 1.934GiB. Mari keluarkan bekas ini dan mulakan penulisan skrip penggabungan dok.

$ docker menghentikan my-nginx
$ pelabur rm my-nginx

Fail ym yang setara

Bekas tepat seperti di atas dapat dibuat jika kita mengikuti langkah-langkah berikut:

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

Kami membuat direktori kosong baru dan membuat file docker-compose.yml di dalamnya. Apabila kita akan menjalankan penggabungan dok dari direktori ini, ia akan mencari fail khusus ini (mengabaikan yang lain) dan membuat penyebaran kita dengan sewajarnya. Tambahkan isi berikut di dalam fail .yml ini.

versi:'3'
perkhidmatan:
my-nginx:
gambar: nginx: terkini
pelabuhan:
-'80: 80 '

$ docker-compose up -d

Bendera -d ditambahkan supaya bekas yang baru dibuat berjalan di latar belakang. Jika tidak, terminal akan melekat pada bekas dan mula mencetak laporan dari situ. Sekarang kita dapat melihat statistik wadah yang baru dibuat:

$ statistik pelabuhan -semua

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

Anda akan melihat bahawa bekas serupa seperti sebelumnya telah dibuat dengan had memori yang serupa dan penggunaannya. Dari direktori yang sama yang mengandungi fail yml. Jalankan arahan berikut untuk menghapus wadah yang baru dibuat, bersama dengan rangkaian jambatan pelanggan yang telah dibuat.

$dok mengarang

Ini akan mengembalikan pelabuhan ke keadaan bersih dengan pengecualian dari jumlah jilid yang dibuat (kami tidak membuatnya sehingga tidak menjadi perhatian.)

Had Memori dan Tempahan Memori

Had Memori dan Tempahan Memori adalah dua aspek yang berbeza untuk memastikan kelancaran aplikasi anda dan hos Docker yang anda jalankan di atas.

Secara garis besar, Had Memori membebankan had atas jumlah memori yang berpotensi digunakan oleh bekas Docker. Secara lalai wadah Docker, seperti proses sistem lain, dapat menggunakan keseluruhan memori yang tersedia dari host Docker. Ini boleh menyebabkan Pengecualian Memori dan sistem anda mungkin rosak. Walaupun tidak pernah berlaku, proses ini masih boleh berlapar (termasuk bekas lain) dari sumber yang berharga, sekali lagi merosakkan prestasi. Had Memori memastikan bahawa bekas yang lapar sumber tidak melebihi had tertentu. Ini mengehadkan radius letupan aplikasi yang ditulis dengan buruk untuk beberapa kontena, bukan keseluruhan host.

Tempahan Memori, sebaliknya, kurang tegar. Apabila sistem kehabisan memori dan cuba mendapatkan semula sebahagiannya. Ia berusaha untuk mengurangkan penggunaan memori kontena pada atau di bawah had tempahan. Sekiranya terdapat banyak memori, aplikasi dapat berkembang hingga had memori yang sukar.

Untuk Meringkaskan:

  1. Had Memori: Had atas yang ketat untuk jumlah memori yang disediakan untuk bekas.
  2. Tempahan Memori: Ini harus ditetapkan sebagai jumlah memori minimum yang perlu dijalankan oleh aplikasi dengan betul. Oleh itu, ia tidak berlaku atau tidak berfungsi semasa sistem cuba mendapatkan semula sebahagian memori.

Sekiranya tempahan memori lebih besar daripada had memori, had memori lebih diutamakan.

Menentukan Had Memori dan Tempahan

Versi 2

Mari kembali ke docker-compose.yml yang kami tulis sebelumnya dan tambahkan had memori kepadanya. Ubah versi menjadi 2.4 kerana alasan yang dibincangkan di bahagian prasyarat.

versi:'2.4'
perkhidmatan:
my-nginx:
gambar: nginx: terkini
pelabuhan:
-'80: 80 '
mem_limit: 300m

Baris terakhir menetapkan had untuk perkhidmatan my-nginx hingga 300MiB. Anda boleh menggunakan k untuk KiB, dan g untuk GiB dan b hanya dengan bait. Walau bagaimanapun, nombor sebelum itu mestilah bilangan bulat. Anda tidak boleh menggunakan nilai seperti 2.4m, sebaliknya anda harus menggunakan 2400k. Sekarang jika anda menjalankan:

$ statistik pelayan --semua

NAMA ID CONTAINER CPU% MEM PENGGUNAAN / 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 bahawa had memori ditetapkan ke 300 MiB. Menetapkan tempahan memori juga mudah, cukup tambahkan mem_reservation baris: xxx pada akhir.

versi:'2.4'
perkhidmatan:
my-nginx:
gambar: nginx: terkini
pelabuhan:
-'80: 80 '
mem_limit: 300m
mem_reservation: 100m

Versi 3 (Pilihan)

Untuk menggunakan versi tiga, anda perlu menjalankan Docker dalam mod kawanan. Untuk Windows dan Mac anda boleh mengaktifkannya menggunakan menu tetapan Docker. Pengguna Linux perlu menjalankan runger swarm init. Maklumat lebih lanjut boleh didapati di sini . Itu bukan langkah yang perlu, dan jika anda belum mengaktifkannya, itu juga baik. Bahagian ini adalah untuk orang sudah berjalan dalam mod kawanan dan dapat memanfaatkan versi yang lebih baru.

versi:'3'
perkhidmatan:
my-nginx:
gambar: nginx: terkini
pelabuhan:
-'80: 80 '
menyebarkan:
sumber:
had:
ingatan: 300m
tempahan:
ingatan: 100m

Kami menentukan semua ini di bawah pilihan sumber. Had dan Tempahan menjadi kunci utama mereka sendiri dan memori hanyalah salah satu daripada banyak sumber yang dikendalikan di sini. CPU menjadi satu lagi parameter penting.

Maklumat lanjut

Anda boleh mengetahui lebih lanjut mengenai menulis-dok dari dokumentasi rasmi dihubungkan di sini . Sebaik sahaja anda mengetahui intinya bagaimana menulis fail tulis, dokumentasi dapat membantu anda dengan pelbagai parameter.

Anda tidak perlu mengetahui semuanya, cukup cari apa yang diperlukan oleh aplikasi anda dan rujukan akan membimbing anda dalam melaksanakannya.