すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:Docker コンテナーでの eRDMA の有効化

最終更新日:Jan 28, 2026

eRDMA (Elastic Remote Direct Memory Access) は、高性能なネットワーク通信技術です。Docker コンテナーで eRDMA を使用すると、アプリケーションはオペレーティングシステムカーネルをバイパスして、ホストの物理 eRDMA デバイスに直接アクセスできます。これにより、データ転送が高速化され、通信効率が向上します。これは、コンテナー内で大規模なデータ転送と高性能なネットワーク通信を必要とするシナリオに適しています。このトピックでは、Docker コンテナーで eRDMA を設定する方法について説明します。また、eRDMA Controller コンポーネントを使用して、自己管理型 Kubernetes クラスターの Pod に eRDMA を迅速に設定する方法についても説明します。

制限事項

eRDMA 機能は、次の Docker イメージでのみサポートされています。

  • Alibaba Cloud Linux 3、Ubuntu 22.04、および Ubuntu 24.04 のイメージソース (ARM および x86 インスタンスの両方でサポート)

  • Alibaba Cloud Linux 2、CentOS 7、CentOS 8、Ubuntu 18.04、Ubuntu 20.04、および Ubuntu 24.04 のイメージソース (x86 インスタンスでのみサポート)

説明

Anolis OS のイメージソースはサポートされていません。

仕組み

コンテナー環境で eRDMA 機能を使用するには、Docker の --device オプションを使用して、/dev/infiniband/rdma_cm および /dev/infiniband/uverbsX キャラクターデバイスをコンテナーにマッピングします。これにより、コンテナー内のユーザーモードプログラムは、オペレーティングシステムカーネルをバイパスして eRDMA デバイスに直接アクセスし、データを送受信できます。

  • /dev/infiniband/rdma_cm:eRDMA 接続管理用のキャラクターデバイスです。ユーザーモードプログラムは、このキャラクターデバイスに対して操作を実行して、eRDMA デバイスとの接続を確立、破棄、および管理できます。これらの操作には、接続の作成と破棄、および接続イベントの送受信が含まれます。

  • /dev/infiniband/uverbsX:ユーザースペースの eRDMA 操作用のキャラクターデバイスです。ユーザーモードプログラムは、このキャラクターデバイスに対して操作を実行して、eRDMA デバイスと通信できます。これらの操作には、デバイスのオープン、eRDMA 通信エンドポイントの作成と破棄、およびメモリバッファーの登録と登録解除が含まれます。

    説明

    /dev/infiniband/uverbsX において、X はデバイスインデックス番号であり、システムや構成によって異なる場合があります。ls /dev/infiniband | grep uverbs コマンドを実行して、キャラクターデバイス名を表示できます。

Docker コンテナーでの eRDMA の設定

ステップ 1:インスタンスの eRDMA の設定

Docker が配置されているインスタンスタイプが eRDMA をサポートしていることを確認します。また、Elastic RDMA Interface がアタッチされ、eRDMA ドライバーがデプロイされ、eRDMA デバイスが正常に動作していることを確認します。

ステップ 2:(任意) インスタンスへの Docker のデプロイ

インスタンスに Docker がデプロイされていない場合は、インストールします。

次の手順に従います。

  1. インスタンスにリモート接続します。

    詳細については、「ワークベンチを使用して Linux インスタンスにログオンする」をご参照ください。

  2. 次のコマンドを実行して、インスタンスに Docker 環境がデプロイされているかどうかを確認します。

    sudo docker -v

    Docker が正しくデプロイされている場合、次の図に示すように、特定のバージョン番号が返されます。

    image

    Docker がデプロイされていないか、エラーが発生した場合、次の結果が表示されることがあります。この場合は、「インスタンスへの Docker のデプロイ」をご参照ください。

    image

  3. インスタンスに Docker をデプロイします。

ステップ 3:(任意) Docker 用イメージのデプロイ

Docker 環境にイメージがない場合は、必要に応じてデプロイします。

このトピックでは、Alibaba Cloud Linux ベースイメージを例として、Docker で Alibaba Cloud Linux イメージをダウンロードする方法を示します。この操作にはインターネットアクセスが必要です。

