Docker Compose - Giới hạn bộ nhớ

Docker Compose Memory Limits



Docker soạn là một tiện ích mạnh mẽ. Nó tiết kiệm thời gian và giảm lỗi khi triển khai ứng dụng Dockerized của bạn. Thông thường, không phải là một ý tưởng tuyệt vời nếu chạy toàn bộ ngăn xếp bao gồm giao diện người dùng, máy chủ cơ sở dữ liệu, v.v. từ bên trong một vùng chứa duy nhất.

Chúng tôi xoay các vùng chứa khác nhau để xử lý các khối lượng công việc khác nhau của một ứng dụng và chúng tôi sử dụng Docker Compose để thực hiện việc này một cách dễ dàng. Mỗi khối lượng công việc khác nhau về mặt logic được liệt kê là một Dịch vụ . Ví dụ: máy chủ http giao diện người dùng của bạn sẽ được liệt kê là dịch vụ giao diện người dùng chạy Apache hoặc hình ảnh Nginx dưới dạng vùng chứa.







Tất cả các dịch vụ, nhu cầu mạng, yêu cầu lưu trữ, v.v. có thể được chỉ định trong tệp docker-compost.yml. Chúng tôi sẽ tập trung vào việc xác định việc sử dụng bộ nhớ ở đây.



Bạn cần các công cụ sau trong kho vũ khí của mình để làm theo:



  1. Hiểu biết cơ bản về Docker
  2. Docker dành cho Windows hoặc Mac hoặc nếu bạn đang chạy Linux, DockerCE dành cho Linux
  3. Docker Compose binar y (Người dùng Windows và Mac sẽ được cài đặt phần mềm này)

Chúng tôi sẽ gắn bó với phiên bản 2.4 cho các tệp docker-compo.yml của chúng tôi vì nó hỗ trợ phiên bản 17.12 trở lên của Docker Engine và cao hơn. Chúng tôi có thể đã sử dụng phiên bản 3 mới hơn nhưng nó không hỗ trợ cú pháp giới hạn bộ nhớ cũ. Nếu bạn cố gắng sử dụng cú pháp mới hơn, nó sẽ yêu cầu sử dụng Docker ở chế độ Swarm. Vì vậy, để đơn giản hóa vấn đề cho người dùng Docker thông thường, tôi sẽ gắn bó với phiên bản 2.4





Hầu hết mã sẽ hoạt động giống nhau cho phiên bản 3 và sẽ có sự khác biệt, tôi sẽ đề cập đến cú pháp mới hơn cho người dùng Docker Swarm.

Ứng dụng mẫu

Hãy thử và chạy một dịch vụ Nginx đơn giản trên cổng 80 trước tiên bằng cách sử dụng CLI và sau đó là docker-compile.yml đơn giản. Trong phần tiếp theo, chúng ta sẽ khám phá các giới hạn bộ nhớ và việc sử dụng nó cũng như sửa đổi docker-compost.yml của chúng tôi để xem các giới hạn tùy chỉnh được áp dụng như thế nào.



Hãy bắt đầu một máy chủ nginx đơn giản bằng Docker-CLI:

$ docker run -d --name my-nginx -p80:80nginx: mới nhất

Bạn có thể thấy máy chủ nginx hoạt động bằng cách truy cập http: // localhost hoặc thay thế lcoalhost

Với địa chỉ IP của máy chủ lưu trữ Docker của bạn. Vùng chứa này có khả năng sử dụng toàn bộ bộ nhớ có sẵn trên máy chủ Docker của bạn (trong trường hợp của chúng tôi là khoảng 2GB). Để kiểm tra việc sử dụng bộ nhớ, trong số những thứ khác, chúng ta có thể sử dụng lệnh:

$ docker thống kê my-nginx

CONTAINER ID TÊN CPU% MEM SỬ DỤNG / LIMIT 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 là 2.133MiB trong tổng số 1.934GiB. Hãy loại bỏ vùng chứa này và bắt đầu viết các tập lệnh do docker-soạn.

