概要

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やメモリの使用制限は重要だと思います。

今回説明した方法が役に立てば嬉しいです。