次の手順に従います。

  1. Docker と Docker Compose のインストールと使用

  2. 次のコマンドを実行して、Alibaba Cloud Linux Docker イメージをプルします。

    sudo docker pull alibaba-cloud-linux-<image_version>-registry.<region_ID>.cr.aliyuncs.com/alinux<image_version>/alinux<image_version>:<TAG>
    • <image_version>:Alibaba Cloud Linux のバージョン (例:2 または 3)。

    • <region_ID>:イメージのリージョン ID (例:cn-hangzhou)。

    • (任意) <TAG>:Docker イメージのタグ。指定した場合、Docker は対応するバージョンをプルします。省略した場合、Docker は最新バージョンをプルします。

    イメージのリージョンとタグ情報の検索

    1. Container Registry - アーティファクトセンター に移動します。

    2. [alinux2/alinux2] または [alinux3/alinux3] をクリックして、Alibaba Cloud Linux 2 および Alibaba Cloud Linux 3 の Docker イメージのタグ情報を表示します。

      たとえば、次の図は Alibaba Cloud Linux 3 Docker イメージの詳細を示しています。① はイメージのリージョン、② はイメージのタグを示しています。

      image.png

    コマンドの例:

    • cn-hangzhou リージョンで、Alibaba Cloud Linux 3 Docker イメージの 220901.1 タグをプルします。

      sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3:220901.1
    • cn-hangzhou リージョンで、最新の Alibaba Cloud Linux 2 Docker イメージをプルします。

      sudo docker pull alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2
  3. イメージのプルを確認します。

    sudo docker images

    次のサンプル出力は、Alibaba Cloud Linux 3 Docker イメージの 220901.1 タグと最新の Alibaba Cloud Linux 2 Docker イメージが正常にプルされたことを示しています。

    image.png

ステップ 4:コンテナーの起動と eRDMA デバイスのアタッチ

Docker の --device オプションを使用して、/dev/infiniband/rdma_cm および /dev/infiniband/uverbsX キャラクターデバイスをコンテナーにマッピングできます。これにより、コンテナー内のユーザーモードプログラムは、オペレーティングシステムカーネルをバイパスして eRDMA デバイスに直接アクセスし、データを送受信できます。詳細については、「仕組み」をご参照ください。

次の手順に従います。

  1. ECS インスタンスにリモート接続します。

    詳細については、「ワークベンチを使用して Linux インスタンスにログオンする」をご参照ください。

  2. 次のコマンドを実行して Docker コンテナーインスタンスを起動し、eRDMA キャラクターデバイスをコンテナーにマッピングします。

    sudo docker run --net=host --device=/dev/infiniband/uverbsX --device=/dev/infiniband/rdma_cm --ulimit memlock=-1 -t -i <IMAGE ID> /bin/bash

    パラメーターは次のとおりです。

    • --net=host:コンテナーの通信モードを host に設定します。コンテナー内のアプリケーションは、ホストのネットワークインターフェースとネットワーク構成を直接使用できます。これにより、ホストと同じネットワーク通信機能が提供されます。

    • --device=/dev/infiniband/uverbsX および --device=/dev/infiniband/rdma_cm:eRDMA ユーザーモードのキャラクターデバイスをコンテナーに公開します。

      次のコマンドを実行して、キャラクターデバイス名 ( uverbsX の X) を表示します。

      ls /dev/infiniband | grep uverbs

      image

    • --ulimit memlock=-1maxlockedmemoryunlimited に設定します。これは、非 root ユーザーがロックできるメモリ量に制限がないことを意味します。これにより、eRDMA アプリケーションが非 root ユーザーによって実行されたときに必要なメモリ量をロックでき、eRDMA 機能を効果的に使用できるようになります。

    • <IMAGE ID>:これを Docker イメージの ID に置き換えます。sudo docker images コマンドを実行して、イメージ ID を表示できます。

      次のコマンドを実行して、ターゲットイメージ ID を表示します。

      sudo docker images

      この例では、「ステップ 3」でデプロイされた Alibaba Cloud Linux イメージが使用されます。コマンドの出力は次のとおりです。

      image

    コマンドの例

    sudo docker run --net=host --device=/dev/infiniband/uverbs0 --device=/dev/infiniband/rdma_cm --ulimit memlock=-1 -t -i e8d9a60b6967 /bin/bash

ステップ 5:Docker コンテナー用の eRDMA ドライバーパッケージのデプロイ

コンテナーで eRDMA を使用するには、eRDMA ユーザーモードドライバーパッケージもデプロイする必要があります。そうしないと、コンテナー内から eRDMA デバイス情報を検出できません。Alibaba Cloud は、必要なパッケージを簡単にデプロイできるように、yum および apt ソースを提供しています。