$ docker stop my-nginx
$ docker rm my-nginx

Tệp ym tương đương

Vùng chứa chính xác như trên có thể được tạo nếu chúng ta làm theo các bước sau:

$ mkdir soạn thư của tôi
$ cd soạn thư của tôi
$ vim docker-compo.yml

Chúng tôi tạo một thư mục trống mới và tạo một tập tin docker-compos.yml trong đó. Khi chúng tôi chạy docker-compile từ thư mục này, nó sẽ tìm kiếm tệp cụ thể này (bỏ qua mọi thứ khác) và tạo triển khai của chúng tôi cho phù hợp. Thêm nội dung sau vào bên trong tệp .yml này.

phiên bản:'3'
dịch vụ:
my-nginx:
hình ảnh: nginx: mới nhất
cổng:
-'80: 80'

$ docker-compile up -d

Cờ -d được thêm vào để các vùng chứa mới được tạo chạy trong nền. Nếu không, thiết bị đầu cuối sẽ tự gắn vào các thùng chứa và bắt đầu in báo cáo từ đó. Bây giờ chúng ta có thể thấy số liệu thống kê của (các) vùng chứa mới được tạo:

số liệu thống kê $ docker -all

CONTAINER ID TÊN CPU% MEM SỬ DỤNG / LIMIT MEM% NET I / O BLOCK I / O PIDS
5f8a1e2c08ac my-compos_my-nginx_10,00% 2,25MiB / 1,934GiB0,11% 1,65kB / 0B 7,35MB / 0B2

Bạn sẽ nhận thấy rằng một vùng chứa tương tự như trước đây đã được tạo với các giới hạn bộ nhớ tương tự và thậm chí cả việc sử dụng. Từ cùng một thư mục chứa tệp yml. Chạy lệnh sau để xóa vùng chứa mới được tạo, cùng với mạng cầu nối khách hàng đã được tạo.

$docker-soạn xuống

Điều này sẽ đưa docker về trạng thái sạch, ngoại trừ bất kỳ tập nào đã được tạo (chúng tôi không tạo bất kỳ tập nào nên điều đó không đáng lo ngại.)

Giới hạn bộ nhớ và đặt trước bộ nhớ

Giới hạn bộ nhớ và Dự trữ bộ nhớ là hai khía cạnh khác nhau để đảm bảo hoạt động trơn tru của các ứng dụng của bạn và máy chủ lưu trữ Docker mà bạn đang chạy trên đỉnh.

Nói chung, Giới hạn bộ nhớ áp đặt giới hạn trên cho số lượng bộ nhớ có thể được sử dụng bởi một vùng chứa Docker. Theo mặc định, một vùng chứa Docker, giống như bất kỳ quy trình hệ thống nào khác, có thể sử dụng toàn bộ bộ nhớ có sẵn của máy chủ Docker. Điều này có thể gây ra ngoại lệ hết bộ nhớ và hệ thống của bạn rất có thể gặp sự cố. Ngay cả khi nó không bao giờ đạt được điều đó, nó vẫn có thể bỏ đói quá trình khác (bao gồm cả các vùng chứa khác) khỏi các tài nguyên có giá trị, một lần nữa làm ảnh hưởng đến hiệu suất. Giới hạn bộ nhớ đảm bảo rằng các vùng chứa đói tài nguyên không vượt quá một giới hạn nhất định. Điều này giới hạn bán kính vụ nổ của một ứng dụng được viết kém ở một vài vùng chứa, không phải toàn bộ máy chủ.

Mặt khác, dự trữ bộ nhớ ít cứng nhắc hơn. Khi hệ thống sắp hết bộ nhớ và cố gắng khôi phục một số bộ nhớ. Nó cố gắng đưa mức tiêu thụ bộ nhớ của vùng chứa bằng hoặc thấp hơn giới hạn đặt trước. Tuy nhiên, nếu có nhiều bộ nhớ, ứng dụng có thể mở rộng đến giới hạn bộ nhớ cố định.

