概要
Docker Composeを使ってコンテナをデプロイした際に、利用できるCPUやメモリの量を制限する方法を紹介します。
環境
- Debian 11
- Docker 23.0.1
- Docker Compose 2.16.0
やりたいこと
私は、Dockerを利用して、ひとつのサーバーに複数のコンテナを実行しています。これによって、環境をしっかりと分けたまま複数のサービスをサーバーで実行しています。
あるとき、ひとつのコンテナがCPUやメモリをたくさん利用していた際に、他のコンテナで実行していたサービスが遅くなるということがありました。これは、ひとつのコンテナがサーバーのリソースをたくさん使ってしまったために起きたことです。そこで、そのようなリソースをたくさん使う可能性のあるコンテナのリソース使用に制限を与えて、このようなことが起きないようにしたいです。
私は、Dockerコンテナの作成にDocker Composeを利用しているのですが、このDocker Compose、ひいてはDockerにはCPUやメモリ使用を制限する機能があります。
今回は、この機能を利用してコンテナのCPUやメモリ使用の制限をする方法を説明します。
制限の方法
私は、Docker Composeを利用しているので、Docker Composeを利用した方法でリソースを制限する方法を説明します。
まず最初に、昔のDocker Composeでは、CPUやメモリの制限をすることはできませんでしたが、現在のバージョンのDocker Composeでは可能です。他の記事では、不可能などと書かれていることがありますが間違いです。
Docker ComposeでCPUやメモリの制限を加えるには次のようにします。ここでは、Minioのイメージを元にしたコンテナを利用していますが、あくまでも例ですので、適宜置き換えてください。
version: "3"
services:
minio:
image: quay.io/minio/minio
container_name: minio
command: server /data
ports:
- 9000:9000
- 9001:9001
logging:
options:
max-size: 10m
volumes:
- data:/data
deploy:
resources:
limits:
cpus: '1'
memory: '1g'
volumes:
data:
重要な部分はここです。
deploy:
resources:
limits:
cpus: '1'
memory: '1g'
cpusやmemoryで使用できるCPUやメモリの最大を指定しています。cpus: 1
はCPUコアを最大1つ使用するというものです。これは、1.1や1.5のように小数を利用することも可能です。memory: 1g
はメモリを最大1GB使用します。GBだけでなく512m
であれば512MBのように、MB単位でも指定可能です。
設定後は、Docker Composeを用いて再度コンテナを作成視します。設定に間違いが無ければこれで設定完了です。
メモリだけですが、次のコマンドで設定されているか確認できます。
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
c945112b6908 minio 12.71% 654.1MiB / 1GiB 63.88% 231MB / 85.1MB 25.2GB / 293MB 13
さいごに
Docker Composeは定期的にアップデートされているようで、どんどん便利になっています。
Dockerを利用したサーバーでは、CPUやメモリの使用制限は重要だと思います。
今回説明した方法が役に立てば嬉しいです。