次の手順に従います。

  1. インスタンスにリモート接続します。

    詳細については、「ワークベンチを使用して Linux インスタンスにログオンする」をご参照ください。

  2. ターゲットコンテナーに入ります。

    ステップ 4」のコマンドを例のように実行した場合、すでに Docker コンテナー内にいます。「コンテナーにユーザーモードドライバーパッケージをインストールする」に進むことができます。

    1. 次のコマンドを実行して、ターゲットコンテナー ID を表示します。

      sudo docker ps

      この例では、「ステップ 4」で開始されたコンテナーを使用します。コマンドの出力は次のとおりです。

      image

    2. 次のコマンドを実行して、コンテナーに入ります。

      sudo docker exec -it <CONTAINER ID> /bin/bash

      CONTAINER ID を、前のステップで取得したターゲットコンテナー ID に置き換えます。

  3. コンテナーに入った後、ユーザーモードドライバーパッケージをインストールします。

    重要

    次の例では、http://mirrors.cloud.aliyuncs.com は内部ソースアドレスです。インターネット経由でソースにアクセスするには、http://mirrors.cloud.aliyuncs.comhttps://mirrors.aliyun.com に置き換えてください。インターネットを使用するとインターネットトラフィックが発生し、追加料金が発生する場合があります。インターネットトラフィックの課金ルールの詳細については、「パブリック帯域幅の課金」をご参照ください。

    CentOS 7/CentOS 8

    1. コンテナーで次のコマンドを実行して、/etc/yum.repos.d フォルダーに erdma.repo ソースファイルを作成します。

      sudo vim /etc/yum.repos.d/erdma.repo
    2. 次の内容を erdma.repo ファイルに追加して、ファイルを保存します。

      [erdma]
      name = ERDMA Repository
      baseurl = http://mirrors.cloud.aliyuncs.com/erdma/yum/redhat/$releasever/erdma/$basearch/
      gpgcheck = 1
      enabled = 1
      gpgkey = http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY
    3. 次のコマンドを実行して、yum ソースキャッシュを更新します。

      sudo yum makecache
    4. 次のコマンドを実行して、ユーザーモードドライバーパッケージをインストールします。

      sudo yum install  libibverbs rdma-core librdmacm libibverbs-utils -y 

    Alibaba Cloud Linux

    1. コンテナーで次のコマンドを実行して、リポジトリを追加します。

      sudo yum-config-manager \
       --add-repo \
       http://mirrors.cloud.aliyuncs.com/erdma/yum/alinux/erdma.repo
      説明

      コンテナーに yum-config-manager コマンドがインストールされていない場合は、sudo yum install -y yum-utils を実行して yum-utils パッケージをインストールします。yum-config-manager は yum-utils パッケージの一部であり、yum 構成の管理に使用されます。

    2. 次のコマンドを実行して、yum ソースキャッシュを更新します。

      sudo yum makecache
    3. 次のコマンドを実行して、ユーザーモードドライバーパッケージをインストールします。

      sudo yum install  libibverbs rdma-core librdmacm libibverbs-utils -y

    Ubuntu 18.04/20.04/22.04/24.04

    1. コンテナーで次のコマンドを実行して、PGP 署名を追加します。

      • Ubuntu 18.04/Ubuntu 20.04

        wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo apt-key add -
      • Ubuntu 22.04/24.04

        wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg
    2. 次のコマンドを実行して、apt ソースを追加します。

      • Ubuntu 18.04

        echo "deb [ arch=amd64 ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu bionic/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
      • Ubuntu 20.04

        echo "deb [ arch=amd64 ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu focal/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
      • Ubuntu 22.04

        echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu jammy/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
      • Ubuntu 24.04

        echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu noble/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
    3. 次のコマンドを実行して、apt ソースを更新します。

      sudo apt update
    4. 次のコマンドを実行して、ユーザーモードドライバーをインストールします。

      sudo apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 -y 
  4. 次のコマンドを実行して、コンテナー内から eRDMA デバイス情報を表示します。

    ibv_devinfo

    image

    出力から、コンテナー内から eRDMA デバイスを検出できることが確認できます。

Docker コンテナーで eRDMA を設定した後、SMC-R または NetACC を使用してコンテナー内の TCP アプリケーションに eRDMA を統合し、アプリケーションの高速化を実現できます。詳細については、「アプリケーション適応の概要」をご参照ください。

eRDMA Controller を使用した自己管理型 Kubernetes クラスターへの eRDMA Pod のデプロイ