Tóm lại:

  1. Giới hạn bộ nhớ: Giới hạn trên nghiêm ngặt đối với dung lượng bộ nhớ được cung cấp cho một vùng chứa.
  2. Bảo lưu bộ nhớ: Điều này phải được đặt làm dung lượng bộ nhớ tối thiểu mà một ứng dụng cần để chạy đúng cách. Vì vậy, nó không bị lỗi hoặc hoạt động sai khi hệ thống đang cố gắng lấy lại một số bộ nhớ.

Nếu đặt trước bộ nhớ lớn hơn giới hạn bộ nhớ, thì giới hạn bộ nhớ sẽ được ưu tiên.

Chỉ định giới hạn bộ nhớ và dành riêng

Phiên bản 2

Hãy quay lại docker-compo.yml mà chúng ta đã viết trước đó và thêm giới hạn bộ nhớ cho nó. Thay đổi phiên bản thành 2.4 vì các lý do đã thảo luận trong phần điều kiện tiên quyết.

phiên bản:'2,4'
dịch vụ:
my-nginx:
hình ảnh: nginx: mới nhất
cổng:
-'80: 80'
mem_limit: 300m

Dòng cuối cùng đặt giới hạn cho dịch vụ my-nginx là 300MiB. Bạn có thể sử dụng k cho KiB, và g cho GiB và b cho chỉ byte. Tuy nhiên, số đứng trước nó phải là một số nguyên. Bạn không thể sử dụng các giá trị như 2,4m, thay vào đó bạn sẽ phải sử dụng 2400k. Bây giờ nếu bạn chạy:

$ docker stat - tất cả

CONTAINER ID TÊN CPU% MEM SỬ DỤNG / LIMIT MEM% NET I / O BLOCK I / O PIDS
44114d785d0a my-compos_my-nginx_10,00% 2.141MiB / 300MiB0,71% 1,16kB / 0B 0B / 0B2

Bạn sẽ nhận thấy rằng giới hạn bộ nhớ được đặt thành 300 MiB. Đặt bảo lưu bộ nhớ cũng dễ dàng như nhau, chỉ cần thêm một dòng mem_reservation: xxx vào cuối.

phiên bản:'2,4'
dịch vụ:
my-nginx:
hình ảnh: nginx: mới nhất
cổng:
-'80: 80'
mem_limit: 300m
mem_reservation: 100m

Phiên bản 3 (Tùy chọn)

Để sử dụng phiên bản ba, bạn cần chạy Docker ở chế độ bầy đàn. Đối với Windows và Mac, bạn có thể kích hoạt nó bằng menu cài đặt Docker. Người dùng Linux sẽ cần phải chạy docker swarm init. Có thể tìm thấy thêm thông tin về điều đó ở đây . Tuy nhiên, đây không phải là một bước cần thiết và nếu bạn chưa bật nó, điều đó cũng tốt. Phần này dành cho những người đã sẵn sàng chạy ở chế độ bầy đàn và có thể sử dụng phiên bản mới hơn.

phiên bản:'3'
dịch vụ:
my-nginx:
hình ảnh: nginx: mới nhất
cổng:
-'80: 80'
triển khai:
tài nguyên:
Hạn mức:
bộ nhớ: 300m
đặt chỗ:
bộ nhớ: 100m

Chúng tôi xác định tất cả điều này theo tùy chọn tài nguyên. Giới hạn và Bảo lưu trở thành khóa chính của riêng chúng và bộ nhớ chỉ là một trong nhiều tài nguyên đang được quản lý ở đây. CPU là một tham số quan trọng khác.

Thêm thông tin

Bạn có thể tìm hiểu thêm về trình soạn nhạc từ tài liệu chính thức liên kết ở đây . Khi bạn nắm được ý chính về cách viết một tệp soạn, tài liệu có thể giúp bạn với các thông số cụ thể khác nhau.

Bạn không cần phải biết mọi thứ, chỉ cần tìm kiếm những gì ứng dụng của bạn yêu cầu và tài liệu tham khảo sẽ hướng dẫn bạn thực hiện điều đó.