ステップ 1:eRDMA Controller のインストール

  1. マスターノードで次のコマンドを実行して、Helm をインストールします。

    このツールは、eRDMA Controller コンポーネントのインストールとアンインストールを管理するために使用されます。インストール後、helm version を実行して、Helm がインストールされていることを確認します。
    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
  2. マスターノードで次のコマンドを実行して、eRDMA Controller のソースコードをダウンロードします。

    git clone https://github.com/AliyunContainerService/alibabacloud-erdma-controller.git
  3. eRDMA Controller のインストール構成ファイルは deployment/helm/values.yaml です。このファイルを変更して、動作モードを選択し、関連パラメーターを設定できます。2 つの動作モードがサポートされています。

    • 通常モード:このモードは、eRDMA Controller が Elastic RDMA Interface (ERI) を自動的に管理し、eRDMA リソースを動的に割り当てる必要があるシナリオに適しています。

    • ローカルモード:このモードは、eRDMA 環境がすでに Kubernetes ノードに準備されており、eRDMA デバイスが Pod に公開されているシナリオに適しています。このモードでは、eRDMA リソースの動的な管理は行われません。

    構成項目:

    • localERIDiscovery:コントローラーの動作モードを設定します。

      • true:ローカルモード。

      • false:通常モード (デフォルト)。

    • credentials:通常モードでは、コントローラーは Alibaba Cloud API にアクセスして ECS インスタンスと ENI をクエリおよび設定する必要があります。したがって、まず RAM ロールを作成し、必要な権限を付与する必要があります。

      現在、AccessKey 認証がサポートされています。typeaccess_key に設定し、AccessKey ID とシークレットを入力します。

      credentials:
        type: "access_key"
        accessKeyID: "{access key}"
        accessKeySecret: "{access key secret}"

      ローカルモードでは、この項目を設定する必要はありません。

    • preferDriver:ノードで使用される eRDMA ドライバータイプを設定します。

      • default:デフォルトのドライバーモード。

      • compat:RoCE 互換ドライバーモード。

      • ofed:OFED ベースのドライバーモード。GPU インスタンスタイプに適しています。

    • allocateAllDevices:通常モードでのデバイス割り当てポリシーを設定します。

      • true:ノード上のすべての eRDMA デバイスを Pod に割り当てます。

      • false:NUMA トポロジーに基づいて 1 つの eRDMA デバイスを Pod に割り当てます。

    • exposedLocalERIs:ローカルモードで Pod に公開する必要があるノード上の eRDMA デバイスを設定します。構成フォーマットについては、例をご参照ください。

      exposedLocalERIs:
        - i-XXX erdma_0/erdma_1 # specify instance ID and erdma devices(erdma_0/erdma_1) to expose
        - i-* erdma_0           # specify erdma devices(erdma_0) to expose for all unspecified nodes
        - i-* erdma_*           # expose all existing erdma devices for all unspecified nodes
    • イメージ構成:デフォルトの erdma-agent イメージ (registry.aliyuncs.com/erdma/agent) はローカルモードをサポートしていません。ローカルモードを使用するには、エージェントイメージを自分でビルドし、カスタムイメージリポジトリにプッシュする必要があります。

      次のコマンドを実行して、イメージをビルドしてプッシュします。この例では、Alibaba Cloud Container Registry (ACR) を使用します。事前に名前空間とイメージリポジトリを作成する必要があります。

      docker build --tag <REGISTRY_NAME>-registry.<REGION_ID>.cr.aliyuncs.com/<NAMESPACE>/agent:<TAG> --target agent .
      
      docker push <REGISTRY_NAME>-registry.<REGION_ID>.cr.aliyuncs.com/<NAMESPACE>/agent:<TAG>
  4. helm を使用して erdma-controller コンポーネントをインストールします。

    helm install -f deploy/helm/values.yaml --namespace kube-system alibaba-erdma-controller deploy/helm/
  5. インストールを確認します。

    • 通常モードでのインストールが完了したら、erdma-agent および erdma-controller Pod が作成されていることを確認します。

      kubectl get pods -n kube-system | grep erdma

      ノード上の eRDMA デバイスリソースをクエリします。

      kubectl get erdmadevices
    • ローカルモードでは、erdma-agent Pod のみが作成されます。erdma-controller Pod は作成されません。したがって、erdmadevices リソースは利用できません。

ステップ 2:eRDMA ネットワークアクセラレーションをサポートする Pod の作成

  1. eRDMA ネットワークアクセラレーションをサポートする Pod を作成するには、コンテナーの resources.limits セクションで aliyun/erdma: 1 を宣言します。次の例は、サンプル構成を示しています。<ERDMA_POD_IMAGE> を、使用するコンテナーイメージのアドレスに置き換えます。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: erdma
      name: erdma
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: erdma
      template:
        metadata:
          labels:
            app: erdma
          annotations:
        spec:
          containers:
          - command:
            - sleep
            - "360000"
            image: <ERDMA_POD_IMAGE>
            name: erdma
            resources:
              limits:
                aliyun/erdma: 1
    SMC-R による透過的なアクセラレーションを有効にするには、network.alibabacloud.com/erdma-smcr: "true" アノテーションを追加します。この機能には、オペレーティングシステムが Alibaba Cloud Linux 3 で、カーネルバージョンが 5.10.134-17 以降である必要があります。
  2. 上記の構成ファイルに基づいて、次のコマンドを実行してデプロイメントをデプロイします。デプロイメントは、指定された数の Pod レプリカを開始します。

    kubectl apply -f example.yaml

参考

ACK クラスターで eRDMA を設定して使用する場合は、「ACK クラスターで eRDMA を使用してコンテナーネットワークを高速化する」をご参照ください。